תרגיל 10 – הסברים לשאלת המכוניות

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

 

 

public class MyCar {

      

       public static final int LAMBORGHINI      = 2;

       public static final int SUSITA    = 4;

       public static final int RENAULT   = 5;

      

       private int type;

 

       public MyCar(int type) {

              this.type = type;

       }

      

       public String getManufacturerName(){

              switch (type) {

                     case LAMBORGHINI:

                           return "LAMBORGHINI";

                     case RENAULT:

                           return "RENAULT";

                     case SUSITA:

                           return "SUSITA";

              }

              return "Manufacturer Unknown";

       }

      

       public int getNumOfDoors(){

              switch (type) {

                     case LAMBORGHINI:

                           return LAMBORGHINI;

                     case RENAULT:

                           return RENAULT;

                     case SUSITA:

                           return SUSITA;

              }

              return -1;

       }

}

 

דוגמא לשימוש במחלקה:

 

public class MyCarDemo {

 

       public static void main(String[] args) {

              MyCar bimba = new MyCar(MyCar.LAMBORGHINI);

 

              System.out.println("bimba was manufactured by " +

bimba.getManufacturerName());

 

              System.out.println("bimba has " + bimba.getNumOfDoors() +

" door" + (bimba.getNumOfDoors() == 1 ? "" : "s"));

       }

}

 

 

 

השאלות הבאות מתייחסות למחלקה MyCar:

 

א.       

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

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

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

 

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

                                                               i.      מימוש אחד צריך למזער את כמות הקוד ע"י הגדרה של מחלקת אב אשר מחזיקה מידע 

                                                             ii.      המימוש האחר צריך למזער את הזיכרון הדרוש למופעי המחלקה ע"י דריסה (overriding)

ב.       

1)       צייני את הבעיה הגדולה ביותר העולה מפתרון הסעיף הקודם בעזרת ירושה. אם יש בעיות נוספות צייני גם אותן. מדוע ירושה במקרה זה גורמת לבעיות שציינת?


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

 

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

      

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

ג.        שכתבי את  המחלקה ע"י הגדרתה כ-enum. 

ד.      (10 נקודות) האם קיימות נסיבות (כגון אילוצים על המחלקה, הקשרי שימוש, דרישות עיצוב של המערכת וכו') שבהן יש העדפה לאסטרטגיית מימוש מסוימת על פני אחרות  (מבין 5 הגישות לעיל כפי שעולה מהמחלקה המקורית ו-4 החלופות)? דוני בקצרה במקרים השונים.