שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2023 - מעקב אחר קוד

שאלה זו מתייחסת לקוד בנספח \[Lamp\]. מה ידפיס הקוד הבא?



.1 יודפס create; create; create; loop; on; on;
.2 יודפס create; create; create; on;

.3 יודפס create; create; loop; on;

.4 יודפס create; create; create; loop; loop; on; on; on;

.5 יודפס create; create; loop; loop; on; on;
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2023סמסטר ב
מעקב אחר קודאובייקטיםמלקותפולימורפיזםירושהOverridingרקורסיהstatic
התנהגות המתודה turnOn במחלקת ListLamp היא המפתח. חשבו על דרך נפוצה אך שגויה למנוע רקורסיה אינסופית במבנה כזה, למשל באמצעות משתנה סטטי.
תחילה, הקוד יוצר שלושה אובייקטים. נניח שכל קונסטרוקטור מדפיס create;:
1. new ListLamp() מדפיס create;.

2. new ListLamp() מדפיס create;.

3. new SimpleLamp() מדפיס create;.

עד כה הפלט הוא: create; create; create;.


כעת, נanalץ את הקריאה list1.turnOn(). השאלה בוחנת התמודדות עם רקורסיה במבנה היררכי של אובייקטים (תבנית עיצוב Composite). כאשר ListLamp יכול להכיל ListLamp אחר, קריאה ל-turnOn עלולה לגרום ללולאה אינסופית אם קיים מבנה מעגלי. כדי למנוע זאת, יש לממש מנגנון לזיהוי כניסה חוזרת (re-entrancy) למתודה.


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


1. list1.turnOn() נקראת. המשתנה הסטטי isTurningOn הוא false. המתודה משנה אותו ל-true וממשיכה.
2. בתוך list1.turnOn(), המתודה עוברת על המנורות ברשימה שלה. יש רק אחת: list2.

3. נקראת המתודה list2.turnOn().

4. בתחילת list2.turnOn(), נבדק המשתנה הסטטי isTurningOn. מכיוון שהקריאה ל-list1.turnOn() עדיין פעילה, ערכו הוא true.

5. התנאי לזיהוי לולאה מתקיים, והקוד מדפיס loop;.

6. כעת מגיעה הטעות הנפוצה שנבדקת בשאלה: המימוש השגוי אינו מבצע return לאחר זיהוי הלולאה, אלא ממשיך בריצת המתודה.

7. list2.turnOn() ממשיכה לרוץ, ועוברת על המנורות ברשימה שלה. יש רק אחת: SimpleLamp.

8. נקראת המתודה simpleLamp.turnOn(), אשר מדפיסה on;.

9. הביצוע חוזר למעלה במחסנית הקריאות, והמשתנה הסטטי isTurningOn מתאפס ל-false בסוף כל קריאה.


לסיכום, הפלט המלא שיתקבל הוא create; create; create; loop; on;. התשובה הנכונה היא 3.
שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2023 | prepd