Smart-World Surf

יחידה 2: מחלקה ועצם

הגדרת מחלקות, יצירת עצמים וניהול מצב והתנהגות.
הגדרת מחלקהיצירת עצם (Instantiation)שדות (Fields) ומתודות (Methods)גישה לחברים (Access Modifiers)

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

מבוא למחלקות ועצמים: אבני הבניין של OOP

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

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

ההבדל המהותי: תבנית מול מופע

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

הגדרת מחלקה: תבנית למציאות

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

שדות (Fields / Attributes)

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

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

מתודות (Methods / Behaviors)

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

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

שדות

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

מתודות

מייצגות פעולות או התנהגות. למשל, במחלקת מכונית, מתודות יכולות להיות האץ(), בלום(), הפעלמגבים().

יצירת עצמים וניהול מצב והתנהגות

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

יצירת עצם (Instantiation): התהליך של יצירת מופע ספציפי של מחלקה בזיכרון. לרוב מתבצע באמצעות מילת המפתח new וקריאה לבנאי (constructor) של המחלקה.

דוגמה ליצירת עצם ושימוש בו:

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

מכונית שלי = new מכונית();

שלי.צבע = "אדום";

שלי.האץ(50);

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

מנגנוני גישה: שליטה ובקרה

מגדירי גישה (Access Modifiers) קובעים את רמת הנגישות לשדות ולמתודות של מחלקה. הם חיוניים ליישום עקרון ההכמסה (Encapsulation), שהוא אחד מעמודי התווך של OOP.

מגדירי גישה (Access Modifiers): מילות מפתח (כגון public, private, protected) הקובעות מאיפה בקוד ניתן לגשת לחברים (שדות ומתודות) של מחלקה.

public

חבר המוגדר כ-public נגיש מכל מקום בקוד, מתוך המחלקה ומחוצה לה. משמש לרוב למתודות המהוות את הממשק הציבורי של העצם.

private

חבר המוגדר כ-private נגיש רק מתוך המחלקה עצמה. הוא אינו נגיש ישירות מחוץ למחלקה. משמש לרוב לשדות כדי להגן על המצב הפנימי של העצם.

הכמסה (Encapsulation): זהו אחד העקרונות החשובים ביותר ב-OOP, ובחינות בטכניון נוטות לשים עליו דגש רב. הכמסה היא הרעיון של קיבוץ נתונים (שדות) ופעולות (מתודות) הפועלות עליהם ליחידה אחת (מחלקה), תוך הסתרת הפרטים הפנימיים של המימוש מהעולם החיצוני. לרוב, שדות מוגדרים כ-private, וגישה אליהם מתבצעת באמצעות מתודות public ייעודיות (getters ו-setters). זה מאפשר לשלוט באופן שבו המצב הפנימי של העצם משתנה, מונע גישה לא חוקית או בלתי צפויה, ומקל על שינויים עתידיים במימוש הפנימי מבלי להשפיע על קוד המשתמש במחלקה.

שאלות לדיון

  • הסבר מדוע עקרון ההכמסה, המיושם באמצעות מגדירי גישה, נחשב קריטי בתכנות מונחה עצמים. תן דוגמה.
  • מה ההבדל המהותי בין שדה למתודה במחלקה? מתי תבחר להגדיר נתון כשדה ומתי כתוצאה של מתודה?
  • תאר את תהליך יצירת עצם ממחלקה. אילו רכיבים מעורבים בתהליך זה?
  • כיצד מגדירי הגישה public ו-private תורמים להפרדת דאגות (Separation of Concerns) בקוד?

נקודות לתשובת מודל

  • הכמסה: מגינה על המצב הפנימי של העצם מפני שינויים בלתי מבוקרים, מאפשרת למחלקה לשמור על עקביות פנימית, מקלה על תחזוקה ושינויים עתידיים במימוש, ומפחיתה תלות (coupling) בין רכיבים. דוגמה: שדה balance ב-BankAccount יהיה private, ורק מתודות deposit() ו-withdraw() ציבוריות ישנו אותו, תוך ביצוע בדיקות תקינות.
  • שדה מול מתודה: שדה מאחסן נתון (מצב), מתודה מבצעת פעולה (התנהגות). נתון קבוע או משתנה שמתאר את העצם באופן ישיר יהיה שדה (למשל, name, age). נתון שנגזר מנתונים אחרים או דורש חישוב יהיה לרוב תוצאה של מתודה (למשל, getAgeInMonths(), calculateGPA()).
  • יצירת עצם: מתבצעת באמצעות מילת המפתח new ולאחריה קריאה לבנאי (constructor) של המחלקה. הבנאי הוא מתודה מיוחדת שאחראית לאתחל את מצבו הראשוני של העצם (למשל, להקצות זיכרון, לאתחל שדות).
  • מגדירי גישה והפרדת דאגות: public חושף את הממשק הציבורי של המחלקה – מה שהעולם החיצוני צריך לדעת ולעשות. private מסתיר את פרטי המימוש הפנימיים – מה שהמחלקה צריכה לעשות עבור עצמה. זה מפריד בין "איך המחלקה עובדת" לבין "איך משתמשים במחלקה", ומאפשר לכל צד להתמקד בדאגותיו מבלי להיות מושפע מהפרטים הפנימיים של הצד השני.
מצאתם טעות או שחסר משהו?
→ הקודמת
מבוא לתכנות מונחה עצמים
הבאה ←
בנאים והורסים