21.02.2018 ד"ר עזאם מרעי. יסודות הנדסת תוכנה.. מועד: ב'. 202-1-3051 תאריך הבחינה: שם המרצה: שם הקורס: מספר הקורס: שנה: 2018 משך הבחינה: סמסטר: א' 3 שעות הנחיות כלליות: נא לוודא כי בשאלון זה 17 עמודים + 17 עמודים שבנספח. יש לענות על כל השאלות בגוף המבחן בלבד. אין לחרוג מהמקום המוקצה )במקרים חריגים יש לבקש אישור ממרצה / מתרגל(. מומלץ להשתמש במחברת הבחינה כטיוטה. סך הניקוד במבחן הוא 100 כדלהלן: 25 נק' = שאלה 1: בדיקות, מבחני קבלה, TDD ו- XP 25 נק' = שאלה 2: תבניות עיצוב 25 נק' = שאלה :3 Refactoring 25 נק' = שאלה :4 Contract Design by אם אינך יודעים את התשובה, ניתן לכתוב "לא יודע" ולקבל 20% מהניקוד על הסעיף / השאלה. אין לכתוב בעיפרון. )1 )2 )3 )4 )5 1
שאלה [ 1 25 ] בדיקות,(T) מבחני קבלה,(AT) TDD ו- XP א. [ 4 ] )T( מיינו יתרון אחד וחסרון אחד לשימוש ב- Methods.Formal Verification [ 4 ] )T( בחינת קוד inspection( )code היא שיטה אחת מרבות לבדיקת קוד בזמן הפיתוח. שגיאות מחפשים בבדיקות הללו? תנו דוגמא. ב. אילו ציינו שני יתרונות לשיטה והסבירו כל אחד בקצרה. ג. [ 3 ] (AT) ציינו שלוש מהמטרות של פעילות הבודק. 2
[ 4 ] (AT) הסבירו את התהליך שבבסיסו הרעיון של זיהוי הנחות סמויות באמצעות ניתוח סיפור המשתמש מנקודת מבט של משתמש, לקוח ומפתח. ד. א. [ 2 ] (XP) איזה מהבאים אינו עקרון של?XP מטפורה (Metaphor) עיצוב פשוט Design( )Simple תקן קידוד Standard) (Coding פתוח רזה Development( )Lean בעלות קיבוצית Ownership( )Collective.1.2.3.4.5 [ 5 ] (XP) בתכנון גרסת release פועלים לפי התחייבות לפי סיפורים. תארו בקצרה כל שיטה. ב. משתי אחת שיטות: התחייבות או תאריך לפי ג. [ 3 ] (TDD) מהם הצעדים בפתוח מונחה טסטים?TDD 3
שאלה.2 [ 25 ] תבניות עיצוב [ 8 ] חברה שמפתחת מערכת מידע לארגון גדול התבקשה לאפשר גישה למערכת מידע על פי הרשאות גישה. המשתמשים יכולים להשתמש בתכונות שונות של המערכת על פי הרשאות הגישה שלהם. למשל, לחלק מהמשתמשים יש גישה לדוחות המופקים על ידי המערכת, ולחלקם לא. חלקם יכולים לשנות את הדוחות, בעוד כמה אחרים יכולים רק לקרוא אותם. למשתמשים מסוימים יש גם זכויות ניהול, המאפשרים להוסיף או להסיר משתמשים אחרים. לכל אובייקט משתמש יש אובייקט בקרת גישה, המשמש לסיפוק או הגבלת גישה למערכת. אובייקט בקרת גישה הוא אובייקט כבד וגדול, ויצירתו יקרה מאוד מכיוון שהוא מחייב איסוף נתונים ממשאבים חיצוניים מסוימים, כגון בסיסי נותנים או קבצים המתארים מצב של רכוש וכד'. א. מפתחי המערכת בחרו להשתמש בתבנית העיצוב,Prototype על מנת לתת מענה לדרישה. הסבירו, מה הבעיה שעוסקת בה התבנית? הסבירו מדוע השימוש בתבנית מתאים לדרישה המתוארת לעיל. הדגימו את הפתרון בעזרת תרשים מחלקות. לכל מחלקה שציירתם, תנו שם משמעותי בהקשר של המערכת הנ"ל, כתבו בתוכה שדות חשובים ושיטות רלוונטיות לפתרון וציינו מעליה את שם התפקיד בו היא משמשת בתבנית. 4
[ 5 ] מפתח הציע שהתבנית תאפשר שיתוף אותו אובייקט בקרת גישה עם משתמשים באותה רמה. איזה תבנית לדעתכם מספקת דרישה זו? ב. למה לדעתכם פתרון זה לא פותר את הבעיה של השאלה? ג. [ 6 ] נתון הקוד הבא: public interface ItemElement { public int calculateprice(paymentmethod paymentmethod); public interface PaymentMethod { int applypaymentmethod(book book); int applypaymentmethod(fruit fruit); public class Book implements ItemElement { private int price; private String isbnnumber; public Book(int cost, String isbn){ this.price=cost; this.isbnnumber=isbn; public int getprice() { return price; public String getisbnnumber() { return isbnnumber; @Override public int calculateprice(paymentmethod paymentmethod) { return paymentmethod.applypaymentmethod(this); 5
public class Fruit implements ItemElement { private int priceperkg; private int weight; private String name; public Fruit(int pricekg, int wt, String nm){ this.priceperkg=pricekg; this.weight=wt; this.name = nm; public int getpriceperkg() { return priceperkg; public int getweight() { return weight; public String getname(){ return this.name; @Override public int calculateprice(paymentmethod paymentmethod) { return paymentmethod.applypaymentmethod(this); public class PaymentMethodImpl implements PaymentMethod { @Override public int applypaymentmethod(book book) { int cost=0; //apply 5$ discount if book price is greater than 50 if(book.getprice() > 50){ cost = book.getprice()-5; else cost = book.getprice(); System.out.println("Book ISBN="+book.getIsbnNumber() + ", cost= " + cost); return cost; @Override public int applypaymentmethod(fruit fruit) { int cost = fruit.getpriceperkg()*fruit.getweight(); System.out.println(fruit.getName() + " cost = "+cost); return cost; public class ShoppingCartClient { public static void main(string[] args) { ItemElement[] items = new ItemElement[]{new Book(20, "1234"), new Book(100, "5678"), new Fruit(10, 2, "Banana"), new Fruit(5, 5, "Apple"); int total = calculateprice(items); System.out.println("Total Cost = "+total); private static int calculateprice(itemelement[] items) { PaymentMethod paymentmethod = new PaymentMethodImpl(); int sum=0; for(itemelement item : items){ sum = sum + item.calculateprice(paymentmethod); return sum; 6
איזו תבנית מתאר הקוד? נמקו את תשובתכם: מה הפלט שיתקבל מריצת הקוד? 7
[ 6 ] במערכת מבחני הקבלה שמימשתם במהלך הקורס השתמשנו בשלוש תבניות עיצוב. ציינו מה הן שלוש התבניות והסבירו איזה צורך במבחני הקבלה פותרת כל אחת מהן. ד. ציירו את תרשים המחלקות של מערכת מבחני הקבלה ועבור כל מחלקה בתרשים ציינו את שמה בתוך הריבוע ומעליה את התפקיד/ים אותם היא ממלאה בתבנית. 8
שאלה [ 3 25 ] כללי שכתוב קוד (Refactoring) [ 8 ] נתון ה- refactoring הבא:.1 Form Template Method You have two methods in subclasses that perform similar steps in the same order, yet the steps are different. Get the steps into methods with the same signature, so that the original methods become the same. Then you can pull them up איזה ריח רע עשוי להוביל אותנו להפעלת Refactoring זה? נמקו את תשובתכם. נסחו צעדים לביצוע ה- refactoring )מכניקה( )כלליים(. הקפידו על צעדים זהירים. _.1.2.3 _ 9
.4.5 את ה- Refactoring שלמדנו לקבוצות. שלוש הגדירו קבוצות כל ועל כאלה [ 6 ] אפשר לחלק אחת ספקו דוגמה..2.1 _.2 _.3 [ 5 ] מה ה- refactoring ההופכי ל- Class?Extract הסבירו מה המוטיבציה ל- refactoring ההופכי. א. ב. ספקו שני ריחות רעים שמובלים ל- refactoring זה. 10
[ 6 ] נתון הקוד הבא:.3 String[] row = new String[3]; row [0] = "Liverpool"; row [1] = "15"; על הקוד והתקבל הקוד הבא: Performance row = new Performance(); row.setname("liverpool"); row.setwins("15") המפתח ביצע refactoring נסחו את ה- refactoring הנ"ל על פי המבנה הבא: שם: מטרה: צעדים לביצוע )מכניקה(:.1.2.3.4.5.6 11
Design by Contract שאלה [ 4 25 ].1 [ 10 ] במחלקה Customer ישנה השיטה movetoroom(room newroom, int,numberofnights) המאפשרת ללקוח להחליף חדר לחדר אחר newroom ל- NumberofNights לילות. בנוסף קיימות השיטות הבאות: Customer מחזירה את מספר הלילות הנותרים getremainnights():int getplan(): Plan A Plan is an enumerated type with values {Free, Limited מחזירה את התכנית של הלקוח.,Free שמאפשרת מעבר או ביטול.,Limited שמסמנת תכנית קשיחה שלא גמישה לשינויים. מחזירה את החדר של הלקוח getcurrentroom():room מחזירה את סך החיוב של הלקוח בחדר שהוא גר בו כרגע getcharger():int Room isavailable(): Boolean מחזירה את המחיר של החדר getprice(): int עליכם להשלים את החוזה של השיטה.movetoRoom השיטה מאפשרת את המעבר רק אם החדר המבוקש ריק, מספר הלילות המבוקש קטן או שווה למספר הלילות שנותרו והלקוח בעל תוכנית.Free השיטה משנה את הסטטוס של החדרים. התשלום עבור החדר החדש הוא מספר שנע בין ההפרש של התשלום לחדר החדש לחדר הנוכחי כפול מספר הימים, לבין מחיר מלא שזה מחיר החדר החדש כפול מספר הימים. לדוגמה אם מחיר החדר הנוכחי 100$ ללילה, מחיר החדר החדש 120$ ללילה, מספר הלילות המבוקש הוא 3 אז המחיר שהלקוח ישלם נמצא בין 3*20 לבין 3*120. חיוב שלילי משמעותו שהלקוח יקבל החזר. Class Customer movetoroom(room newroom, int NumberofDays):void require:.1 ensure: 12
המחלקה ConferenceCustomer מרחיבה את המחלקה.Customer המחלקה מייצגת לקוחות שמשתתפים בכנס שמתקיים בבית המלון. לקוחות אלה יכולים לעבור חדר גם אם בחרו בתכנית Limited אך בתנאי שמספר הלילות שבחרו גדול מ- 2 ומחיר החדר הוא לפחות כמחיר החדר הנוכחי. האם ניתן לכתוב חוזה שיאפשר את ההרחבה הנדרשת מבלי לשנות את החוזה של מחלקת האב? אם כן, רשמו חוזה לתת המחלקה שיאפשר הרחבה כזאת. אם לא הסבירו מדוע..2 _ המחלקה VIPCustomer מאפשרת ללקוחות VIP של בית המלון לעבור חדר בכל תכנית. אם מחיר החדר החדש גדול בכל היותר ב- 20% אחוז ממחיר החדר הנוכחי, הלקוח לא מחויב על החדר. אם המחיר גדול מ- 20% הלקוח משלם את המחיר של מחלקת העל עם הנחה נוספת של 10%. האם ניתן לכתוב חוזה שיאפשר את ההרחבה? אם כן, כתבו את החוזה. אם לא, הסבירו למה. מותר לשנות את החוזה של מחלקת העל..3 13
[ 15 ] כתיבת חוזה..2 השאלה מתמקדת בגרסת המבחן של משחק לוח "פנטגו", המהווה פיתוח של משחק ידוע "איקס מיקס דריקס". זה משחק לוח של 6X6 תאים, אשר מחולק לארבעה רובעים זהים.(Quadrants) המשחק מיועד לשני שחקנים, אחד עם כלים שלבנים ואחר עם שחורים. בתחילת המשחק הלוח ריק. לכל אחד משני השחקנים המשתתפים יש 18 כלים "בכיס", בצבע שלו. כאשר השחקן עם "הלבן" מקליק על משבצת ריקה, מופיעה בה אבן לבנה המיוצגת על ידי שינוי הצבע של התא ללבן, וכשהשחקן "השחור" מקליק על משבצת ריקה, מופיעה בה אבן שחורה המיוצגת על ידי שינוי הצבע של התא לשחור. מטרת המשחק: מטרתו של כל שחקן ליצור רצף של חמישה אבנים שלו )חמשה תאים מאותו צבע, לבן או שחור( על הלוח, אופקית, אנכית, או באלכסון. מהלך המשחק: המשחק מתנהל בתורות. השחקן הראשון נקבע באקראי. לכל שחקן בתורו יש שני צעדים אפשריים, והוא בוחר אחד מהם. האפשרות הראשונה היא להקליק על אחד התאים הריקים על הלוח ואז הצבע של התא משתנה לצבע של השחקן ומספר האבנים שלו קטן באחד. האפשרות השנייה היא לסובב את אחד הרובעים 90 מעלות, כאשר הכוונה בסיבוב בגרסה זו הזזה של האבנים בריבוע )לא התאים( 90 מעלות. למשל, במהלך סיבוב ימינה של רובע שמאלי עליון, כל אבן שהייתה בקואורדינטות (y,x) יעבור לתא (x,y-4). כל שחקן רשאי לעשות 18 סיבובים לכל היותר, כפי שמופיע באיור. המשחק נגמר, אם לאחד השחקנים נגמרו הכלים והוא עשה את כל הסיבובים המותרים. לחילופין, המשחק נגמר בניצחון, אם השחקן הצליח ליצור רצף של חמישה כלים שלו על הלוח, אופקית, אנכית, או באלכסון. y x 1 2 3 4 5 6 1 2 3 4 5 6 הערה: ניתן להניח קיום שלוש מחלקות :enumeration טיפוס Color עם 3 הערכים: Black, White, None 14 טיפוס Direction עם שני ערכים Left, Right rotatequadrant (UpLeft, Right) טיפוס Quadrant עם ארבעה ערכים: UpLeft, UpRight, DownLeft, DownRight
על המחלקה Pentago לספק את השירותים (features) הבאים: 1. initialize():pentago Purpose: creates a new Pentago object with two players and a board with 6*6 cells. 2. getcurrentplayer():color Purpose: returns the color of current player: Black or White 3. isgameover():boolean Purpose: returns true if game is over 4. clickmarble(int x, int y):int Purpose: sets the cell (x, y) to the color of the current player and returns the number of remained marbles of the current player. 5. rotatequadrant (Quadrant quadr, Direction dir):void Purpose: rotates the quadrant quadr to direction dir. 6. iswin(player Color):boolean Purpose: returns true if the given player won. False, otherwise 7. nextplayer():color Purpose: returns the next player. 8. getcell(int x, int y):cell Purpose: returns the cell in coordinates (x, y). 9. numberofrotations(player Color):int Purpose: returns the remained possible rotations number of the player player. על המחלקה Cell לספק את השירותים (features) הבאים: 10. getcolor():color Purpose: returns the color of cell: Black or White or None 11. setcolor(color Color):void Purpose: sets the cell color to Color 12. maxneighbors():int Purpose: returns the maximal number of neighbors of this cell of the same color, to any direction פיתוח חוזה עבור המחלקה :Pentago ] 12 [ עבור השיטות 1, 3, 4, 5, 6, 7 של המחלקה Pentago פתחו חוזה לפי הכללים לפיתוח חוזה שנלמדו בכיתה. ניתן להוסיף פעולות נחוצות חדשות אולם יש להצדיק כל הוספה ולכתוב חוזה עבורה אם יש צורך. אפשר כמובן להשתמש בשאר השאילתות שלא כתבתם עבורן חוזה. א. 15
הערה: בכתיבה של החוזה, עבור פונקציה מסוימת, כאשר יש יותר ממקרה אחד, מותר לכם לכתוב פירוט עבור מקרה מייצג ולכתוב הערה ששאר המקרים דומים עם שינויים קטנים. הערה: בכתיבת החוזה לפרוצדורה rotatequadrant ניתן לבחור בתור רובע מייצג רק את.DownLeft או את UpRight 16
] 3 [ במנשק )interface( שהתקבל הבחינו בין סוגי השאילתות והפעולות. יש להציג ארבע קבוצות: פעולות רגילות ו- initialization, ושני סוגי שאילתות. ב. בהצלחה! 17