Professional Documents
Culture Documents
תיכון - מבחן מועד א כולל פתרונות
תיכון - מבחן מועד א כולל פתרונות
סה"כ 13 12 11 10 9 8 7 6 5 4 3 2 :שאלה 1
100 8 8 8 8 8 2 8 8 8 8 8 9 9 :ניקוד
1
2
במערכת תוכנה לפיתוח אפליקציות לטלפונים סלולריים הוחלט להשתמש בתבנית העיצוב()Pattern .1
.SINGLETONהמערכת משתמשת ברכיבי אמולטור לטלפונים סלולריים כך שניתן לפתח
אפליקציות על גבי האמולטור מבלי להזדקק למכשיר הטלפון .כל אמולטור (סמסונג ,שיאומי )...LG ,
הוא אובייקט במערכת המדמה טלפון סלולרי(כמו משחק Flight Simulatorהמדמה מטוס אמיתי).
המערכת לא מעוניינת ליצור את אותו אובייקט יותר מפעם אחת.
כלומר ,במידה ונוצר כבר אמולטור מסוג מסויים – לא ניצור אותו שוב אלא נשתמש באובייקט הקיים.
לשם כך ,מפתחי המערכת עשו התאמה לתבנית העיצוב SINGLETONבהתאם לצרכיהם.
לפניך מחלקה ( ,CellEmulator )classכפי שמהנדסי התוכנה כתבו:
.בודק התוכנה ,נוכח לדעת כי קיימת בעיה ,והמימוש הנ"ל אינו עונה על הדרישות
הסבר את הבעיה במימוש הנ"ל. א.
ממש את המחלקה הנ"ל מחדש תוך פתרון הבעיה הנ"ל(יש לכתוב את הקוד של ה – Class ב.
מחדש).
שים לב ,ניקוד יינתן רק עבור פתרון לבעיה הנכונה ,ולא באופן רילטבי\יחסי לבעיה שציינת בסעיף א.
2
3
:1 פתרון שאלה
הבעיה במימוש הנ"ל הוא שהיא לא עונה על הדרישה המערכת ליצור אובייקט אחד מכל .א
נקבל אתSamsung ואח"כ אתXiomi () אתgetInstance – אם (לדוגמא) נעביר ל.אמולטור
.Samsung אותו אומלטור\אובייקט בפעם השנייה כשנקרא לפונקציה עם
:הקוד עם הפתרון .ב
private CellEmulator () { }
if (emulators.ContainsKey(cellManufacturer)) {
return emulators.getValue(cellManufacturer);
else{
emulators.add(cellManufacturer,ce);
return ce;
3
4
A interface is called FAT when it has too many methods which contains more
information than we really want.
interface Gesture {
func didTap()
func didDoubleTap()
}
func didDoubleTap() {
// not required this method
}
}
.) שורות לכול היותר2 ?(תשובה באורך שלISP הסבר מדוע הקוד לעייל נוגד את עיקרון .א
יש לכתוב את הקוד כולו.ISP – שנה את הקוד לעייל כך שהוא לא יהיה בניגוד לעיקרון ה .ב
.)קוד-במחברת הבחינה (בשיטת פסודו
– ? הסבר את הISP – מאלו שנלמדו בקורס מדגיש ומרחיב את עיקרון הPattern איזה .ג
הסבר. שורות5 (תשובה באורך של עד.ISP – בקצרה תוך הדגשה על הקשר שלו לPattern
Pattern- אין קשר ישיר בין ה. אין צורך לשרטט דיאגרמה או לכתוב קוד בסעיף זה.כללי בלבד
.)לסעיפים הקודמים
4
5
{ interface GestureA
)(func didTap
}
{ interface GestureB
}
{ )(func didTap
}
{ )(func didDoubleTap
}
}
ה Facade -דורש interfaceרזה שמכיל כמה שפחות פונקציות עם כמה שיותר ג.
פרמטרים העונים על דרישת המערכת .למשל interfaceאחד להזמנת חופשה המכיל
פרמטרים של חופשה,טיסה ומלון.
5
6
חברת טלדור מפתחת אפליקציה האוספת נתונים ממרכזיית טלפון של שירות לקוחות ואוגרת אותם .3
בבסיס נתונים ( SQLכגון . )SQL Serverלכול נציג הנכנס למערכת מוקצית שלוחה ממרכזיית
הטלפון.
המערכת מתחברת לשלוחות טלפון רבות ומתעדת את השיחות היוצאות והנכנסות (מס .טלפון
נכנס\יוצא ,זמן כניסת השיחה ,אורך השיחה והנציג בשיחה) .לכול נציג( )Agentהנכנס למערכת ,
התוכנה יוצרת Threadהמטפל בתיעוד השיחות הנכנסות והיוצאות מהשלוחה של הנציג .הנציג יכול
לבקש מהאפליקציה להקליט את השיחה ואם הוא מקבל את ההרשאה אזי ה – Threadהמטפל
בנציג מקבל הודעה מהאפליקציה שעליו להקליט את השיחה עד סיומה .ההרשאה להקליט את
השיחה ניתנת אך ורק לשיחה מסוימת ולא לכול השיחות של הנציג .הצע Design Patternהמתאים
למימוש תוכנה כזו (התייחס אך ורק לבקשה לתיעוד השיחה וההקלטה שלה .התעלם מהאלגוריתם
המקבל החלטה האם הנציג יכול להקליט או לא את השיחה) .
בתשובתך התייחס למספר הנחות:
ישנם נציגים שלא יכולים לבקש כלל הקלטה .גם כאן התעלם מהשיקולים אילו נציגים יכולים לבקש
הקלטה ואילו לא .התייחס אך ורק לעובדה שלא לכול הנציגים יש הרשאה להקליט שיחות(.הסבר
כללי בלבד על ה – Patternהמתאים [כולל נימוק] עד 5שורות .אין צורך לכתוב קוד או לצייר
דיאגרמה בשאלה זו).
פתרון שאלה :4
DesignPatternהמתאים לשימוש בקשת תיעוד השיחה של הנציג הוא ה .Observer -מכיוון שה
– Threadנוצר עבור כל נציג והוא צריך לקבל הודעה רק כאשר יש בקשה להקלטה ולא לדגום (
)POLLאת המערכת כל הזמן .ה – Observerיעדכן את ה – Threadשל הנציג( )Notifyהאם יש
לו הרשאה להקליט את השיחה או שלא .נציג שאין לו הרשאה יקבל עדכון מה – Subjectשהוא
לא יכול להקליט.
חברת המשחקים "יצירה" החליטה לפתח מערכת משחקים רב משתתפים למשחקי שחמט. .4
לטובת יצירת המערכת הוגדרו הדרישות הבאות:
המערכת צריכה לתמוך בהצעת משחקים לזוגות של שחקנים (רצוי שחקנים מאותה רמה).
6
7
המערכת תתעד עבור כל שחקן את היסטרית המשחקים כולל מספר הניצחונות וההפסדים .
המערכת מאפשרת למנהל לראות דוחות סטטיסטיקת שימוש שונות באתר .
7
8
? Abstract Factory – וPatterns : Factory – הסבר את ההבדל העיקרי בין שני ה .א
אין צורך בסעיף זה לרשום קוד או לשרטט.) הסבר כללי בלבד. שורות בלבד לכול היותר2(
.דיאגרמה
אוFactory שלPattern – ענה (הסבר ונימוק) האם הקוד הרשום בסעיף ג תואם ל .ב
) שורות בלבד2 ?(לרשותךAbstract Factory
יש להשלים אותו על מנת שיעבוד בהתאם לתשובה שענית בסעיףJAVA – לפניך קוד ב .ג
\ יש להעתיק למחברת הבחינה רק את השינויים. תקן את הקוד במחברת הבחינה.הקודם
.יםClass – משתנים ו, מותר להוסיף\לשנות\למחוק פונקציות\מתודות.תוספות שביצעת
8
9
// Client
public class Client{
public static void main(String args[]){
AbstractFactory pf=FactoryMaker.getFactory("a");
AbstractProductA product=pf.createProductA();
//more function calls on product
}
}
Class -ים לעייל(אחרי התיקונים שביצעת בסעיף הקודם) בClass -הצג את הקוד של ה .ד
. במחברת הבחינהDiagram
:5 פתרון שאלה
9
10
תוך מימוש אלגוריתם, המייצר אובייקטים מטיפוס אחדPattern (מפעל) הואFactory .א
הוא למעשהAbstract Factory .כלשהו המגביל את כמות האובייקטים שהמערכת מייצר
כלומר מפעל של מפעלים שכל אחד מהם מחליט על כמות, Factory שלFactories
.האובייקטים שהמערכת מייצרת מטיפוס כלשהו
.Abstract Factory – ולכן מדובר בFactories הקוד עושה שימוש בכמה .ב
:פתרון הקוד .ג
abstract class AbstractProductA{
public abstract void operationA1();
public abstract void operationA2();
}
10
11
AbstractProductB createProductB(){
return new ProductB("ProductB");
}
}
//Factory creator - an indirect way of instantiating the
factories
class FactoryMaker{
private static AbstractFactory pf=null;
static AbstractFactory getFactory(String choice){
if(choice.equals("a")){
pf=new ConcreteFactoryA();
}else if(choice.equals("b")){
pf=new ConcreteFactoryB();
}
return pf;
}
}
// Client
public class Client{
public static void main(String args[]){
AbstractFactory pf=FactoryMaker.getFactory("a");
AbstractProductA product=pf.createProductA();
//more function calls on product
}
}
11
12
ד.
א .מה משמעות ה – Annotationשל @ testב – ( ? Junitתשובה באורך של 2שורות בלבד .6
במחברת הבחינה .הסבר כללי בלבד).
האם ה – Annotationיכולה לחזור על עצמה ב – ? Classיש לנמק את תשובתך( .תשובה ב.
באורך של שורה אחת בלבד).
מה היתרון של בדיקת קוד באמצעות ספריות JUNITעל פני בדיקת קוד שכתוב ב?MAIN - ג.
הסבר ונמק( .תשובה כללית בלבד באורך של 3שורות לכול היותר).
מה הם ארבעת שלבי הבדיקות ? פרט את השלבים ואת המשמעות של כל שלב(.תשובה ד.
באורך של 5שורות בלבד לכול היותר).
נניח ואתה מבצע שינוי קטן במערכת (למשל הוספת שדה בטופס) ועליך לבדוק את השינוי הזה ה.
באיזה שלב בבדיקות השינוי הזה ייבדק? (תשובה באורך של 5שורות לכול היותר).
כל @ testהוא UnitTestשרץ באופן עצמאי ומבצע בדיקה כלשהי על פונקציה שקיימת בתוכנה. א.
בוודאי .יכולים להיות מספר testים באותו Classשמבצעים בדיקות שונות. ב.
12
13
;)(void checkEmailInfo
;)(void removeEmail
}
13
14
Class MATH {
9. LSP (LISKOV Substitution Principle from SOLID) : Objects should be replaceable with their
subtypes without affecting the correctness of the program.
@Override
public void setHeight(int height) {
super.setHeight(height);
}
14
15
@Override
{ )public void setWidth(int width
;)super.setWidth(width
}
}
הסבר מדוע הקוד של ה – Squareלעייל בעייתי ?( 4שורות לכול היותר .הסבר כללי בלבד) א.
הצע פתרון לסעיף הקודם תוך שינוי(בלבד) בקוד של ה – Squareבלבד .אין להוסיף Classים ב.
חדשים ואין להוסיף פונקציות\מתודות חדשות .יש להעתיק למחברת הבחינה את ה – Square
Classכולל השינויים שלך.
הסבר מדוע הקוד הנ"ל(כולל הפתרון בסעיף הקודם) סותר את עיקרון ה – LSPמה.SOLID - ג.
הצע פתרון שיענה על העיקרון ה – .LSPהצעת הפתרון יכולה להיות הסבר כללי או Class
.Diagramבהצעת הפתרון אין צורך לציין פונקציות או משתנים.
פתרון שאלה :9
הקוד בעייתי מכיוון שניתן לקרוא לפונקציית setWidthאו לפונקציית setHeightבנפרד ואז א.
נקבל צורה בה הצלעות לא שוות ,מה שכמובן סותר גיאומטרית את מבנה הריבוע.
קוד: ב.
{ public class Square extends Rectangle
@Override
{ )public void setHeight(int height
;)super.setHeight(height
;)super.setWidth(height
}
@Override
{ )public void setWidth(int width
)super.setWidth(width
;)super.setHeight(height
}
הקוד סותר את העיקרון של LSPכי העיקרון קובע שניתן להחליף כל Derived Classב- ג.
Base Classמבלי לשנות את הקוד (למעט ההחלפה) והתוכנה תרוץ כמו לפני השינוי.
במקרה לעייל Squareהוא איננו סוג של Rectangleולכן החלפה כזו לא אפשרית
בתוכנה וזה בניגוד לעיקרון LSPמה – .SOLID
Integer,Double,Float .10
הם Classים המאפשרים לשמור ערכים מספריים\נומריים באובייקטים .לדוגמא הקוד הבא :
15
16
מפעל לייצור לוויינים( )Satelliteשל התעשייה האווירית החליט להוציא החוצה את ייצור המשגר .11
למפעל חיצוני .זכית במכרז ונבחרת לבצע את המשימה של ייצור המשגר .עליך לכתוב מערכת
שתממש את פעולת המשגר .הדרישה המרכזית היא שהמשגר יתמוך ב – 2פעולות מרכזיות.
לחצן ראשון :הפעלת מבערים .לחצן שני :שיגור.
ממש את המערכת בשפת JAVAאו ב – ++Cתוך שימוש ב – Patternהמתאים ביותר א.
למשימה מבין אלו שלמדנו .על הקוד להכיל בין היתר את המחלקות Launch , Burner :
ואת פונקציית .MAIN
כתוב בבירור את שם התבנית( )Patternשבחרת ושרטט Class Diagramהמתאים למימוש ב.
שלך.
16
17
17
18
18
19
}
}
סעיף ב:
משרד התחבורה מתכנן רשת כבישים חדשה שתשרת את העיר החדשה הנבנית בימים אלה ,עיר .12
הימים .כדי לסמלץ\לדמות את עומסי התנועה באזור יש להציג את הרכבים על המפה .המערכת
תומכת ב 2-סוגי רכבים :מכוניות ומשאיות .המתכנת כתב את הקוד הבא :
;)(>ArrayList<Vehicle> vehiclesList = new ArrayList<Vehicle
19
20
הסבר את הבעייתיות בקוד לעייל ?( 3שורות לכול היותר .הסבר כללי בלבד) .אין צורך בסעיף זה א.
לכתוב קוד או לשרטט דיאגרמה.
הצע פתרון חלופי תוך הסתמכות על אחד מהתבניות ( )Design Patternשלמדנו בקורס .הסבר ב.
מדוע ה – Patternפותר את הבעייתיות שכתבת בסעיף הקודם .אין צורך לכתוב את הקוד מחדש
לעייל או לשנות אותו.
להלן קוד העושה שימוש ב – Abstract Factoryומצייר צורות על המסך(הקוד נלמד באחד .13
מהשיעורים בקורס) :
;)AbstractFactory shapeFactory=FactoryProducer.getFactory(false
;)"Shape shape1 = shapeFactory.getShape("RECTANGLE
;)(shape1.draw
;)"Shape shape2 = shapeFactory.getShape("SQUARE
;)(shape2.draw
;)AbstractFactory roundedShapeFactory=FactoryProducer.getFactory(true
;)"Shape shape3 = roundedShapeFactory.getShape("ROUNDED_RECTANGLE
;)(shape3.draw
;)"Shape shape4 = roundedShapeFactory.getShape("ROUNDED_SQUARE
;)(shape4.draw
20
21
הקוד לא תומך בפעולת . UNDOהצע שיפור לקוד לעייל תוך הסתמכות על אחד מה – א.
Patternsשנלמדו בקורס כדי שיתמוך ב( .UNDO -הסבר כללי בלבד על ה – Pattern
המתאים 3 .שורות לכול היותר) .אין צורך בסעיף זה לכתוב קוד או לשרטט דיאגרמה.
יש לכתוב קוד ב – JAVAתוך הסתמכות על ה – Patternמהסעיף הקודם המאפשר לבצע את ב.
פעולת ה – .UNDOאין מגבלה על הוספה(או שינוי) Class/Methods/Variablesבסעיף זה.
יש לשנות את הקוד לעייל כך שיעשה שימוש ב – ( UNDOניתן לבחור בפקודת UNDOבכול ג.
מקום בקוד לעייל .מקום הקריאה ל – UNDOנתון לבחירתך .ניתן לקרוא ל – UNDOיותר
מפעם אחת) .רשום במחברת הבחינה את הקוד לעייל (כולו) כולל השינויים שלך.
פתרון שאלה :13
שימוש ב – Patternשל Momentoיפתור את הבעיה של תמיכה ביכולת .UNDO א.
הקוד: ב.
{ )(public Memento
;this.state = null
}
21
22
22