top of page

מושגים בתכנות מונחה עצמים

שפת ג'אווה היא שפה של מחלקות, לכן טבעי לבנות את המערכת בתכנות מונחה עצמים.

כל עצם (Object) הוא אובייקט של מחלקה (Class) מסויימת.

תחשבו על זה כמו דגם (מחלקה) של רכב מסויים שממנו יוצרים הרבה מכוניות (אובייקים / עצמים) כאלו.

לכל אובייקט יש תכונות (Attribute), כגון: צבע, משקל וכדומה, לכל תכונה יש ערך (Value), כגון: אדום, 400 ק"ג וכדומה.

כמו כן יש לו התנהגויות מסויימות (Function / Method), כגון: להדליק מנורה אדומה כשלוחצים על הבלם בכדי לעצור ועוד.

שלושת הדברים החשובים ביותר בתכנות מונחה עצמים, הם:

כימוס (Encapsulation):

זה בעצם לחסום גישה למשתני המחלקה מבחוץ, ישנם מספר הרשאות גישה (Modifier), אם לתת גישה לכולם (Public) או רק למחלקות היורשות (Protected) או רק בתוך המחלקה עצמה (Private).

ירושה (Inheritance):

זה אומר שאם צריך אובייקט שיש בו אותו תכונות, אלא שרוצים להוסיף לו תכונות והתנהגויות נוספות, מבצעים הרחבה (Extends) של מחלקת האב ויוצרים תת מחלקה היורשת ממנו את התכונות וההתנהגויות שלו.

לדוגמה: יונק יורש ממשפחת הבעלי חיים, דולפין הוא יונק ספציפי היורש מיונק.

רב צורתיות (Polymorphism):

זהו האפשרות לקבל בפונקציה מספר פרמטרים שונים, ממספר טיפוסים, אשר יש להם אותו אב, כך שעליהם מופעלת אותה פונקציה ולכל אחד ההתנהגות שלו שונה בהתאם לערכים שהוא מחזיק.

כגון: תרנגול וברווז הם בעלי חיים וניתן להפעיל עליהם את הפונקציה לאכול או להשמיע קול, אך כל אחד אוכל משהו אחר ועושה קול אחר.

איך זה נעשה?

על ידי השמה של תרנגול למצביע כללי יותר מסוג בעל חיים.

התכונות שניתן לעשות על האובייקט שהוא מסוג האב (בעל חיים), זה רק מה שיש לכל בעל חי (ואין אפשרות להגיע למתודה חדשה שהוגדרה אצל התרנגול). אך מצד שני, התכונות יקבלו את מה שהוגדר אצל התרנגול, לדוגמה: לקרוא קוקוריקו ולא סתם קריאה לא מוגדרת.

זה מביא אותנו לתכנות מונחה עצמים (עצם זה התרנגול העכשווי שהושם למצביע. ולא הבעל חיים שזה המצביע המופשט יותר, שמצביע לכתובת בזיכרון שהיא הבן היורש ממנו).

לסיכום: מודולריות וחלוקה למחלקות (modular) -> מביא לירושה של תתי מחלקות -> שמביא לרב צורתיות -> שמביא לתכנות מונחה עצמים!

עוד שני דברים חשובים, אשר תלויים אחד בשני בדרך כלל:

שחרור צימוד (Loose Coupling):

יש לנתק ככל האפשר קשר של מחלקה אחת לשניה, שנוי במחלקה אחת אינו צריך להשפיע חלילה על התנהגות של מחלקה השניה (זה עלול לקראות במקרה שהעתקנו התנהגויות ממחלקה אחרת, במקום ליצור תת מחלקה היורשת מהאב, שבמקרה כזה אם נשנה משהו במחלקת האב, נצטרך לשנות גם כן כאן וזה יוצר בעיות תחזוקה).

לכידות גבוהה (High Cohesion):

לעומת זאת בתוך המחלקה עצמה, צריך שיהיה קשר גבוה בין כל ההתנהגויות של המחלקה, שינוי באחד בהחלט ישפיע על ההתנהגות הכללית של האובייקט הנוצר ממנה (שאם אין קשר בין הדברים, מדוע לא לחלק את זה לשתי מחלקות שונות שכל אחד אחראי על משהו אחר).

נהוג ליצור לפני המחלקות, ממשקים (Interface) אשר קובעים ב-מה המחלקה תשתמש בשביל לממש את ההתנהגות של האובייקט, כללים אשר לפיהם ניצור את המחלקה. אין אפשרות ליצור ממנו אובייקטים באופן ישיר. זה לקבוע יכולת (Able) מסויימת שתהיה חייבת להתממש במחלקה המממשת אותו.

לעומת זאת, מחלקה תפקידה לממש (Implements) את הממשק ולקבוע איך ההתנהגויות יתבצעו בפועל.

פונקציה שימושיות הנוגעות לתכנות מונה עצמים:

instanceof - בדיקת אם הערך השני יורש מאותו מחלקה של הראשון. זה משמש לבדיקת תנאי שאם הוא קלס היורש ממחלקה מסויימת., אז יעשה משהון מסויים.

דוגמה: Animal instanceof Cat - הביטוי הזה בודק את האובייקט אשר הושם במשתנה מסוג חיה הוא אובייקט חיה מסוג חתולה (ולא סתם חיה כללית או שמא כלב), הביטוי מחזיר ערך בולאני בהתאם.

מושגים נוספים בתכנות מונחה עצמים:

הפשטה (Abstraction): לקבוע מחלקה גנרית, אשר מייצג רעיון של אובייקט אשר ישנם אובייקטים מפורטים אשר ממשים אותו. כמו רהיט שהוא רעיון כללי לשולחן או ספה שזה רהיט מוגדר. לדוגמה, אינטרפייס כללי אשר קובע מה היכולת ואיזה פונקציות ישנם אך עדיין לא נקבע מימוש, איך זה בדיוק יהיה (וכאן מגיע הפולימורפיזם).

בנאי (Constructor):

הוא הפונקציה אשר קובעת אילו פרמטרים יחוייבו לעבור למחלקה בזמן יצירת האובייקת ואחראית על אתחול ברירת המחדל של המשתנים השונים באובייקט.

העמסה (Overload):

לעיתים נרצה להעביר למחלקה בעת יצירתה סוגים שונים של פרמטרים, כיון שכך ניתן לקבוע סוגים שונים של בנאים, לדוגמה: בנאי ריק שלא מקבל פרמטר, בנאי שמקבל פרמטר מסוג מחרוזת, בנאי שמקבל פרמטר מסור מספר שלם, בנאי שמקבל שתי פרמטרים מסוג כזה או אחר וכדומה.

דריסה (Override):

כשאנחנו מבצעים תת מחלקה היורשת ממחלקה אחרת, אנחנו יכולים לדרוס את המימוש הקודם שהועבר אליה ממחלקת האב ולקבוע מימוש חדש למתודה. (ניתן בנוסף להנות גם מהמימוש של האבא על ידי הפעלת המתודה ()Super, ואז נקבל גם את הפונקציונליות המקורית בנוסף למימוש החדש).

המרה (Convert): כמבצעים השמה של משתנה שהוא מטיפוס מחלקת האב אל מחלקת הבן (downcasting), על מנת שהוא יהיה בן מפורש (Explicit) שיכול לפנות למתודות חדשות שהוגדרו במחלקת הבן ולא רק למתודות שהיו באב (שיורשו מהאב או שהתממשו אחרת מהאב)\

יש לבצע המרה למחלקת הבן (המרה נעשה על ידי כתיבת טיפוס המחלקה היורשת בתוך סוגריים עגולות, משמאל לביטוי אותו נשים מימין לאופרטור ההשמה =), על מנת שהמערכת תדע ששמנו אובייקט שהוא ממחלקת הבן (אשר יש לה תכונות והתנהגויות נוספות שאין במחלקת האב).

כי רק אב יכול להצביע לבן אך בן לא יכול להצביע לאב (שאין לו כלל את התכונות של הבן).

(זה אפשרי רק כשאנחנו יודעים מראש, שבעצם המצביע שהוא משתנה ממחלקת האב, מצביע (הושם אליו רפרנס - upcasting) לבן המסויים. כך שבעצם בתוך המשתנה ממחלקת האב מסתתר (Implicit) עצם שהוא הבן עצמו. אחרת מהיכן יכיר את הערכים והמתודות שנוצרו במחלקת הבן)

תבניות עיצוב (design patterns):

דרכים מובנות שעל ידי תכנון המערכת לפי תבנית תכנותית מסויימת, מונעים בעיות העלולות להתעורר בעתיד, כגון: תחזוק הקוד, עריכים שינויים בקלות ועוד.

דברים מעניינים בשפת ג'אווה:

1. ניתן להעביר לפונקציה מספר פרמטרים בלתי ידוע מראש, על ידי סימון של שלוש נקודות (...).

לא יכול להיות יותר ממשתנה אחד כזה (כי אחרת איך נדע מאיפה יתחיל לאסוף המשתנה השני?).

דוגמה:

2.יש אפשרות לשלוח ארגומנט מאותחל לברירת מחדל מסויימת,

אשר כל עוד לא שלחנו ערך שונה הוא נשאר עם אותו ערך.

דוגמה:

מאמרים נבחרים
מאמרים חדשים
ארכיון
חפש לפי תג
הבלוג של ישרוליק
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square

ישרוליק נט

israelik net

גולשים אלייך...

bottom of page