שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2024 - מחסניות
רוצים לבנות מחסנית שמיועדת לאחסן עשרה Strings.
הניחו ש בזמן של push במחסנית תמיד יש מקום פנוי, ובזמן של pop במחסנית תמיד יש לפחות String אחד.
בחרו במימוש הנכון ביותר עבור מחסנית, לפי העקרונות שלמדנו בקורס.
א.
ב.
ג.
ד.
נמקו את התשובה שסימנתםן.
הניחו ש בזמן של push במחסנית תמיד יש מקום פנוי, ובזמן של pop במחסנית תמיד יש לפחות String אחד.
בחרו במימוש הנכון ביותר עבור מחסנית, לפי העקרונות שלמדנו בקורס.
א.
ב.
ג.
ד.
נמקו את התשובה שסימנתםן.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2024סמסטר א
★★★★★
מחסניותהסתרת מידעאובייקטיםמחלקותמעקב אחר קוד
שימו לב לתכונה מהותית של המחלקה
String בג'אווה. האם ניתן לשנות אובייקט מסוג String לאחר יצירתו, וכיצד תכונה זו משפיעה על הצורך ביצירת עותקים חדשים של האובייקט?התשובה הנכונה היא ב'.
הסיבה לכך נעוצה בתכונת ה-immutability (אי-שינוי) של אובייקטים ממחלקת
כאשר אנו מכניסים
לכן, אין צורך ב"העתקה הגנתית" (defensive copying) על ידי יצירת אובייקט
- אפשרות ב' היא המימוש הנכון והיעיל ביותר: היא שומרת את ההפניה (reference) ל-
- אפשרות א' יוצרת עותק מיותר ב-
- אפשרות ג' יוצרת עותק מיותר ב-
- אפשרות ד' יוצרת עותקים מיותרים גם ב-
העיקרון המנחה כאן הוא שילוב של הסתרת מידע והבנת תכונות האובייקטים שאנו מנהלים. במקרה של אובייקטים ניתנים לשינוי (mutable), העתקה הגנתית הייתה חיונית. אך עבור
הסיבה לכך נעוצה בתכונת ה-immutability (אי-שינוי) של אובייקטים ממחלקת
String בג'אווה. אובייקט String שנוצר לא יכול להשתנות. כל פעולה שנראית כמשנה String למעשה יוצרת אובייקט String חדש.כאשר אנו מכניסים
String למחסנית בפעולת ה-push, אין חשש שהקוד החיצוני ישנה את ה-String לאחר שהכנסנו אותו למחסנית. באופן דומה, כאשר אנו מוציאים String מהמחסנית בפעולת ה-pop, אין חשש שהקוד שיקבל אותו יוכל לשנות את האובייקט המאוחסן במחסנית.לכן, אין צורך ב"העתקה הגנתית" (defensive copying) על ידי יצירת אובייקט
String חדש עם new String(...). יצירת אובייקטים חדשים ללא צורך היא פעולה לא יעילה שצורכת זמן וזיכרון.- אפשרות ב' היא המימוש הנכון והיעיל ביותר: היא שומרת את ההפניה (reference) ל-
String המקורי ב-push ומחזירה את אותה הפניה ב-pop.- אפשרות א' יוצרת עותק מיותר ב-
push.- אפשרות ג' יוצרת עותק מיותר ב-
pop.- אפשרות ד' יוצרת עותקים מיותרים גם ב-
push וגם ב-pop, ולכן היא הגרועה ביותר מבחינת יעילות.העיקרון המנחה כאן הוא שילוב של הסתרת מידע והבנת תכונות האובייקטים שאנו מנהלים. במקרה של אובייקטים ניתנים לשינוי (mutable), העתקה הגנתית הייתה חיונית. אך עבור
String, היא מיותרת.