OOP – תכנות מונחה עצמים מערך שיעור למרצה

מערך שיעור: עבודה נכונה עם Objects ו-Encapsulation

משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

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

בסוף השיעור הסטודנטים צריכים:

  1. להבחין בין Instance ל-Class Attributes, ולהימנע משתי המלכודות (השמה דרך אובייקט, רשימה משותפת).
  2. להסביר למה Encapsulation קיימת, ולממש אותה עם _x, properties לקריאה בלבד, Setters עם ולידציה והחזרת עותקים.
  3. לבנות Class שלמה לפי תהליך: אחריות → נתונים → ממשק → כללים → מימוש → בדיקה.

דגש קריטי: ה"למה" של Encapsulation. הסילבוס מדגיש זאת במפורש. לא ללמד את _ ו-@property כתחביר, אלא קודם להראות את account.balance = -1000000 עוקף את כל הבדיקות, ורק אז את הפתרון.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
חזרה: self ו-init10 דק'3 שאלות מהירות, כולל “takes 2 positional arguments but 3 were given”.
Attribute מול Method, Class Attributes35 דק'אנלוגיית הלוח בכיתה. מונה ו-VAT. שתי המלכודות בהדגמה חיה.
הרבה אובייקטים ו-State35 דק'Team, ואז Orders שמחזיקים Customer. לשנות עיר של דנה ולראות בשתי ההזמנות. ציור הפניות.
הפסקה15 דק'
Encapsulation40 דק'פתיחה: “תשברו לי את החשבון בשורה אחת”. אנלוגיית הכספומט. _ מול __, עם הדגמה של Name Mangling.
Getters / Setters / @property40 דק'קודם get_/set_ (הרעיון), ואז @property (הפתרון של Python). RecursionError בכוונה.
הפסקה15 דק'
בניית Class שלמה45 דק'Course ביחד על הלוח: 4 שלבי התכנון לפני שורת קוד אחת. אחר כך המימוש והבדיקה.
תרגול + בדוק את עצמך35 דק'Mini Project: בנק מוגן. לדרוש הערת תכנון בראש הקובץ.

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

  • מלכודת ה-Class Attribute (רשימה משותפת) היא אחד הבאגים הקלאסיים של Python. להראות אותה, ואת הקשר לבאג של def f(x=[]) מנושא Python. אותו עיקרון בדיוק.
  • Encapsulation ב-Python היא מוסכמה. סטודנטים שמכירים Java ישאלו “אבל אפשר לעקוף!”. נכון, וזו הפילוסופיה: מבהירים כוונה, לא נועלים. להשוות לשלט “אין כניסה” לעומת דלת נעולה.
  • לא להגזים ב-properties. להדגיש “מתחילים עם Attribute רגיל, משדרגים כשיש כלל”. זה גם יתרון אמיתי של Python על פני get/set בשפות אחרות.
  • “להחזיר עותק” הוא חיבור יפה בין נושא Python (Mutable) ל-Encapsulation. לתת לסטודנטים לגלות את החור בעצמם.
  • תהליך 6 השלבים: לעשות את שלבי התכנון בקול, עם הכיתה. סטודנטים צריכים לראות שמקצוענים חושבים לפני שהם מקלידים.
  • Decorators: להציג @property כתבנית, ולא להיכנס לאיך Decorators עובדים.

מושגים

מושגהסבר קצר
Instance Attributeנתון של כל אובייקט בנפרד (self.x).
Class Attributeנתון משותף ל-Class (בגוף ה-Class).
Stateערכי ה-Attributes ברגע מסוים.
Referenceאובייקט שמחזיק הפניה לאובייקט אחר, ולא עותק.
List Comprehensionדרך קצרה לבנות רשימה מסוננת.
Encapsulationאריזת נתונים עם הקוד שלהם וחשיפת ממשק בלבד.
Public Interface / Implementationמה שמיועד לשימוש מבחוץ / הפרטים הפנימיים.
_x / __xפנימי (מוסכמה) / Name Mangling.
Getter / Setterמתודה לקריאה / מתודה לכתיבה עם ולידציה.
@property / @x.setterGetter/Setter בתחביר של Attribute.
Read-only Propertyproperty בלי Setter.
Computed Propertyproperty שמחושב מנתונים אחרים.
Validationבדיקת תקינות לפני שמירה.
Invariantתנאי שחייב להיות נכון תמיד.

תרגיל חשיבה

שאלת פתיחה (לפני Encapsulation): “יש לנו את BankAccount מאתמול, עם withdraw שבודקת יתרה. אני אתן לכם 60 שניות: תשברו את החשבון — תגרמו ליתרה שלילית — בשורת קוד אחת.”

מהלך:

  1. רוב הכיתה תמצא תוך שניות: account.balance = -1000000.
  2. לשאול: “אז מה הטעם בכל הבדיקות שכתבנו ב-withdraw?”
  3. לשאול: “ואם בעוד חודש נחליט לשמור את היתרה באגורות (balance_cents), כמה מקומות בקוד יישברו?” כל מקום שנגע ב-balance ישירות.
  4. להציג את שתי מטרות ה-Encapsulation: הגנה על כללים והסתרת מימוש.
  5. להראות את הפתרון בשלבים: _balance → get_balance() → @property לקריאה בלבד.

מה המרצה מראה בסוף: את אותו ניסיון “שבירה” על הגרסה החדשה: account.balance = -1000000 → AttributeError: property 'balance' ... has no setter. ואז את ההשוואה מול הכספומט: ממשק (מקשים) מול כספת (מימוש). משפט סיום: “Class טובה היא כמו כספומט טוב — קל להשתמש בה נכון, וקשה להשתמש בה לא נכון.”