1 / 65

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

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח. מפגש שני - 5.03.2008 פרק 6: הפניות ועצמים מורכבים. העמקה כבסיס לכל הרצף מכאן ואילך: הפניה עצם מורכב עצם מורכב המכיל הפניה מסוג עצמו. פרק 6 הפניות ועצמים מורכבים. . . מי היא השלישייה הפותחת?. העצם. ההפניה (כתובת). Bucket b1.

lily
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח מפגש שני - 5.03.2008 פרק 6: הפניות ועצמים מורכבים השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  2. העמקה כבסיס לכל הרצף מכאן ואילך: הפניה עצם מורכב עצם מורכב המכיל הפניה מסוג עצמו פרק 6הפניות ועצמים מורכבים   השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  3. מי היא השלישייה הפותחת? העצם ההפניה (כתובת) Bucket b1 המשתנה המחזיק את ההפניה השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  4. ברור שבלשון היומיום לא נקפיד על משפטים בנוסח: משתנה מטיפוס המחלקה Bucket מחזיק הפנייה למופע מטיפוס המחלקה ... או: העצם b1 שמוצבע (מופנה) על ידי הפניה השמורה במשתנה... אנו נגיד ש-b1 הוא העצם ובו זמנית ש-b1 מפנה אל העצם... ואיך נדבר בסוף? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  5. ערך מיוחד: ההפניה הריקה ההפניה הריקה שאינה מפנה לעצם נקראת null Bucket b=null; Turtle t=null; String s=null; int[] a=null; int iNum=null; Error: incompatible types found : <nulltype> required: int אגב האיור המוכר – נעלם השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  6. אתחול משתנים משתנים שאינם מאותחלים גורמים לשגיאת הידור! Box b1; b1.setWidth(5); משנה מצב לעצם שאינו קיים Error: variable b1 might not have been initialized השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  7. אתחול סביר יהיה על ידי בניית מופע של המחלקה והצבתו במשתנה. Bucket b1 = new Bucket(4); אתחול משתנים (1) השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  8. אתחול אפשרי אחר: הצבת מופע קיים לתוך המשתנה: Bucket b1 = new Bucket(10); Bucket b2 = b1; זוהי העברת ערך של משתנה מטיפוס אותה מחלקה למשתנה "שלנו". אתחול משתנים (2) השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  9. שימוש בפעולה בונה מעתיקה (אם קיימת!!): Bucket b1 = new Bucket(10); Bucket b2 = new Bucket(b1); אתחול משתנים (3) השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  10. אתחול משתנים (4) האתחול לערך ההפניה המיוחד - ההפניה הריקה: Bucket b1 = null; האתחול חוקי לחלוטין הפעלת פעולה על משתנה שערכו null גורמת לשגיאת זמן ריצה! NullPointerException משתנה מטיפוס מחלקה שהוצהר ולא אותחל – לא מקבל null!!! השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  11. הפניות ועצמים - השוואות Bucket b1=new Bucket(10); Bucket b2=new Bucket(10); Bucket b1=new Bucket(10); Bucket b2=new Bucket(b1); Bucket b1=new Bucket(10); Bucket b2= b1; if (b1==b2)… בדיקה האם יש שתי הפניות אל אותו עצם השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  12. מערך של עצמים Box[] arr; הכרזה על משתנה שבעתיד יחזיק הפניה למערך (ולא מערך!) arr=new Box[5]; יצירת עצם מערך והצבת הפניה לעצם בתוך המשתנה בעת יצירת מופע של עצם מתבצע אתחול שלו תאים במערך מאותחלים על פי ברירת המחדל השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  13. מערך של עצמים - אתחול תאים אתחול תאי המערך: arr[0] = new Box(1, 2, 5); arr[1] = new Box(3, 2, 1); arr[2] = new Box(2, 2.5, 2); ובסלנג נאמר כך: השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  14. עצם מורכב כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי, אנו קוראים לעצם הנוצר מהמחלקה עצם מורכב (composite object) השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  15. סדר הגדרת העצמים מגדיר תלות ביניהם • ראשון מוגדר הורה שהוא עצםפשוט • אחריו מוגדר תלמיד שהוא בעל תכונה "הורה" – עצם מורכב • בסוף נגדיר רשימה כיתתיתשהיא עצםמורכב "יותר" השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  16. עצםמורכב המייצגאוסף -StudentList • המחלקה מאפשרת: • הוספת תלמיד לרשימה כיתתית. • מחיקת תלמיד מהרשימה. • קבלת פרטיו של תלמיד על פי שמו. • הדפסת דף קשר כיתתי ממוין בסדר אלפביתי. • הנחה: יש מקום ברשימה הכיתתית. • אין צורך לבדוק האם קיים מקום ברשימה לפני הכנסת תלמיד חדש. השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  17. הדוגמה המלווה צמצום עולם הבעיה: • אדם מזוהה על פי שמו • אין בעולם אנשים בעלי שמות זהים • יכולת שליטה חיצונית: גודל הכיתה ומקומות פנויים בה ידועים תמיד (למזכירה) ללא הגבלות סבירות הדוגמה הולכת ומסתבכת לכיוונים שאינם נחוצים לנו בהוראה צמצום נוסף (הגיוני): • לא מגדירים פעולות העלולות לפגוע באוסף (שינוי שמות). השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  18. ממשקהמחלקה השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  19. עצם מורכב המייצג אוסף:רשימה כיתתית (דוגמה מלווה) • StudentList מגדירה קבוצת תלמידי כיתה כלומר, רשימה כיתתית. • ההגבלות ידועות מעולם הבעיה. • רשימה כיתתית היא עצם המכיל אוסף של עצמים מטיפוס Student. • זהו אוסף ספציפי. השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  20. איך מחזיקים את האוסף? • אין לנו אלא מערך... ייצוג האוסף רשימה כיתתית: public class StudentList { public static final int MAX_STUDENTS = 35; private Student[] list; … } השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  21. משנים כיוון:עוברים לרשימה כיתתית ממוינת מה משתנה? • הייצוג לא משתנה • משתנה המימוש של פעולת ההכנסה: • תכניס כל תלמיד למקומו הנכון ברשימה על פי סדר אלפביתי • מסקנה חשובה: יעילות מחושבת על פי ייצוג ומימוש • לאותו ייצוג יכולים להיות מימושים שונים • בעלי יעילויות שונות!! השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  22. A a B 20 10 b ‘z’ ‘r’ העתקה נניח כי קיים עצם מורכב a, שתכונתו היא הפניה לעצם אחר b. אנו רוצים ליצור עותק של a . • לגבי העתקה של התכונה b קיימות שתי אפשרויות: • בעותק של a ליצור הפניה שתפנה ל-b.כך יהיו שתי הפניות לאותו עצם b. • בעותק של a ליצור עצם חדש שהוא העתק של b. השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  23. A A a1 a B 20 10 20 10 b ‘z’ ‘r’ העתקה שטוחה העתקה של עצם מורכב שמבצעת העתקה של תכונות העצם רק על ידי העתקת ההפניות נקראת העתקה שטוחה (shallow copy). השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  24. A A a1 a 20 10 B B 20 10 b b1 ‘z’ ‘z’ ‘r’ ‘r’ העתקה עמוקה העתקה של עצם מורכב – באופן שבו כל תכונותיו שהן עצמים אכן מועתקות לעצמים חדשים (וכן עבור תכונות של עצמים אלו, בכל עומק) נקראת העתקה עמוקה (deep copy). השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  25. String color Bead nextBead Bead Bead (String color) Bead (String color, Bead nextBead) String getColor() Bead getNextBead() void setNextBead (Bead nextBead) עצםשתכונתומטיפוסעצמו • תכונתו של עצם יכולה להיות מטיפוס המחלקה שלו עצמו: אין פעולה המשנה את הצבע השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  26. מימושהפעולותget ו-set public Bead getNextBead() { returnthis.nextBead; } publicvoid setNextBead (Bead nextBead) { this.nextBead = nextBead; } השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  27. b2 b1 Bead Bead color nextBead color nextBead "green" null "red" null יצירתשרשרת – דרך ראשונה ניצור שני חרוזים בודדים בעזרת הפעולה הבונה המתאימה: Bead b1 = new Bead ("red"); Bead b2 = new Bead (“green"); עתהנחרוזאתהחרוזיםלשרשרת: b2.setNext (b1); השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  28. יצירתשרשרת – דרכיםנוספות דרך 2 : Bead b1 = new Bead ("red"); Bead b2 = new Bead ("green", b1); דרך 3: Bead b2 = new Bead ("green", new Bead ("red")); האם איור משתנה? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  29. יצירת שרשרתמעגלית Bead b1 = new Bead ("red"); Bead b2 = new Bead ("blue", b1); Bead b3 = new Bead ("gray", b2); Bead b4 = new Bead ("green", b3); b1.setNext (b4); השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  30. p p b1 b2 b4 b3 Bead Bead Bead Bead color nextBead color color color nextBead nextBead nextBead "blue" "green" "gray" "red" null משתנה מטיפוס מחלקה המשמש לסריקה ניתן לסרוק את השרשרת באמצעות הפניה מטיפוס Bead: קיימת השרשרת הבאה: נגדיר משתנה שיפנה לחרוז הראשון ונקדם אותו: Bead p = b4; p = p.getNextBead(); איך נדע שהגענו לחרוז האחרון? כמה הפניות צריך כדאי ליצור שרשרת מ-10 חרוזים? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  31. String name Employee supervisor Employee Employee (String name, Employee supervisor) String getName() Employee getSupervisor() void setSupervisor (Employee supervisor) שרשורהיררכי – Employee המחלקה Employee מגדירה עובד בחברה. לכל עובד בחברה, למעט מנהל החברה, יש אחראי שגם הוא עובד בחברה: מה מאפיין את המנהל החברה? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  32. שרשורהיררכי – Employee יצירת מבנה ארגוני: public static void main(String[] args) { Employee emp1 = new Employee("Moshe", null); Employee emp2 = new Employee("Sara", emp1); Employee emp3 = new Employee("Yossi", emp1); Employee emp4 = new Employee("Yoram", emp1); Employee emp5 = new Employee("Yair", emp2); } השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  33. emp1 emp2 emp5 emp4 emp3 Employee Employee Employee Employee Employee supervisor supervisor supervisor supervisor supervisor name name name name name "Sara" "Yoram" "Yair" "Moshe" "Yossi" null התוצאה השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  34. b1 Bead Bead Bead Bead Bead color color nextBead color nextBead nextBead color nextBead color nextBead "red" "green" "yellow" null "green" "yellow" b2 Bead Bead Bead Bead Bead color color nextBead color nextBead nextBead color nextBead color nextBead "red" "green" "yellow" null "green" "yellow" שאלות א. הרכיבו שתי מחרוזות שונות, הזהות הן בצבעי החרוזים והן בסדר הופעת הצבעים במחרוזת. כל מחרוזת תהיה מורכבת מחמישה חרוזים, שצבעיהם (משמאל לימין) הם: ירוק, צהוב, אדום, ירוק, צהוב. המשתנים b1 ו-b2 יכילו הפניות לחרוזים הראשונים שבשתי המחרוזות. איך לבדוק שאכן יש שתי מחרוזות שונות? איך לבדוק שהן זהות? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  35. b1 Bead Bead Bead Bead Bead color color nextBead color nextBead nextBead color nextBead color nextBead "red" "green" "yellow" "green" "yellow" Bead Bead Bead Bead Bead color nextBead color color color color nextBead nextBead nextBead nextBead “green" "yellow" “green" “red" "yellow" שאלות ב. הרכיבו מחרוזת ארוכה המורכבת משתי המחרוזות המקוריות (מסעיף א), הראשונה תחילה ואחריה השנייה, וסגרו אותה למעגל. איך לבדוק שאכן יש מחרוזת אחת מעגלית? איך להפוך סדר החרוזים? איך לספור כמות החרוזים? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  36. b1 Bead Bead color nextBead color nextBead "green" "yellow" Bead Bead Bead color color nextBead color nextBead nextBead b2 Bead Bead "red" "green" "yellow" null color color nextBead nextBead "green" "yellow" שאלות ג. חברו את שתי המחרוזות שיצרתם על ידי שינוי הפניה במחרוזת השנייה, כך שיתקבל מבנה כמתואר באיור הבא. (שימו לב שאחרי ביצוע המשימה, אין בתוכניתכם אף הפניה לשלושת החרוזים האחרונים שבמחרוזת השנייה). איך לבדוק שאכן יש שתי מחרוזות מחוברות? איך לשחזר מצב התחלתי? איך למצוא צבע של חרוז המחבר? כמה חרוזים יש? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  37. פרק 7 ייצוג אוספים השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  38. מה בשיעור 1. חוליה המכילה ערך שלם (IntNode) 2. שרשרת חוליות: הוצאה, הכנסה, מעבר על השרשרת, פעולות על השרשרת 3. החוליה הגנרית 4. שרשרת חוליות כמבנה רקורסיבי 5. שרשרת חוליות לייצוג של אוסף 6. מבנים נוספים מבוססי חוליות השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  39. אוספים – מבוא • ביישומים רבים יש צורך לשמור אוספים (collections) • אוספים אלו הם דינמיים (כמות הנתונים באוסף גדלה וקטנה) • ראינו אוסף כזה: רשימה כיתתית – StudentList • את StudentList ייצגנו בעזרת מערך • StudentList היה מוגבל בגודלו (כזכור לא ניתן היה להכניס יותר מ-35 תלמידים) • אנו מעוניינים גם באוספים שלא מוגבלים בגודלם השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  40. חסרונות המערך כאמצעי לאחסון אוספים • מגבלת המקום. מרגע שנוצר מערך, ניתן להגדילו אך המהלך מסורבל ולא יעיל • סיבוך גבוה לפעולות הכנסה והוצאה. הוספת נתון למקום שרירותי במערך או הוצאת נתון ממנו הן פעולות יקרות • מגבלת המבנה הסדרתי. המערך הוא מבנה סדרתי וקשה לאחסן בו אוספים בעלי מבנה מורכב השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  41. החוליה החוליה היא עצם ובו שתי תכונות: • ערך נתון • הפניה לחוליה, בדרך כלל חוליה אחרת, שתיקרא: החוליה העוקבת חוליה היא עצם עם תכונה מטיפוס העצם עצמו השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  42. int info IntNode next IntNode IntNode (intx) IntNode (int x, IntNode next) . . . IntNode חוליההמכילהמספרשלם UML: הערך הפניה לחוליה העוקבת השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  43. ממשק המחלקה IntNode השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  44. מימוש המחלקה privateint info; private IntNode next; public IntNode (int x) { this.info = x; this.next = null; } public IntNode (int x, IntNode next) { this.info = x; this.next = next; } ייצוג המחלקה הפעולות הבונה הפעולה הבונה השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  45. פעולות toString, get, set public IntNode getNext(){ return this.next; } publicvoid setNext (IntNode next){ this.next = next; } publicint getInfo(){ return this.info; } publicvoid setInfo (int x){ this.info = x; } public String toString(){ return "" + this.info; } השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  46. n IntNode info next null 5 n n1 IntNode IntNode info next info next 7 5 null n1 n n2 IntNode IntNode IntNode info info info next next next null 4 5 7 שרשרת חוליות – בנייה IntNode n = new IntNode (5); IntNode n1 = new IntNode (7, n); IntNode n2 = new IntNode (4, n1); כמה הפניות חיצוניות יש כרגע ? האם נתן לצמצם? השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  47. info info info next next next null 5 7 4 n IntNode IntNode IntNode שרשרת חוליות – בנייה ניתן ליצור שרשרת חוליות בכתיבה מקוצרת: IntNode n = new IntNode(4, new IntNode(7, new IntNode(5))); במקרה זה קיימת רק הפניה אחת לאורך כל השרשרת: n- ההפניה לחוליה הראשונה חייבת להישמר אם היא נמחקת, לא ניתן לגשת יותר לשרשרת החוליות אספן הזבל ימחק את כול השרשרת השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  48. temp IntNode info next 56 null info info info next next next null 7 5 4 שרשרת חוליות – הכנסה IntNode temp = new IntNode (56); temp.setNext (n.getNext()); n.setNext (temp); n IntNode IntNode IntNode השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  49. n IntNode IntNode info info info info next next next next null 7 56 5 4 temp IntNode IntNode הכנסה – כתיבה מקוצרת IntNode temp = new IntNode (56, n.getNext()); n.setNext (temp); n.setNext (new IntNode (56, n.getNext())); השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

  50. פתרון למגבלות המערך שתי המגבלות של המערך אינן קיימות בהכנסה לשרשרת החוליות: • מגבלת המקום – ניתן להכניס מספר לא מוגבל של חוליות • סיבוך – לא נדרשות הזזות ימינה כדי לאפשר הכנסה של נתון חדש. כל שיש לעשות הוא לחבר הפניות ולנתקן מחיבוריהן הקודמים, לפי הסדר הרצוי השתלמות ב-"עיצוב תוכנה מבוסס עצמים" תשמ"ח – 2008 באר-שבע

More Related