תכנות מכוון עצמים ושפת JAVA

Slides:



Advertisements
Similar presentations
Completeness and Expressiveness. תזכורת למערכת ההוכחה של לוגיקה מסדר ראשון : אקסיומות 1. ) ) (( 2. )) ) (( )) ( ) ((( 3. ))) F( F( ( 4. ) v) ( ) v ((
Advertisements

Object Oriented 33 MCSD DORON AMIR
ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
קורס Java מתקדם Design Patterns
האוניברסיטה העברית בירושלים
Interface ממשקים 1. ראינו כי ניתן לשמור אובייקטים במערכים באותו אופן כמו משתנים רגילים. ננסה כעת לראות כיצד למיין מערך של אובייקטים מסוג מסוים. נשתמש.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
מבני בקרה לולאות. שאלה #1 שאלה ב' – תכתוב תוכנה הכותבת את תפריט הבאה Type 1 to find the area of a circle Type 2 to find the circumference of a circle.
תרגול 10: הכרות עם ++C ++C כ- C משופר
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים 1 הפניות.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
ניתוח מערכות מידע ב נעים להכיר... תכנות ב C#.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 Control (Part II)
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
Java Reflection הוכן על-ידי אחמד ג'בארה
תכנות מכוון עצמים ושפת JAVA מ- C++ ל- JAVA
שימוש בעצם ממחלקה אחרת כמאפיין במחלקה הנוכחית
האוניברסיטה העברית בירושלים
© Keren Kalif JDBC קרן כליף.
תרגול 7: מנשקים, פולימורפיזם ועוד
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Object Oriented Programming
תכנות מכוון עצמים ו- C++ יחידה 05 init line, this, contained class, friend, static קרן כליף.
Tirgul 12 Trees 1.
Object Oriented Programming
תכנות מכוון עצמים ו- C++ יחידה 11 תבניות - templates
Operators Overloading
Formal Specifications for Complex Systems (236368) Tutorial #1
Object Oriented Programming
Object Oriented Programming
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
תירגול 14: מבני נתונים דינאמיים
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
תכנות מכוון עצמים ו- C++ יחידה 04 constructors, destructor
תכנות מכוון עצמים ו- C++ יחידה 08 פולימורפיזם
עבודה עם נתונים באמצעות ADO.NET
הקצאות דינאמיות קרן כליף.
תכנות מכוון עצמים בשפת JAVA
ממשקים - interfaces איך לאפשר "הורשה מרובה".
אובייקטים ומחלקות קרן כליף.
ניתוח מערכות מידע תכנות ב C#
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים ושפת JAVA
מבוא לתכנות מונחה עצמים Object Oriented Programming
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
הכלת אובייקטים קרן כליף.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

תכנות מכוון עצמים ושפת JAVA הרצאה 04 הכלת אובייקטים ומערכי אובייקטים © Keren Kalif

ביחידה זו נלמד: הכלת מחלקות מתי נחזיק העתק ומתי הפניה מערכי אובייקטים

הכלת מחלקות: מוטיבציה וכיצד זה עובד כאשר יש מחלקה שאחד השדות שלה הוא מחלקה אחרת דוגמא: נתוני המחלקה "עיגול" יהיו "נקודה" המיצגת את המרכז ואורך הרדיוס נתוני המחלקה "נקודה" הן קאורידנטת ה- x וקאורדינטת ה- y כאשר אובייקט מכיל אובייקט אחר, הוא למעשה מכיל הפניה לאובייקט המוכל (אלא אם המוכל נוצר ע"י new) תזכורת: העברת אובייקטים לשיטה היא by ref, כלומר מועברת הפניה לאובייקט ולא העתק שלו

הרצת הקוד 1 1 5 str=“” str=“Center: (1,1)” str=“Center: (1,1) הרצת הקוד public class Point { private int x, y; public Point(Point other) { this(other.x, other.y); } public Point(int x, int y) { setX(x); setY(y); public String toString() { return "(" + x + ", " + y + ")"; public void setX(int x) { this.x = x; public int getX() { return x; } public void setY(int y) { this.y = y; public int getY() { return y; } } // class Point public static void main(String[] args) { Point p1 = new Point(1, 1); Circle c = new Circle(p1, 5); System.out.print(“c is  " + ); p1.setX(0); System.out.println(“c is now  " + c.toString()); } // main x=1 y=1 x=1 y=? x=0 y=1 x=? y=? 1 1 c.toString() public class Circle { private Point center; private int radius; public Circle(Point p, int radius) { center = p; this.radius = radius; } public String toString() { String str = ""; str += “Center:" + ; str += “ Radius:" + radius + "\n"; return str; } // class Circle 5 center = radius = ? center = ? radius = ? center = radius = 5 center.toString() str=“Center: (1,1)” str=“” str=“Center: (1,1) radius: 5”

הבעיה: ראינו שהאובייקט מכיל הצבעה לאובייקט המוכל כלומר, שינוי באובייקט המוכל מה- main גורר שינוי באובייקט לא בהכרח נרצה שינוי זה או נהייה מודעים לו (בתור כותבי המחלקה אנחנו לא יודעים כיצד ישתמשו במחלקה שלנו, ונרצה להגן עליה) הפתרון: במחלקה נחזיק העתק של האובייקט המוכל

הרצת הקוד המתוקן 1 1 5 x=1 y=1 x=? y=? x=0 y=1 x=1 y=? x=? y=? x=1 y=1 הרצת הקוד המתוקן public class Point { private int x, y; public Point(Point other) { this(other.x, other.y); } public Point(int x, int y) { setX(x); setY(y); public String toString() { return "(" + x + ", " + y + ")"; public void setX(int x) { this.x = x; public int getX() { return x; } public void setY(int y) { this.y = y; public int getY() { return y; } } // class Point public static void main(String[] args) { Point p1 = new Point(1, 1); Circle c = new Circle(p1, 5); System.out.print(“c is  " + ); p1.setX(0); System.out.println(“c is now  " + c.toString()); } // main x=1 y=1 x=? y=? x=0 y=1 x=1 y=? 1 1 c.toString() public class Circle { private Point center; private int radius; public Circle(Point p, int radius) { center = new Point(p); this.radius = radius; } public String toString() { String str = ""; str += “Center:" + ; str += “ Radius:" + radius + "\n"; return str; } // class Circle x=? y=? x=1 y=1 5 center = ? radius = ? center = radius = 5 center = radius = ? center.toString()

נוסיף מימוש set ו- get למרכז המעגל זוהי השמה פשוטה, כלומר רק שינוי הפניות החזרת הפניה לתכונה

הבעייתיות במימוש set הנ"ל x=1 y=1 center = radius = 5 x=1 y=1 x=2 y=2 x=3 y=2 הבעייתיות: יש הפניה למשתנה שהוגדר ב- main, והאובייקט אינו שולט בתכונה שלו באופן בלעדי

הפתרון כמו ב- copy c’tor, גם בשיטה set נייצר אובייקט חדש ע"י new ולא נסתפק בהשמה פשוטה

שימוש בשיטת ה- get x=1 y=1 center = radius = 5 x=4 y=1 x=1 y=1 x=3 y=1

הבעייתיות ב- get מבוטל המקרה: כאשר מחזירים את התכונה, למעשה מחזירים הפניה לתכונה שבתוך האובייקט הבעייתיות: מי שמקבל הפניה זו מקבל גישה ישירה לתכונה באובייקט, וכך האובייקט לא שולט על התכונה באופן בלעדי פתרון: להחזיר העתק של התכונה

החזרת העתק ב- get מבוטל השיטה get תחזיר העתק של האובייקט המוכל, ובכך תמנע האפשרות של עדכון האובייקטים המוכלים שלא דרך האובייקט המפעיל הבעייתיות: אין דרך לשנות את התכונות של האובייקט המוכל פתרון 1: נכתוב במחלקה המכילה שיטות שכל אחת תעדכן תכונה אחרת באובייקט המוכל פתרון 2:עדכון תכונה אחת באובייקט המוכל תגרור החלפת האובייקט המוכל כולו

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

השימוש ב- main בפתרון 1 מבוטל הפעם האובייקט המוכל מוגן

רק מחזירים העתק של האובייקט המוכל מימוש פתרון 2: מבוטל רק מחזירים העתק של האובייקט המוכל

השימוש ב- main בפתרון 2 מבוטל עדכון כל האובייקט המוכל במחלקה המכילה. בפתרון זה השימוש ב- main יותר מורכב אבל המימוש במחלקה פשוט...

הבעייתיות ב- get (2) מבוטל אף אחד מהפתרונות הנ"ל אינו מושלם.. Loose-Loose.. נעדיף את הפתרון המקורי: החזרת הפניה לאובייקט המוכל: "נספוג" את הסכנה שהמשתמש ב- main יוכל לעדכן את ההפניה ובכך את האובייקט המוכל כך לא יהיה צורך לעדכן את המחלקה המכילה כל פעם שתתווסף תכונה לאובייקט המוכל השימוש ב- main פשוט וקריא

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

דוגמת הכתובת ובית הספר (1) דוגמת הכתובת ובית הספר (1)

דוגמת הכתובת ובית הספר (2) יש לקרוא ל- set במקום ביצוע ההשמות

דוגמת הכתובת ובית הספר – ה- main street=“Balfur” city=“Tel-Aviv” number=10 street=“Balfur” city=“Tel-Aviv” number=90 public static void main(String[] args) { Address a1= new Address("Balfur", "Tel-Aviv", 10); Address a2= new Address("Geula", "Tel-Aviv", 20); Student stud1 = new Student("Dani", a2, a1); a2.setHouseNumber(8); Student stud2 = new Student("Anat", a2, a1); System.out.println(stud1.toString()); System.out.println(stud2.toString()); a1.setHouseNumber(90); System.out.println("After changing the school address:"); } // main street=“Geula” city=“Tel-Aviv” number=8 street=“Geula” city=“Tel-Aviv” number=20 street=“Geula” city=“Tel-Aviv” number=20 name=“Dani” homeAddress= schoolAddress= street=“Geula” city=“Tel-Aviv” number=8 name=“Anat” homeAddress= schoolAddress=

דוגמת הכתובת ובית הספר – הפלט

אובייקט מוכל: מתי נחזיק העתק ייחודי ומתי הפניה לאובייקט אחר ננתח את המערכת הבאה המנהלת את כוח-האדם בחברה: במחלקת ה- HR יש נתונים על כל העובדים בחברה בכל אגף יש נתונים על העובדים השייכים אליו ה- HR אינה מקושרת למשרד הפנים, ולכן יהיה צורך לעדכן אותה בכל שינוי בנתוניו של עובד כלשהו ה- HR באופן בלעדי אחראית על שינוי משכורות העובדים בחברה

אובייקט מוכל: מתי נחזיק העתק ייחודי ומתי הפניה לאובייקט אחר (2) מחלקת ה- HR מחזיקה את נתוני העובדים באופן ייחודי, כלומר אין אליהם הפניה ממקור חיצוני למערכת (למשל ה- main) שינוי נתוני העובד במשרד הפנים (main) ידרוש עדכון גם ב- HR כך גם ה- HR מגנה על הנתונים הספציפיים לה, כגון משכורת העובד. לא נרצה שב- main ניתן יהיה לשנות ערך זה ללא בקרה או ללא בקשה מפורשת מה- HR לעומת זאת, מאחר וכל נתוני העובדים נשמרים ב- HR, מספיק שכל אגף בחברה תחזיק הפניה לעובדים המשוייכים אליו, מתוך מאגר העובדים המוחזק ע"י ה- HR. שינוי בנתוני עובד ב- HR תעדכן מיידית בנתוניו באגף, ולהיפך.

פניה לשיטה של אובייקט במערך מערך של אובייקטים ניתן גם להגדיר מערך, שכל איבר בו הוא אובייקט במקרה זה צריך להקצות בלולאה כל אחד מאיברי המערך public static void main(String[] args) { Point[] points = new Point[3]; for ( ; ; ) { points[i] = new Point(i, i); System.out.println("Point #" + (i+1) + " --> " + points[i].toString()); { x y x 1 y Point x 2 y int i=0 i < 3 i++ זיכרון ה- heap פניה לשיטה של אובייקט במערך Point[]: points int: i 3 Point[]: points int: i 2 Point[]: points int: i Point[]: points int: i 1

ביחידה זו למדנו: הכלת מחלקות מתי נחזיק העתק ומתי הפניה מערכי אובייקטים © Keren Kalif