דילוג לתוכן הראשי

14.12.22 יום ה', (חוף, אשכול ב', שעה 5) - שיטה בונה VS שיטה רגילה, שילוב תנאים ב- Get/Set, מאפיין-Property

בבכיתה 

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

2. שילוב תנאים בפעולות Get/Set
    נרצה לשלב תנאים בפעולות אלה כאשר הערך הגולמי של התכונה לא מספיק טוב עבורנו.
    דוגמה1 - Get: אם התכונה מחיר המוצר מכילה את עלותו לפני מע"מ, אך ברצוננו שפעולת האחזור
                          GetPrice תחזיר מחיר הכולל מע"מ.
    דוגמה2 - Set: אם כאשר אנו משנים מחיר של מוצר, נרצה שהמחיר שיישמר באמצעות
                          באמצעות הפעולה הקובעת SetPrice יהיה מעוגל כלפי מעלה לערך השלם הקרוב.

3הכירו את המאפיין / Property
    מדובר בתחליף המשוכלל לפעולות Get/Set.
    כל מאפיין משויך לתכונה אחת בלבד.
    למשל, אם יש לנו תכונה בשם name, אזי למאפיין נקרא Name.
    למאפיין ניתן את אותו השם כמו שנתנו לתכונה, רק ששם המאפיין יתחיל באות גדולה.
    שיטת ה- get הפנימית של ה- property תחזיר את ערך התכונה.
    שיטת ה- set הפנימית של ה- property תקצה ערך עבור התכונה, בהתאם לפרמטר שהתקבל מהמשתמש.

    מהו יתרון השיטה?
    * במקום לכתוב שתי פעולות, למשל: GetName ו- SetName, נכתוב מאפיין אחד בלבד בשם Name.
    * הגישה של המשתמש אל המאפיין (פרופרטי) היא אינטואיטיבית, לדוגמה:
       ;"s1.Name = "Ran                     (מימוש ה- set של הפרופרטי Name).
       ;(Console.WriteLine(s1.Name   (מימוש ה- get של הפרופרטי Name).
       כלומר, השימוש במאפיין הוא טבעי וישיר, כמו בגישה לתכונה שהוגדרה כ- public. 
       מובן שלא נגדיר תכונה כ- public, ולכן ה- Properties כל כך מוצלחים.
       מצד אחד - שומרים על מתודולוגיית OOP באמצעות הגדרת התכונות כ- private,
       מצד שני  - הגישה לתכונות היא ישירה, כאילו הן הוגדרו כ- public.


     
דוגמה להגדרת property עבור התכונה name:
     נניח שקיימת אצלנו במחלקה התכונה name שהוגדרה כך   -   ;private string name
     במקום לכתוב את הפעולות GetName ו- SetName, נכתוב את הפרופרטי ששמו Name:
                         public string Name
                                                     }
          get { return this.name; }
        set { this.name = value; } 
                                                    {

     הערה1: מלת-המפתח value היא הפרמטר שהפרופרטי מקבל מהמשתמש בעת ביצוע set.
                  כלומר: כאשר המשתמש מזמן את הפרופרטי עם ערך בסוגריים כפרמטר, ערך זה
                             מכונה על ידי המנגנון של ה- property בשם value.
     הערה2: בסיום שורת הכותרת של הפרופרטי אין נקודה-פסיק ( ; ) כיוון שהגדרתו עדיין לא הסתיימה.
                 תחילת הגדרת הפרופרטי וסיום הגדרתו מצוינים באמצעות סוגריים מסולסלים } ו- {. 
     הערה3: נכון להיום, בבגרות אסור להשתמש ב- Properties, אלא רק בפעולות Get/Set נפרדות.
                 הסיבה העיקרית לכך שלמדנו נושא זה היא כדי שתדעו לקרוא קודים באינטרנט שמבצעים
                 Get/Set בשיטה זו ולא בשיטה הרגילה והישנה בה אנו משתמשים לצורך הבגרות. 
     הערה4: קראו עוד על השימוש ב- Properties כאן (לחצו על הכפתור 'חזרה למאמר').

4. נדחה לשיעור שאחרי חנוכהמבדק ש.ב בנושא תרגיל WorkerNManagerProject (ס' 120).
    המבדק יכלול גם שאלות בנושאי ש.ב שניתנו לחופשת החנוכה (השתדלתי לא לתת הרבה ש.ב,
    ומצורף מבדק ש.ב לדוגמה, ראו למטה סעיף 4').

לבית
1. תרגילי חזרה בנושא מערך חד-ממדי
    בצעו תרגילי החזרה בנושא מערכים (ס' 130, 140, 150).
    הערה: בכל אחד מתרגילים אלה, אם קל לכם ואתם זוכרים היטב את נושא המערך החד-ממדי,
    אתם יכולים לעבור לסעיף הבא ואף לתרגיל הבא. בכל אופן טוב לתרגל כי נעבוד עם מערכים.
2. תרגיל ArrayNClasses drill01 
    נושא התרגיל: מערך אובייקטים, מחלקת Employee (ס' 160).
3. לקריאה
    א. מושגי מבוא בקשר שבין הורשה, הכלה ופולימורפיזם (ס' 170).
    ב. מחלקה אבסטרקטית (ס' 215).
4. התכוננו למבדק ש.ב
    שאלות לדוגמה לקראת המבדק שיהיה אחרי החג:
    א. בנושא WorkerNManagerProject (ס' 120) ראו כאן.
    ב. בנושא תרגיל ArrayNClasses ראו (ס' 160) ראו כאן.
    ג. בנושא הורשה-הכלה-פולימורפיזם (ס' 170) ראו כאן.
        הנחיות להפעלת המבדק:
        * לחצו על הקישור 'כאן'.
        * הורידו את קובץ ה- rar.
        * לחצו 'קליק' על קובץ ה- rar שנמצא בפינת המסך למטה.
        * לחצו 'קליק-כפול' על הקובץ index.html.

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

    ד. בנושא מחלקה אבסטרקטית (ס' 215) ראו כאן. (יועלה בסופ"ש הזה).
        
הנחיות להפעלת המבדק: כנ"ל.

בשיעורים הבאים
1. תרגילעבודה עם מערך עצמים ArraysNClasses (ס' 160).
2. הסברהורשה והפעולה is a.
3. הסברהורשה-הכלה-פולימורפיזם - Inheritance-Composition-Polymorphism (ס' 170).
4. תרגיל: ClassStudentsProject הוספת תכונה מורכבת (Complex Data-Type)
               המוכלת (Composition) במחלקה (ס' 190).

5. תרגיל: SchoolEntitiesProject שימוש באופרטור is ודריסת פעולות בהיררכיית המחלקות (ס' 210).