שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2019 - ירושה
השאלה מתייחסת למחלקות הפייתון המוגדרות בנספח בסעיף המסומן [STACK]. מבין הבאים, מהי בעיה מרכזית במימוש
1. תלות במימוש הפנימי של
2. בעיית המעויין (deadly diamond of death).
3. קריאה למתודת מופע מהקשר סטטי (שם המחלקה).
4. שכפול קוד.
DoubleStupidStack?1. תלות במימוש הפנימי של
StupidStack העלולה לגרום לשגיאות במידה ומימוש זה ישתנה.2. בעיית המעויין (deadly diamond of death).
3. קריאה למתודת מופע מהקשר סטטי (שם המחלקה).
4. שכפול קוד.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2019סמסטר ב
★★★★★
ירושהמחלקותאובייקטיםOverridingמעקב אחר קוד
חשבו מה יקרה אם נשנה את שם מחלקת האב
StupidStack או נוסיף מחלקה חדשה בהיררכיית הירושה. כיצד כל אחת מהפעולות הללו תשפיע על DoubleStupidStack?התשובה הנכונה היא 1.
הבעיה המרכזית במימוש
הגישה המודרנית והנכונה בפייתון היא להשתמש ב-
שימוש ב-
נבחן את שאר האפשרויות:
2. בעיית המעויין: לא רלוונטית כאן, מכיוון שזו בעיה הקשורה לירושה מרובה, ובדוגמה ישנה ירושה יחידה בלבד.
3. קריאה למתודת מופע מהקשר סטטי: זו אינה שגיאה בפייתון. זוהי דרך לגיטימית (אך לא מומלצת בדרך כלל) לקרוא למתודה ממחלקת אב ספציפית, כל עוד מעבירים את
4. שכפול קוד: ישנו שכפול מינורי של שורת הקוד
הבעיה המרכזית במימוש
DoubleStupidStack היא צימוד חזק (tight coupling) למחלקת האב StupidStack. הקריאות הישירות StupidStack.__init__(self) ו-StupidStack.push(self, val) קושרות את המחלקה הצאצאית באופן ישיר לשם של מחלקת האב.הגישה המודרנית והנכונה בפייתון היא להשתמש ב-
super():שימוש ב-
super() מנתק את התלות בשם הספציפי של מחלקת האב. הדבר הופך את הקוד לגמיש יותר וקל יותר לתחזוקה. למשל, אם נשנה את שם המחלקה StupidStack ל-BaseStack, או אם נוסיף מחלקת ביניים בהיררכיית הירושה, המימוש המקורי יישבר וידרוש שינויים, בעוד שהמימוש עם super() ימשיך לעבוד ללא שינוי.נבחן את שאר האפשרויות:
2. בעיית המעויין: לא רלוונטית כאן, מכיוון שזו בעיה הקשורה לירושה מרובה, ובדוגמה ישנה ירושה יחידה בלבד.
3. קריאה למתודת מופע מהקשר סטטי: זו אינה שגיאה בפייתון. זוהי דרך לגיטימית (אך לא מומלצת בדרך כלל) לקרוא למתודה ממחלקת אב ספציפית, כל עוד מעבירים את
self במפורש. הבעיה היא לא עצם הקריאה, אלא ההשלכות שלה על תחזוקתיות הקוד, כפי שמוסבר בתשובה 1.4. שכפול קוד: ישנו שכפול מינורי של שורת הקוד
StupidStack.push(self, val). זו אכן בעיה קטנה, אך היא זניחה בהשוואה לבעיית הצימוד החזק למחלקת האב, שהיא בעיה עיצובית יסודית יותר.