Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

‫‪1‬‬

‫תיכון מונחה עצמים – מבחן לדוגמא‬


‫סמס‪ .‬ב תשפ"ב – מרצה ‪ :‬טוביה רוזנברג‬
‫מס‪ .‬קורס ‪10054 :‬‬
‫‪ .1‬על איזו צורך\בעיה עונה ה – ‪ Pattern‬של ‪( SingleTon‬יש להעתיק את התשובה הנכונה למחברת‬
‫הבחינה‪ .‬למשל אם אתה חושב שהתשובה הנכונה היא א אזי יש להעתיק למחברת הבחינה‬
‫"א‪)"Encapsulation .‬‬
‫א‪Encapsulation .‬‬
‫ב‪ .‬עקרון ה – ‪Open Close‬‬
‫ג‪ .‬שימוש במופע יחיד‬
‫ד‪ .‬מקביליות‬

‫‪ .2‬מפעל גדול לייצור מסכות הגנה החליט שעליו לחסוך את עמלת הסליקה ל ‪ . PayPal-‬לשם כך‪ ,‬דירקטוריון‬
‫המפעל החליט על השקעה בצוות ‪ R&D‬לשם בניית המערכת הנ"ל‪.‬לאחר סדרת ראיונות עבודה מתישה‬

‫‪1‬‬ ‫–התקבלת למפעל ונבחרת לממש את המערכת הנ"ל‪.‬להלן דרישות המערכת‪:‬‬


‫המערכת תאפשר ביצוע תשלום ב‪:‬‬ ‫•‬
‫‪ .1‬מזומן‬
‫‪ .2‬כרטיס אשראי‬
‫‪ .3‬כרטיס מתנה‬
‫ניתן לרכוש מספר מוצרים בהזמנה אחת‪.‬‬ ‫•‬
‫ביצוע תשלום הינו לכל הזמנה‪.‬‬ ‫•‬
‫תשלום באחד מסוגי הכרטיסים כולל גם תת‪-‬פעולה של סליקה‪.‬‬ ‫•‬
‫לכרטיס אשראי\מתנה יש את הנתונים הבאים‪:‬‬ ‫•‬
‫‪ .1‬שם ע"ג כרטיס‬
‫‪ .2‬מספר הכרטיס‬
‫‪ .3‬ספרות אחרונות בגב הכרטיס (‪)CVV‬‬
‫‪ .4‬תוקף הכרטיס‬

‫עליך‪:‬‬

‫‪1‬‬
‫‪2‬‬

‫להחליט מהו ה – ‪( Pattern‬מבין אלו שלמדנו) המתאים ביותר לבעיה הנתונה ולשרטט‬ ‫‪.1‬‬
‫‪ Class Diagram‬עבור ה‪.Pattern -‬‬
‫תשובה ‪ :‬ה – ‪ Pattern‬מתאים ביותר ה – ‪.Strategy‬‬
‫‪:Class Diagram‬‬

‫‪ .2‬עבור כל מחלקה בדיאגרמה ששרטטת – קבע מה שמה ומה תפקידה ב – ‪?Pattern‬‬


‫‪ – PaymentStrategy‬ה – ‪ Interface‬של ה – ‪Strategy‬‬
‫‪2‬‬ ‫‪ – CashStrategy‬מימוש ה – ‪ Strategy‬לרכישה במזומן‬
‫‪ – PayPalStrategy‬מימוש ה – ‪ Strategy‬לרכישה ב‪PayPal -‬‬
‫‪ - CreditCardStrategy‬מימוש ה – ‪ Strategy‬לרכישה ב‪CreditCard -‬‬
‫‪ – Item‬פריט בעגלת הקניות עם כמות ומחיר‬
‫‪ – ShoppingCart‬עגלת הקניות המכילה את ה – ‪ Items‬ומשתמשת ב ‪Strategy -‬‬

‫‪ .3‬ממש ב – ‪ Java/C++‬את המערכת הנ"ל ‪ ,‬לפי ה ‪ Pattern -‬ולפי הדיאגרמה שלך‪.‬‬


‫על מימוש לכלול ‪:‬‬
‫מימוש בסיסי של כל מחלקה בדיאגרמה‪.‬‬ ‫•‬
‫בנאים(‪ )Constructor‬לפי הצורך‪.‬‬ ‫•‬
‫מתודות – הדפסות למסך‪.‬‬ ‫•‬
‫‪ Main‬בסיסי המדגים הרצה (אחת לפחות) של המערכת‪.‬‬ ‫•‬
‫פלט הרצה‪.‬‬ ‫•‬

‫{ ‪public class Item‬‬


‫;‪private String upcCode‬‬
‫;‪private int price‬‬

‫‪2‬‬
3

public Item(String upc, int cost){


this.upcCode=upc;
this.price=cost;
}

public String getUpcCode() {


return upcCode;
}

public int getPrice() {


return price;
}
}
public class ShoppingCart {
//List of items
List<Item> items;

public ShoppingCart(){
this.items=new ArrayList<Item>();
}

3 public void addItem(Item item){


this.items.add(item);
}

public void removeItem(Item item){


this.items.remove(item);
}

public int calculateTotal(){


int sum = 0;
for(Item item : items){
sum += item.getPrice();
}
return sum;
}

public void pay(PaymentStrategy paymentMethod){


int amount = calculateTotal();
paymentMethod.pay(amount);
}
}

3
4

public interface PaymentStrategy {

public void pay(int amount);


}

public class CreditCardStrategy implements PaymentStrategy {

private String name;


private String cardNumber;
private String cvv;
private String dateOfExpiry;

public CreditCardStrategy(String nm, String ccNum, String


cvv, String expiryDate){
this.name=nm;
this.cardNumber=ccNum;
this.cvv=cvv;
this.dateOfExpiry=expiryDate;
}

@Override
public void pay(int amount) {
4 card");
System.out.println(amount +" paid with credit/debit

}
}

public class PaypalStrategy implements PaymentStrategy {

private String emailId;


private String password;

public PaypalStrategy(String email, String pwd){


this.emailId=email;
this.password=pwd;
}

@Override
public void pay(int amount) {
System.out.println(amount + " paid using Paypal.");
}
}

public static void main(String[] args) {


ShoppingCart cart = new ShoppingCart();

Item item1 = new Item("1234",10);

4
5

Item item2 = new Item("5678",40);

cart.addItem(item1);
cart.addItem(item2);

//pay by paypal
cart.pay(new PaypalStrategy("myemail@example.com",
"mypwd"));

ShoppingCart cart2 = new ShoppingCart();


Item item3 = new Item("4321",11);
Item item4 = new Item("8766",44);

cart2.addItem(item3);
cart2.addItem(item4);

//pay by credit card


cart2.pay(new CreditCardStrategy("Pankaj Kumar",
"1234567890123456", "786", "12/25"));
}
}

5
?‫ נוסף ניתן היה לשלב כאן ובאיזה שלב‬pattern ‫ איזה‬:‫שאלת בונוס‬ .4
.‫ על מנת ליצור את האסטרטגיות השונות לביצוע הרכישה‬Factory – ‫ניתן היה לשלב כאן את‬

‫ – לטובת לקוח פרמיום‬Office ‫ החליטה לבצע שינוי ושיפור של מוצרי ה‬Microsoft ‫ חברת‬.3
‫ (יש להעתיק את התשובה המליאה למחברת‬.‫ מה מהבאים הוא הגדרה נכונה למהלך זה‬,‫שלה‬
‫ שינוי‬.‫הבחינה למשל אם לדעתך תשובה א היא הנכונה אזי יש להעתיק למחברת הבחינה את "א‬
.)" - Customized products‫ ל‬- Generic products ‫המוצר מ‬
- Customized product‫ ל‬- Generic products ‫ שינוי המוצר מ‬.‫א‬
– Very Customize products‫ ל‬- Customized products ‫ שינוי המוצר מ‬.‫ב‬
- Generic products‫ ל‬- Customized products ‫ שינוי המוצר מ‬.‫ג‬
‫ אין תשובה נכונה‬.‫ד‬

5
‫‪6‬‬

‫‪ .4‬לפניך קטע קוד‪:‬‬


‫{ ‪Class Airline‬‬
‫{ )(‪Flight [] getFlights‬‬
‫…‬

‫}‬

‫}‬

‫האם הדיאגרמה הבאה תואמת את קטע הקוד הנתון?‬

‫במידה וכן – הסבר מדוע‪ .‬במידה ולא – הסביר מדוע‪ ,‬כתוב קטע קוד חדש שיתאים לדיאגרמה‬
‫הנתונה ושרטטו דיאגרמה חדשה כך שתתאים לקוד הנתון‪.‬‬

‫יחס המתואר בדיאגרמה הוא לא של תלות\ ‪( Dependency‬כמו בקוד) ‪,‬אלא‪ ,‬יחס של‬
‫‪6‬‬ ‫‪.Association‬‬

‫להלן קוד עם תיקון‪:‬‬

‫{ ‪Class Airline‬‬
‫{ )(‪void getFlights‬‬
‫;]‪Flight[] arr= new Flight[10‬‬
‫…‬

‫}‬

‫}‬

‫‪ .5‬להלן תיאור מערכת‪ ,‬שרטטו עבורה דיאגרמת רצף (‪ )Sequence Diagram‬עבור תיאור תרחיש של‬
‫"תהליך הכנת והגשת בחינה במכללה" במערכת כלשהיא של המכללה‪.‬‬
‫להלן תיאור תרחיש המקרה‪:‬‬

‫‪6‬‬
‫‪7‬‬

‫בשלב ראשון‪ ,‬על המדריך להודיע לסטודנטים על קיומה של בחינה‪ ,‬במועד מסויים ותוך פירוט חומר‬
‫הבחינה‪ .‬לאחר מכן עליו להכין את הבחינה (כולל פתרון הבחינה) ולמוסרה\ם בידי עובד חדר‬
‫הצילום על מנת לשכפלה\ם כמספר העותקים הנדרש‪.‬‬

‫בתאריך המיועד המדריך מחלק את עותקי המבחן לסטודנטים‪ ,‬הסטודנטים עונים את תשובותיהם‬
‫לשאלות הבחינה ובסיומה מחזירים את המבחן למדריך‪.‬‬

‫המדריך מגיש את מחברות המבחן‪ ,‬יחד עם עותק של פתרון הבחינה לעוזרי הסגל‬
‫)‪ ,(Teacher Assistances‬ומבקשם לבדוק את הבחינות ולתת ציון‪ .‬בסיום‪ ,‬המדריך יכתוב את ציוני‬
‫מבחן בגליון הציונים של הקורס ויידע את הסטודנטים בציוני הבחינה‪.‬‬

‫‪ .6‬לפניך דיאגרמת ‪ ,UML‬ענו על השאלות הבאות‪ ,‬בהקשרה‪:‬‬


‫מילון קצר‪ :‬דם – ‪ ,blood‬חי – ‪ ,alive‬ללדת – ‪ ,to give birth‬חולייתן (בעל חי בעל חוליות) –‬
‫‪ ,vertebrate‬אורך – ‪ ,length‬נחש – ‪ ,snake‬נמיה – ‪ .mongoose‬גובה – ‪.height‬‬
‫שים לב‪ ,‬המחלקה ‪ Vertebrate‬היא ‪.abstract class‬‬

‫‪7‬‬

‫א‪ .‬מהו סוג הקשר (יחס) בין 'חולייתן' ו‪'-‬חיה'?‬


‫‪SubClass‬‬
‫ב‪ .‬מהו סוג הקשר (יחס) בין 'נחש' ו‪'-‬חיה'?‬
‫‪SubClass‬‬

‫‪7‬‬
‫‪8‬‬

‫ג‪ .‬מהו סוג השיוך (‪ )association type‬בין 'נחש' ו‪'-‬נמיה'?‬


‫קשר של ‪Dependancy‬‬
‫ד‪ .‬האם ‪ 2‬נמיות יכולות לאכול נחש אחד? התייחסנה בתשובתכן לקשר וליחס הריבוי ביניהם‪.‬‬
‫לא‪ .‬כל נחש יכול להיאכל ע"י נמיה אחת‪.‬‬
‫מצא טעות אחת (טכנית‪ ,‬לא לוגית) בדיאגרמה הנ"ל לפי הכללים שלמדנו בקורס‪.‬‬
‫החץ בין חולייתן ל‪-‬חיה צריך להיות מקווקו‪.‬‬

‫‪ .7‬להלן הגדרה מתוך דרישת מערכת‪ ,‬אותה נרצה להדגים בדיאגרמת מחלקות(‪)Class Diagram‬‬
‫"לאדם ישנם בדיוק שני הורים ומספר כלשהוא של ילדים" ‪ .‬שרטט את הדיאגרמה בצורה הנכונה‬
‫‪8‬‬ ‫ביותר‪.‬‬

‫‪8‬‬
‫‪9‬‬

‫‪ .8‬במהלך הקורס למדנו על עקרון הכימוס ‪ Encapsulation‬תוך שימוש במספר ‪(Patterns‬תבניות)‬


‫א‪ .‬הסבר ב ‪ 2 -‬משפטים עיקרון זה(‪ 3‬שורות לכול היותר)‪.‬‬
‫העיקרון קובע שה – ‪ Class‬צריך להחביא\להסתיר כמה שיותר מהקוד שלו ולצמצם את החשיפה‬
‫של הפונקציות שלו והקוד שלו לכל מי שיוצר אובייקט מהטיפוס של ה – ‪.Class‬‬
‫ב‪ .‬מבין ה ‪ Patterns -‬שלמדנו – איזו תבנית מיישמת עקרון זה? הסבר כיצד והיכן העיקרון‬
‫מיושם בתבנית(‪ )Pattern‬שבחרת‪.‬‬
‫עיקרון ה – ‪ Command‬מיישם את ה – ‪ Encapsulation‬בכך שהוא חושף רק את ה – ‪Interface‬‬
‫ל – ‪ command‬ולא את ה‪ Command -‬עצמו(הערה ‪ :‬יש עוד ‪ Patterns‬ששומרים על עיקרון‬
‫הכימוס‪ .‬גם ה – ‪ Momento‬הוא דוגמא טובה)‪.‬‬
‫ג‪ .‬כתבו קוד ‪ Java‬המפר את עיקרון הכימוס‪ ,‬הסבר במשפט אחד היכן נמצאת ההפרה של‬
‫עיקרון הכימוס ? יש לכתוב ‪ class‬אחד(מתוך ‪ Pattern‬כלשהו) ובנוסף ‪ main‬קצר‪.‬‬

‫{ ‪public class Car‬‬


‫;‪public String name‬‬
‫;};‪public Car(String name) {this.name = name‬‬
‫‪9‬‬ ‫;};‪public String getName() { return name‬‬
‫;};‪public String setName(String name) { this.name=name‬‬
‫}‬

‫{ ‪public class Test‬‬


‫{ )‪public static void main(String[] args‬‬
‫;‪Car c‬‬
‫;)"‪c = new Car("Toyota‬‬
‫;)(‪String t = c.getName‬‬
‫;"‪c.name = "Opel‬‬
‫}‬
‫}‬

‫הפרת עיקרון הכימוס נובעת מהעובדה שה – ‪ name‬הוא ב – ‪ public‬וניתן לו גישה מחוץ ל ‪Class -‬‬

‫‪ .9‬שרטט וכתוב את שם הקשרים בדיאגרמת מחלקות (‪ )Class Diagram‬עבור היחסים הבאים‬


‫‪Is-a .a‬‬
‫‪Has-a .b‬‬

‫‪IS RELATIONSHIP‬‬

‫‪9‬‬
‫‪10‬‬

‫‪10‬‬
‫‪HAS A RELATIONSHIP‬‬

‫‪ .10‬מהו עיקרון ה – ‪ Open/Close‬מה – ‪ ? Solid‬איזה בעיה הוא לפי דעתך מנסה לפתור ? באיזה‬
‫עקרון מהטכניקה של תיכנות מונחה עצמים ניתן להבטיח שה ‪ Class‬שרוצים להוסיף לו יכולות ‪,‬‬
‫יעמוד בעקרון של ‪ ? Open/Close‬כתוב ‪ Class‬פשוט (יש לכתוב רק את החתימה של הפונקציה‪.‬‬
‫ללא המימוש‪ .‬אפשר לוותר על ה ‪ )Constractor -‬לפני הוספות ואחרי ההוספות תוך עמידה‬
‫בעיקרון ה – ‪.Open/Close‬‬
‫עיקרון ה – ‪ Open/Close‬קובע שקוד שנבדק והוטמע בגירסה אין לשנות‪ .‬אפשר להוסיף קוד‬
‫‪,‬אבל‪ ,‬לא לשנות את הקיים‪ .‬לדוגמא ‪ Class:‬שבצעו עליו את הבדיקות והוא נקי משגיאות והוטמע‬

‫‪10‬‬
‫‪11‬‬

‫בגירסה‪ ,‬כדי להוסיף לו יכולות אסור לשנות את ה – ‪ Class‬עצמו אלא יש להשתמש בהרחבה שלו‬
‫כמו בירושה(‪ )Inheritance‬או בהכלה (‪.)Aggregation/Composition‬‬
‫דוגמא לקוד והרחבה שלו ע"י ירושה תוך שמירה על עיקרון ה – ‪:Open/Close‬‬
‫{ ‪public class Calculator‬‬
‫;)‪pubic int Add(int a,int b‬‬
‫;)‪pubic int Substract(int a,int b‬‬
‫}‬

‫{ ‪public class Operation extends Calculator‬‬


‫;)‪pubic int Multiply(int a,int b‬‬
‫;)‪pubic int Divide(int a,int b‬‬
‫}‬

‫‪ .11‬אלו מהבאים הינן שיטות לגילוי דרישות )‪.(Requirement Elicitation‬יש להעתיק את התשובה‬
‫הנכונה למחברת הבחינה‪ .‬למשל אם לדעתך תשובה א היא הנכונה אזי יש להעתיק למחברת‬
‫הבחינה את "א‪ .‬תרחישי שימוש – ‪."USE CASE‬‬
‫א‪ .‬תרחישי שימוש – ‪USE CASE‬‬
‫ב‪ .‬ראיונות ותצפיות על סביבת העבודה‬
‫‪11‬‬ ‫ג‪ .‬כל התשובות נכונות‬
‫ד‪ .‬למידת מערכות קיימות‬

‫‪ .12‬מהנדס ה‪ QA -‬מצא באג חמור במערכת‪ ,‬זמן קצר לפני הטמעת הקוד החדש אצל הלקוח‪.‬‬
‫סמנכ"ל הכספים טוען‪ ,‬כי זה מצב חמור מאוד‪ ,‬הגורם להפסד משמעותי לחברה‪ ,‬ויש למצוא דרך‬
‫להימנע מהישנות אירועים דומים בעתיד‪ ,‬ככל שניתן‪ .‬ראש צוות ה ‪ - QA‬טוען כי הצדק עם סמנכ"ל‬
‫הכספים ושככל שמדובר בשלב מוקדם יותר – קל יותר למצוא את הפגמים‪ .‬ארכיטקט המערכת‪,‬‬
‫בגיבויו של מנהל המוצר טוענים כי תפקידם הוא אך ורק לגבש ולנסח את הדרישות ביחד עם הלקוח ‪.‬‬
‫צוות הפיתוח טוען כי תפקידו לכתוב קוד ובדיוק לשם כך נועד צוות ה – ‪- QA‬למצוא פגמים ואין דרך‬
‫לעשות זאת לפני שהקוד כתוב‪.‬‬
‫א‪ .‬מי לדעתך צודק? במידה ויש כמה דמויות שצודקות – מי "הכי צודק" ?‬
‫ראש צוות ה – ‪ QA‬הוא הצודק ביותר‪ .‬ניתן לבצע בדיקות יחידה כבר בשלב הפיתוח ולצמצם את‬
‫הסיכונים לשגיאות תוכנה עוד לפני הכניסה לסבב בדיקות‪.‬‬
‫ב‪ .‬נמק את תשובתך והבא ‪ 2‬הסברים התומכים בטענה‪ 5(.‬שורות לכול היותר)‬
‫‪ .1‬ניתן לבדוק קוד באמצעות כתיבת קוד בספריות ‪ JUNIT‬המבצעות ולידציה על הקוד שהמפתח‬
‫כותב‪.‬‬

‫‪11‬‬
‫‪12‬‬

‫‪ .2‬ניתן לכתוב ב‪ Junit -‬בדיקות מקיפות יותר כמו בדיקות אינטגרציה או בדיקות מערכתיות ואז‬
‫לצמצם עוד יותר את הסיכונים לאירועים מהסוג הנ"ל‪.‬‬

‫‪12‬‬

‫‪12‬‬

You might also like