ברוכים הבאים ליחידת הלימוד "מחלקה ועצם" בקורס "תכנות מונחה עצמים". יחידה זו היא אבן היסוד להבנת הפרדיגמה כולה. נלמד כיצד להגדיר תבניות לנתונים והתנהגויות (מחלקות), וכיצד ליצור מהן מופעים קונקרטיים (עצמים) המנהלים מצב וביצוע פעולות. הבנה מעמיקה של מושגים אלו חיונית לא רק להצלחה בקורס, אלא גם לכתיבת קוד מודרני, מודולרי וקל לתחזוקה.
מבוא למחלקות ועצמים: אבני הבניין של OOP
בתכנות מונחה עצמים (OOP), אנו מנסים למדל את העולם האמיתי באמצעות ישויות תוכנה. שתי הישויות המרכזיות הן מחלקות ועצמים.
ההבדל המהותי: תבנית מול מופע
- מחלקה היא כמו תוכנית אב לבניין; עצם הוא בניין ספציפי שנבנה על פי אותה תוכנית.
- מחלקה מגדירה מה עצם יכול להיות ומה הוא יכול לעשות; עצם הוא מימוש בפועל של ההגדרות הללו.
הגדרת מחלקה: תבנית למציאות
הגדרת מחלקה כוללת ציון שמה, ולאחר מכן הגדרת השדות (נתונים) והמתודות (פעולות) שיהיו לכל עצם שייווצר ממנה.
שדות (Fields / Attributes)
שדות הם משתנים המוגדרים בתוך מחלקה ומייצגים את המצב או הנתונים של עצם מסוים. לכל עצם יהיה עותק משלו של השדות, וערכיהם יכולים להיות שונים מעצם לעצם.
מתודות (Methods / Behaviors)
מתודות הן פונקציות המוגדרות בתוך מחלקה ומייצגות את ההתנהגות או הפעולות שעצם יכול לבצע. מתודות יכולות לגשת לשדות של העצם ולשנות את מצבו.
שדות
מייצגים נתונים או מצב. למשל, במחלקת מכונית, שדות יכולים להיות צבע, מהירות, מספר דלתות.
מתודות
מייצגות פעולות או התנהגות. למשל, במחלקת מכונית, מתודות יכולות להיות האץ(), בלום(), הפעלמגבים().
יצירת עצמים וניהול מצב והתנהגות
לאחר שהגדרנו מחלקה, אנו יכולים ליצור ממנה מספר בלתי מוגבל של עצמים. תהליך זה נקרא יצירת מופע (Instantiation).
new וקריאה לבנאי (constructor) של המחלקה.דוגמה ליצירת עצם ושימוש בו:
נניח שיש לנו מחלקה מכונית. יצירת עצם ושימוש בו ייראו כך (דוגמה בפסאודו-קוד):
מכונית שלי = new מכונית();
שלי.צבע = "אדום";
שלי.האץ(50);
כאן, שלי הוא עצם מהמחלקה מכונית. אנו ניגשים לשדה צבע שלו כדי להגדיר את מצבו, וקוראים למתודה האץ() כדי לבצע פעולה המשנה את מצבו (למשל, שדה מהירות).
מנגנוני גישה: שליטה ובקרה
מגדירי גישה (Access Modifiers) קובעים את רמת הנגישות לשדות ולמתודות של מחלקה. הם חיוניים ליישום עקרון ההכמסה (Encapsulation), שהוא אחד מעמודי התווך של OOP.
public, private, protected) הקובעות מאיפה בקוד ניתן לגשת לחברים (שדות ומתודות) של מחלקה.public
חבר המוגדר כ-public נגיש מכל מקום בקוד, מתוך המחלקה ומחוצה לה. משמש לרוב למתודות המהוות את הממשק הציבורי של העצם.
private
חבר המוגדר כ-private נגיש רק מתוך המחלקה עצמה. הוא אינו נגיש ישירות מחוץ למחלקה. משמש לרוב לשדות כדי להגן על המצב הפנימי של העצם.
private, וגישה אליהם מתבצעת באמצעות מתודות public ייעודיות (getters ו-setters). זה מאפשר לשלוט באופן שבו המצב הפנימי של העצם משתנה, מונע גישה לא חוקית או בלתי צפויה, ומקל על שינויים עתידיים במימוש הפנימי מבלי להשפיע על קוד המשתמש במחלקה.שאלות לדיון
- הסבר מדוע עקרון ההכמסה, המיושם באמצעות מגדירי גישה, נחשב קריטי בתכנות מונחה עצמים. תן דוגמה.
- מה ההבדל המהותי בין שדה למתודה במחלקה? מתי תבחר להגדיר נתון כשדה ומתי כתוצאה של מתודה?
- תאר את תהליך יצירת עצם ממחלקה. אילו רכיבים מעורבים בתהליך זה?
- כיצד מגדירי הגישה
publicו-privateתורמים להפרדת דאגות (Separation of Concerns) בקוד?
נקודות לתשובת מודל
- הכמסה: מגינה על המצב הפנימי של העצם מפני שינויים בלתי מבוקרים, מאפשרת למחלקה לשמור על עקביות פנימית, מקלה על תחזוקה ושינויים עתידיים במימוש, ומפחיתה תלות (coupling) בין רכיבים. דוגמה: שדה
balanceב-BankAccountיהיהprivate, ורק מתודותdeposit()ו-withdraw()ציבוריות ישנו אותו, תוך ביצוע בדיקות תקינות. - שדה מול מתודה: שדה מאחסן נתון (מצב), מתודה מבצעת פעולה (התנהגות). נתון קבוע או משתנה שמתאר את העצם באופן ישיר יהיה שדה (למשל,
name,age). נתון שנגזר מנתונים אחרים או דורש חישוב יהיה לרוב תוצאה של מתודה (למשל,getAgeInMonths(),calculateGPA()). - יצירת עצם: מתבצעת באמצעות מילת המפתח
newולאחריה קריאה לבנאי (constructor) של המחלקה. הבנאי הוא מתודה מיוחדת שאחראית לאתחל את מצבו הראשוני של העצם (למשל, להקצות זיכרון, לאתחל שדות). - מגדירי גישה והפרדת דאגות:
publicחושף את הממשק הציבורי של המחלקה – מה שהעולם החיצוני צריך לדעת ולעשות.privateמסתיר את פרטי המימוש הפנימיים – מה שהמחלקה צריכה לעשות עבור עצמה. זה מפריד בין "איך המחלקה עובדת" לבין "איך משתמשים במחלקה", ומאפשר לכל צד להתמקד בדאגותיו מבלי להיות מושפע מהפרטים הפנימיים של הצד השני.