68
1 "םםםםם םםםםם םםםםם םםםםם- "םםםםםםם ם םםם"ם –2008 םםם- םםם םםםםם םםםםם םםםםם םםםםם םםםםם םםםםםםם םםם"ם- םםםם םםם20.02.2008 םםם6 : םםםםםם םםםםםם םםםםםםם

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח

  • Upload
    olesia

  • View
    73

  • Download
    6

Embed Size (px)

DESCRIPTION

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח. מפגש שני - 20.02.2008 פרק 6: הפניות ועצמים מורכבים. העמקה כבסיס לכל הרצף מכאן ואילך: הפניה עצם מורכב עצם מורכב המכיל הפניה מסוג עצמו. פרק 6 הפניות ועצמים מורכבים. מכאן כבר תהיה לנו דרך סלולה להגדרות בפרקים הבאים: - PowerPoint PPT Presentation

Citation preview

Page 1: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

1 "השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח

20.02.2008מפגש שני -

6פרק :

הפניות ועצמים מורכבים

Page 2: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

2

6פרק

הפניות ועצמים מורכבים

העמקה כבסיס לכל הרצף מכאן ואילך: הפניה עצם מורכב עצם מורכב המכיל הפניה מסוג עצמו

Page 3: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

3

6פרק

הפניות ועצמים מורכבים

מכאן כבר תהיה לנו דרך סלולה להגדרות בפרקים הבאים:

עצם מורכב המכיל הפניה מסוג עצמו(חוליה( שרשרת חוליות אוספים בעזרת שרשרת חוליות ייצוג אוספים מחלקה )עטיפה(כתכונת שרשרת החוליות יצירת טיפוסי אוסף מופשטים ...

Page 4: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

4

.כאשר נוצר עצם, מוקצה לו שטח בזיכרון הפניה כתובת העצם בזיכרון נקראת

(reference.) השימוש העיקרי בהפניה הוא כדי להגיע אל

העצם ולבקש ממנו לפעול. הפניהמשתנה מטיפוס מחלקה מכיל את ה

ולא את העצם עצמו.לעצם

מבוא

Page 5: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

5

מי היא השלישייה הפותחת?

המשתנה המחזיק את

ההפניה

העצם

ההפניה )כתובת(

Bucket b1

Page 6: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

6

ההפניה הריקה שאינה מפנה nullלעצם נקראת

Bucket b=null; Turtle t=null; String s=null;

int[] a=null;

int iNum=null;

Error: incompatible typesfound : <nulltype<

required: int

אגב האיור המוכר – נעלם

ערך מיוחד: ההפניה הריקה

Page 7: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

7

"-ים nullהאם יש ה-"שונים?

Teacher t=null;Student s=null;if)t==s(System.out.println)“yes”(; else System.out.println)“no”(;

Error: incomparable Teacher and Student

ערך מיוחד: ההפניה הריקה

Page 8: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

8

ההפניה היא הידית אל העצם

הדרך להגיע אל העצם

)שימו לב לנוסח(לבקשו להפעיל את פעולותיו

הפניה היא ערך במשתנה

צריך להיות ערוך להכיל המשתנה מטיפוס המחלקההפניות כלומר הוא

ולכן יוכל להכיל הפניות למופעיה!!

Page 9: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

9

אתחול משתנים

Box b1;

b1.setWidth(5);

משנה מצב לעצם שאינו קיים

Error: variable b1 might not have been initialized

משתנים שאינם מאותחלים גורמים לשגיאת הידור!

Page 10: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

10

אתחולים

מטיפוס המחלקה יאותחל לערך הפניהמשתנה .מאותו טיפוס כלשהו

הוא ערך תקני לאתחולnull הערך

Page 11: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

11

אתחול סביר יהיה על ידי בניית מופע של המחלקה

והצבתו במשתנה.

Bucket b1 = new Bucket)4(;

אתחול משתנים

Page 12: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

12

אתחול אפשרי אחר: הצבת מופע קיים לתוך

המשתנה:

Bucket b1 = new Bucket)10(;

Bucket b2 = b1;

זוהי העברת ערך של משתנה מטיפוס אותה מחלקה למשתנה "שלנו".

אתחול משתנים

Page 13: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

13

שימוש בפעולה בונה מעתיקה )אם קיימת!!(:

Bucket b1 = new Bucket)10(;

Bucket b2 = new Bucket)b1(;

אתחול משתנים

Page 14: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

14

אתחול משתנים

NullPointerException

גורמת nullהפעלת פעולה על משתנה שערכו לשגיאת זמן ריצה!

האתחול לערך ההפניה המיוחד - ההפניה הריקה:

Bucket b1 = null;;)b1.fill)10האתחול חוקי לחלוטין

Page 15: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

15

אתחול משתנים

Error: variable b1 might not have been initialized

משתנים שאינם מאותחלים גורמים לשגיאת הידור!

משתנה מטיפוס מחלקה שהוצהר ולא אותחל –

!!! nullלא מקבל Bucket b1;If)b1==null(System.out.println)“null”(;

Page 16: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

16

השוואות - הפניות ועצמיםBucket b1=new Bucket)10(;

Bucket b2=new Bucket)10(;

if)b1==b2(System.out.println)“Yes”(; else System.out.println)“No”(;

Bucket b1=new Bucket)10(;

Bucket b2=new Bucket)b1(;

Page 17: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

17

השוואות - הפניות ועצמיםBucket b1=new Bucket)10(;

Bucket b2= b1;

if)b1==b2(System.out.println)“Yes”(; else System.out.println)“No”(;

if)b1.getCapacity)(==b2.getCapacity)( && b1.getCurrentAmount)(==b2.getCurrentAmount)((…

if )b1==b2( … עצםאותובדיקה האם יש שתי הפניות אל

זהים?עצמיםואיך לבדוק האם

Page 18: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

18

מערך של עצמים הכרזה על משתנה שבעתיד

)ולא יחזיק הפניה למערך מערך!(

Box[] arr;

יצירת עצם מערך והצבת הפניה לעצם בתוך המשתנה

arr=new Box[5];

בעת יצירת מופע של עצם מתבצע אתחול

שלו

תאים במערך מאותחלים על פי ברירת

המחדל

Page 19: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

19

מערך של עצמים - אתחול תאים

:אתחול תאי המערךarr[0] = new Box)1, 2, 5(;arr[1] = new Box)3, 2, 1(;arr[2] = new Box)2, 2.5, 2(;

ובסלנג נאמר כך:

Page 20: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

20

עבודת כיתה 4דף עבודה מספר

Page 21: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

21

עצם מורכב

את עניין ההפניה חדד כל המבוא בפרק אמור לואופן החזקת עצמים והגעה אליהם

ורק אז מגיעים לשלב נוסף חשוב שהוא:

עצם מורכב

Page 22: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

22

עצם מורכב

כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי,

אנו קוראים לעצם הנוצר מהמחלקה

( composite object )עצם מורכב

כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי,

אנו קוראים לעצם הנוצר מהמחלקה

( composite object )עצם מורכב

Page 23: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

23

)מגדירה עצם מורכב(ייצוג המחלקה

public class Student

{

private String name;

private String phoneNum;

private Parent parent;

…}

public class Student

{

private String name;

private String phoneNum;

private Parent parent;

…}

Page 24: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

24

סדר הגדרת העצמים מגדיר תלות ביניהם

ראשון מוגדר הורה פשוט עצם שהוא

אחריו מוגדר תלמיד שהוא בעל תכונה "הורה"

עצם מורכב – בסוף נגדיר רשימה

כיתתיתמורכב "יותר" עצםשהיא

Page 25: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

25

הדוגמה המלווה:

מערכת בית ספרית

??)…( setNameהיכן פעולות ה-

String nameString cellNumString nameString cellNum

Parent

Parent (String name, String cellNum) String getName() String getCellNum() void setCellNum(String cellNum)

Parent (String name, String cellNum) String getName() String getCellNum() void setCellNum(String cellNum)

String nameString phoneNumParent parent

String nameString phoneNumParent parent

Student

Student (String name, String phoneNum, Parent parent)String getName()String getPhoneNum()void setPhoneNum (String phoneNum)Parent getParent()

Student (String name, String phoneNum, Parent parent)String getName()String getPhoneNum()void setPhoneNum (String phoneNum)Parent getParent()

Page 26: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

26

public Student )String name, String phoneNum, Parent parent(

{

this.name = name;

this.phoneNum = phoneNum;

this.parent = parent;

}

בונה פעולה

Page 27: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

27

העברת הפניה כפרמטר:בעיה של עודף הפניות לעצם אחד

כמה הפניות?

הפניה לפני הזימון

משתנה מקומי בפעולה

הפניה של התכונה

public Parent getParent)({Parent p1=this.parent;return p1;}

Parent par = st1.getParent;)(

par

הפניה אחרי הזימון

Page 28: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

28

:ההורה נרשם במאגר ההוריםParent p1 = new Parent )"Katz Meir", "054-2345678"(;

: התלמיד נרשםStudent st1 = new Student )"Katz Oren", "02-8765432", p1(;

התלמיד רישום

Page 29: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

29

public Parent getParent)({

return this.parent;}

)(getParent הפעולה

Parent p = st1.getParent;)(

String parentName = p.getName;)(

או בשורה אחת:

String parentName = st1.getParent)(.getName)(;

Page 30: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

30

מחלקה מטיפוס תכונה

עד כה ראינו את הקוד של המחלקה באופן .כללי

עתה ננסה להבין, מה המשמעות של הקוד .מבחינת ההתרחשות בזיכרון

:נתמקד בתכונה מטיפוס מחלקה

;Parent parent

עד כה ראינו את הקוד של המחלקה באופן .כללי

עתה ננסה להבין, מה המשמעות של הקוד .מבחינת ההתרחשות בזיכרון

:נתמקד בתכונה מטיפוס מחלקה

Parent parent;

Page 31: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

31

פעולה בונה זימון:

=Parent p1new;Parent)"Katz Meir", "054-2345678"(

=Student st1new;Student)"Katz Oren","02-8765432",p1(

זימון:

Parent p1=new Parent)"Katz Meir", "054-2345678"(;

Student st1=new Student)"Katz Oren","02-8765432",p1(;

Student

namephoneNumparent

st1

p1Parent

name cellNum

public Student )String name, String phoneNum, Parent parent({ …

this.parent = parent;}

Page 32: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

32

:)(getParentגוף הפעולה public Parent getParent)(

{

return this.parent;

}

: שימוש בפעולהParent p1=new Parent)"Katz Meir", "054-2345678"(;Student st1=new Student)"Katz Oren", "02-8765432", p1(;

Parent p2=st1.getParent;)(p2.setCellNum )"052-6782345"(;

הפניה כערך החזרה

ציירו תרשים עצמים המתאר את העצמים הקיימים בקטע

הקוד המופיע למעלה ואת מצבם בסוף הקטע.

Page 33: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

33

הפניה כערך החזרה

Parent p1=new Parent)"Katz Meir","054-2345678"(;

Student st1 = new Student )"Katz Oren", "02-8765432", p1(;

Parent p2 = st1.getParent;)(

p2.setCellNum )"052-6782345"(;

p1

Parent

name cellNum

Katz Meir 054-2345678

p2

052-6782345

st1Student parent

Katz Oren 02-8765432

name phoneNum

Page 34: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

34

האם ריבוי הפניות היא בעיה?

לא בהכרח יכול להיות מצב בו נהיה מעוניינים לשתף

כמה עצמים כך שיפנו לגורם משותףבמקרים אחרים שיתוף כזה הוא הרסני יש דרכים שונות )לא כולן רצויות( לשנות

את תכונות העצמים

Page 35: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

35

הפניות שונות לאותו עצם – הפן החיוביאם נרצה לעדכן את הטלפון הסלולארי של ההורה, •

מספיק לעשות זאת דרך אחד האחים. העדכון ישתקף אצל יתר האחים

כאשר שני אחים )או יותר( לומדים באותו בית ספר, אזי • שלהם תצביע לאותו הורה. parentהתכונה

אם נרצה לעדכן את הטלפון הסלולארי של ההורה, •מספיק לעשות זאת דרך אחד האחים. העדכון ישתקף

אצל יתר האחים

כאשר שני אחים )או יותר( לומדים באותו בית ספר, אזי • שלהם תצביע לאותו הורה. parentהתכונה

Parent p1 = new Parent )"Katz Meir", "054-2345678"(;Student st1 = new Student )"Katz Oren", "02-8765432", p1(;Student st2 = new Student )"Katz Omri", "02-8765432", p1(;

Parent p2 = st1.getParent;)(p2.setCellNum )"052-6782345"(;System.out.println)st1.getParent)(.getCellNum)((;System.out.println)st2.getParent)(.getCellNum)((;

Page 36: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

36

ביניים סיכום

משתנים שונים יכולים להחזיק הפניות לאותו עצם.•

שינוי שייעשה בעצם על ידי שימוש בהפניה שבאחד •המשתנים ייראה אחר כך בכל אחת מההפניות

האחרות.

וערכי החזרה מטיפוס מחלקה הם למעשה פרמטרים•הפניות.

עצם כפרמטר לפעולה, פירושה למעשה העברת•

לעצם, בפרמטר של עותק של ההפניהעותק של ההפניההצבת הפעולה.

עצם מפעולה, פירושה החזרת ההפניה אליו. החזרת•

משתנים שונים יכולים להחזיק הפניות לאותו עצם.•

שינוי שייעשה בעצם על ידי שימוש בהפניה שבאחד •המשתנים ייראה אחר כך בכל אחת מההפניות

האחרות.

וערכי החזרה מטיפוס מחלקה הם למעשה פרמטרים•הפניות.

עצם כפרמטר לפעולה, פירושה למעשה העברת•

לעצם, בפרמטר של עותק של ההפניהעותק של ההפניההצבת הפעולה.

עצם מפעולה, פירושה החזרת ההפניה אליו. החזרת•

Page 37: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

37

תרגיל מעשיי

כנס לאתר התרגיל מצורף להודעהבפורום.

Page 38: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

38

מורכב עצםStudentList אוסף - המייצג

המחלקה מאפשרת:הוספת תלמיד לרשימה כיתתית.•מחיקת תלמיד מהרשימה.•קבלת פרטיו של תלמיד על פי שמו. •הדפסת דף קשר כיתתי ממוין בסדר אלפביתי. •

: יש מקום ברשימה הכיתתית.הנחההכנסת לפני ברשימה מקום קיים האם לבדוק צורך אין

תלמיד חדש.

המחלקה מאפשרת:הוספת תלמיד לרשימה כיתתית.•מחיקת תלמיד מהרשימה.•קבלת פרטיו של תלמיד על פי שמו. •הדפסת דף קשר כיתתי ממוין בסדר אלפביתי. •

: יש מקום ברשימה הכיתתית.הנחההכנסת לפני ברשימה מקום קיים האם לבדוק צורך אין

תלמיד חדש.

Page 39: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

39

הדוגמה המלווהצמצום עולם הבעיה:

אדם מזוהה על פי שמו אין בעולם אנשים בעלי שמות זהים יכולת שליטה חיצונית: גודל הכיתה ומקומות פנויים בה

ידועים תמיד )למזכירה(

ללא הגבלות סבירות הדוגמה הולכת ומסתבכת ללא הגבלות סבירות הדוגמה הולכת ומסתבכת לכיוונים שאינם נחוצים לנו בהוראהלכיוונים שאינם נחוצים לנו בהוראה

צמצום נוסף )הגיוני(: שינוי שמות(.לא מגדירים פעולות העלולות לפגוע באוסף(

Page 40: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

40

המחלקה ממשק

Page 41: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

41

StudentListב- שימוש

StudentList studentList = new StudentList)(;

Student st1 =new Student)"Potter Harry","02-9965187", p1(;

Student st2 =new Student)"Scofield Michael","03-6742201", p2(;

// להלן הוספת שני תלמידים לרשימה הכיתתית:

;studentList.add )st1(

;studentList.add )st2(

;System.out.println )studentList(

= StudentList studentListnew;)(StudentList

= Student st1new;Student)"Potter Harry","02-9965187", p1(

= Student st2new;Student)"Scofield Michael","03-6742201", p2(

// להלן הוספת שני תלמידים לרשימה הכיתתית:

studentList.add )st1(;

studentList.add )st2(;

System.out.println )studentList(;

Page 42: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

42

שאלות

כתבו פעולה המקבלת רשימה כיתתית ושם ?של תלמיד, ומדפיסה את מספר הטלפון

הסלולרי של ההורה האחראי על תלמיד זה.

יותם, הבכור באחי משפחת כהן, התייצב ?במזכירות בית הספר ודיווח על שינוי מספר הטלפון הסלולרי של אביו. כיצד תבצע נטע

המזכירה את העדכון? פרטו ונמקו בעזרת קוד או בעזרת תרשימי עצמים.

כתבו פעולה המקבלת רשימה כיתתית ושם ?של תלמיד, ומדפיסה את מספר הטלפון

הסלולרי של ההורה האחראי על תלמיד זה.

יותם, הבכור באחי משפחת כהן, התייצב ?במזכירות בית הספר ודיווח על שינוי מספר הטלפון הסלולרי של אביו. כיצד תבצע נטע

המזכירה את העדכון? פרטו ונמקו בעזרת קוד או בעזרת תרשימי עצמים.

Page 43: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

43

עצם מורכב המייצג אוסף:

)דוגמה מלווה(רשימה כיתתית

StudentList מגדירה קבוצת תלמידי כיתה כלומר, רשימה כיתתית.

.ההגבלות ידועות מעולם הבעיה של אוסףרשימה כיתתית היא עצם המכיל

. Studentעצמים מטיפוס ספציפיזהו אוסף .

Page 44: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

44

מסקנות ביניים ושאלה:

רשימה כיתתית היא עצם מורכב ברשימה כיתתית צריכה להיות תכונה

אוסף שתאפשר להחזיק

מיהן הפעולות העומדות לרשות מופע מטיפוס המחלקה

StudentList ?

היזכרו מיהן הפעולות העומדות

לרשות מלבן המוגדר על

ידי שתי נקודות...

Page 45: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

45

...אין לנו אלא מערך

ייצוג האוסף רשימה כיתתית:

public class StudentList

}

public static final int MAX_STUDENTS = 35 ;

private Student[] list;

{

איך מחזיקים את האוסף?

Page 46: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

46

StudentList של ייצוג

שמספר אפשרות אין ספר בית כללי לפי .35התלמידים בכיתה יעלה על

public class StudentList

}

public static final int ;MAX_STUDENTS = 35

private;Student[] list

{

שמספר אפשרות אין ספר בית כללי לפי .35התלמידים בכיתה יעלה על

public class StudentList

{

public static final int MAX_STUDENTS = 35;

private Student[] list;

}

Page 47: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

47

StudentList של הבונה הפעולה

public StudentList )(

{

this.list = new Student[MAX_STUDENTS];

}

) null )שבכל תאיו יש מערך ריקמערך ריקפעולה זו מייצרת

על מנת לאתחל את התאים -

יש להשתמש בפעולת ההוספה לרשימה כיתתית

public)( StudentList

}

this = list. new;Student[MAX_STUDENTS]

{

) null )שבכל תאיו יש מערך ריקמערך ריקפעולה זו מייצרת

על מנת לאתחל את התאים -

יש להשתמש בפעולת ההוספה לרשימה כיתתית

Page 48: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

48

ההוספה פעולת

:ישנן שתי אפשרויות למציאת מקום ההוספה.nullלסרוק את המערך עד שמגיעים ל-1.. תכונה זו lastPositionלהוסיף תכונה 2.

תשמור את האינדקס של המקום הפנוי הראשון ברשימה.

אנו נשתמש באפשרות השנייה.

:ישנן שתי אפשרויות למציאת מקום ההוספה.nullלסרוק את המערך עד שמגיעים ל-1.. תכונה זו lastPositionלהוסיף תכונה 2.

תשמור את האינדקס של המקום הפנוי הראשון ברשימה.

אנו נשתמש באפשרות השנייה.

Page 49: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

49

ההוספה פעולתpublic class StudentList {

public static final int MAX_STUDENTS = 35;private Student[] list;

private int lastPosition;public void add (Student st){

this.list[this.lastPosition] = st;this.lastPosition++;

}}

public class StudentList {

public static final int MAX_STUDENTS = 35;private Student[] list;

private int lastPosition;public void add (Student st){

this.list[this.lastPosition] = st;this.lastPosition++;

}}

Page 50: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

50

שאלות. lastPositionכתבו את פעולת ההוספה ללא הגדרת התכונה ?

נתחו את זמן הריצה של פעולת ההוספה עם התכונה ובלעדיה, ונסחו את

מסקנותיכם. קיימת. במהלך תוכנית כלשהי, lstנניח כי הרשימה הכיתתית ?

הפניה לתלמיד ואז ביצעה התוכנית student1הוצבה במשתנה את הזימון הזה:

lst.add (student1);

א. התבוננו בפקודה זו:

this.list [this.lastPosition] = st;

כמה הפניות אל התלמיד החדש קיימות לפני ביצוע שורת הקוד הבאה שבגוף

פעולת ההוספה, וכמה קיימות אחריה. הסבירו את תשובתכם בפירוט.

כמה הפניות לתלמיד יישארו עם תום פעולת ההוספה? ב.

. lastPositionכתבו את פעולת ההוספה ללא הגדרת התכונה ? נתחו את זמן הריצה של פעולת ההוספה עם התכונה ובלעדיה,

ונסחו את מסקנותיכם.

קיימת. במהלך תוכנית כלשהי, lstנניח כי הרשימה הכיתתית ? הפניה לתלמיד ואז ביצעה התוכנית student1הוצבה במשתנה את הזימון הזה:

lst.add (student1);

א. התבוננו בפקודה זו:

this.list [this.lastPosition] = st;

כמה הפניות אל התלמיד החדש קיימות לפני ביצוע שורת הקוד הבאה שבגוף

פעולת ההוספה, וכמה קיימות אחריה. הסבירו את תשובתכם בפירוט.

כמה הפניות לתלמיד יישארו עם תום פעולת ההוספה? ב.

Page 51: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

51

המחיקה )הוצאה( פעולתpublic Student del (String name){

Student st = null;int i = 0; while (i < this.lastPosition && this.list[i].getName().compareTo (name) != 0)

i++;if (i < this.lastPosition){

st = this.list[i]; for (int k = i+1; k < this.lastPosition; k++)

this.list[k-1] = this.list[k];this.lastPosition--;this.list[this.lastPosition] = null;}return st;

}

public Student del (String name){Student st = null;int i = 0; while (i < this.lastPosition && this.list[i].getName().compareTo (name) != 0)

i++;if (i < this.lastPosition){

st = this.list[i]; for (int k = i+1; k < this.lastPosition; k++)

this.list[k-1] = this.list[k];this.lastPosition--;this.list[this.lastPosition] = null;}return st;

}

תכונה המציינת את המקום הפנוי

הראשון

סגירת "חור" במערך

שאלות לתלמידים:

האם אנחנו מניחים nameשתלמיד ששמו

נמצא ברשימה הכיתתית?

מה יקרה אם הוא לא ברשימה?

איך אפשר לבדוק שתלמיד לא היה ברשימה?

כתוב תיעוד מלא לפעולה del

הפניות לאותו תלמיד. לא 2למנוע חובה כאשר לא עוברים

lastPosition.את

Page 52: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

52

()toString הפעולה

בפעולת ההוספה שראינו, כל תלמיד הוכנס •למקום הפנוי הראשון.

אמורה להחזיר מחרוזת )(toStringהפעולה •המתארת את הרשימה באופן ממוין. מיון היא

פעולה יקרה.האם יש אפשרות להימנע ממיון הרשימה בביצוע •

? )(toStringהפעולה תשובה: אפשר, אם נוודא שהמערך המייצג את •

הרשימה הכיתתית נשמר ממוין כל הזמן.

בפעולת ההוספה שראינו, כל תלמיד הוכנס •למקום הפנוי הראשון.

אמורה להחזיר מחרוזת )(toStringהפעולה •המתארת את הרשימה באופן ממוין. מיון היא

פעולה יקרה.האם יש אפשרות להימנע ממיון הרשימה בביצוע •

? )(toStringהפעולה תשובה: אפשר, אם נוודא שהמערך המייצג את •

הרשימה הכיתתית נשמר ממוין כל הזמן.

Page 53: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

53

מילוי הרשימה הכיתתית

?להיכן מכניסים את התלמיד הנוסף?איך מוצאים מקום ריק מתאים?איך עושים את זה יעיל ?האם חוזרים שלב אחורנית ניתוח יעילות פעולת המילוי )ההכנסה( על

פי הייצוגים השונים...?מה קורה כשצריך להדפיס דף קשר ממוין

Page 54: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

54

פעולת הוספה השומרת על המיוןנשמור על הייצוג הקיים.

האלגוריתם של פעולת ההוספה השומרת על המיון של

המערך ייראה כך:

סרוק את המערך מתחילתו. כל עוד שם התלמיד החדש 1.גדול )לפי סדר אלפביתי( משם התלמיד במקום הנוכחי –

התקדם למקום הבא במערך.

הזז ימינה )מקום אחד( את כל איברי המערך מהמקום 2.הנוכחי עד מקום הפנוי הראשון )כדי ליצור מקום במערך

שלתוכו ניתן יהיה להכניס את התלמיד החדש(.

הכנס את התלמיד החדש למקום שהתפנה.3.

נשמור על הייצוג הקיים.האלגוריתם של פעולת ההוספה השומרת על

המיון של המערך ייראה כך:

סרוק את המערך מתחילתו. כל עוד שם התלמיד החדש 1.גדול )לפי סדר אלפביתי( משם התלמיד במקום הנוכחי –

התקדם למקום הבא במערך.

הזז ימינה )מקום אחד( את כל איברי המערך מהמקום 2.הנוכחי עד מקום הפנוי הראשון )כדי ליצור מקום במערך

שלתוכו ניתן יהיה להכניס את התלמיד החדש(.

הכנס את התלמיד החדש למקום שהתפנה.3.

Page 55: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

55

משנים כיוון:

עוברים לרשימה כיתתית ממוינת

מה משתנה?

הייצוג לא משתנה• משתנה המימוש של פעולת ההכנסה:•

תכניס כל תלמיד למקומו הנכון ברשימה על פי סדר אלפביתי

מימוש וייצוג: יעילות מחושבת על פי מסקנה חשובהמסקנה חשובה לאותו ייצוג יכולים להיות מימושים שונים

בעלי יעילויות שונות!!

Page 56: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

56

המיון על השומרת הוספה פעולת

public void add (Student student){ int i = 0;

while < i) thislastPosition.&& this(list[i].getName().compareTo(student.getName()) < 0. ;++i if < i) this (lastPosition.;moveOthers(i) this;list[i] = student. this;++lastPosition.{

public voidadd (Student student) } int ;i = 0

while (i < this.lastPosition&& this.list[i].getName().compareTo(student.getName()) < 0) i++; if (i < this.lastPosition) moveOthers(i); this.list[i] = student; this.lastPosition++;}

פעולת עזר. פעולה זו אחראית על הזזה ימינה של

ועד iכל האיברים מהמקום מקום הפנוי

שאלות לתלמידים:

האם אנחנו מניחים שתלמיד ששמו name נמצא ברשימה הכיתתית?לא

ברשימה?כן נמצאמה יקרה אם הוא

איך אפשר לבדוק שתלמיד לא היה ברשימה?

addכתוב תיעוד מלא לפעולה

Page 57: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

57

הפעולות יעילות

המערך אינו ממוין

המערך ממוין

O)nlogn(O)n(הפעולה

toString)(

O)1(O)n(פעולת ההוספה

Page 58: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

58

.b, שתכונתו היא הפניה לעצם אחר aנניח כי קיים עצם מורכב . aאנו רוצים ליצור עותק של

העתקה

A

1020a

B

‘z’ ‘r’b

קיימות bלגבי העתקה של התכונה שתי אפשרויות:

ליצור הפניה שתפנה aבעותק של א-כך יהיו שתי הפניות לאותו .bל-

.bעצם

ליצור עצם חדש שהוא aבעותק של ב-.bהעתק של

Page 59: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

59

העתקה

ליצור הפניה שתפנה a של a1בעותק א- .bל-

.bכך יהיו שתי הפניות לאותו עצם

A

1020a

B

‘z’ ‘r’b

A

1020a1

Page 60: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

60

העתקה

b1 ליצור עצם חדש a של a1בעותקב-.bשהוא העתק של

A

1020a

B

‘z’ ‘r’b

A

1020a1

B

‘z’ ‘r’b1

Page 61: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

61

יוצאים לטיול...

אחראי הטיול מקבל עותק של הרשימההכיתתית.

?איזה מין עותק?מה האפשרויות

Page 62: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

62

העתקה

הפנייה נוספת לרשימה הכיתתית1אפשרות - הקיימת

ביום שאחרי החזרה מהטיול, הכיתה הצטמצמה באופן משמעותי ובלתי צפוי...

אחרי שחמישה תלמידים קבלו שפעת ולא יצאו לטיול, תלמיד אחד היה בחופשה בחו"ל עם הוריו ואחד סתם השתמט ונשאר בבית ...

אחראי על הטיול מוחק אותם מהרשימה...

Page 63: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

63

אפשרות א - העתקה של הפניות:public StudentList )StudentList stList( {

this.list = new Student [MAX_STUDENTS];

for )int i=0; i<stList.lastPosition; i++(this.list[i] = stList.list[i];

this.lastPosition = stList.lastPosition;}

StudentList שלהעתקה

למה אין return

?

(copy constructorפעולה בונה –מעתיקה )

StudentList tripList=new StudentList)class11List(;

Page 64: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

64

- העתקה של עצמים:2אפשרות public StudentList )StudentList stList( {

this.list = new Student [MAX_STUDENTS];

for )int i=0; i<stList.lastPosition; i++(this.list[i] = new Student )stList.list[i](;

this.lastPosition = stList.lastPosition;}

StudentList שלהעתקה

פעולה בונה מעתיקה

Page 65: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

65

העתקה שטוחה

A

1020a

B

‘z’ ‘r’b

A

1020a1

העתקה של עצם מורכב שמבצעת העתקה של תכונות העצם רק על ידי העתקת ההפניות

(.shallow copy )העתקה שטוחהנקראת

Page 66: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

66

העתקה עמוקה

A

1020a

B

‘z’ ‘r’b

A

1020a1

B

‘z’ ‘r’b1

העתקה של עצם מורכב – באופן שבו כל תכונותיו שהן עצמים אכן מועתקות לעצמים חדשים

)וכן עבור תכונות של עצמים אלו, בכל עומק( (. deep copy )העתקה עמוקהנקראת

Page 67: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

67

? כמובן שאם איננו רוצים שאחראי הטיול יעדכן את פרטי התלמידים, אנו גם לא מעוניינים לאפשר לו לעדכן את פרטי

ההורים )דרך מופעי התלמידים(. כיצד נמנע זאת?

שאלה

Page 68: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

68

שעורי בית

שעורי בית לשלוח ליבגני קנל :1. [email protected]

ענו כל 6 ופרק 1-3קראו ביסודיות פרקים 2.פרט לאלו שנענה השאלות המופיעות במצגת )

לעבור גם על פרק המלצה:( בהרצהרקורסיה.

– ספר 6 בפרק 5דף עבודה מספר בצע 3.28.02.08הטלפונים . תאריך הגשה

לילה טוב ולהתראות במפגש הבא