המשך תכנות מונחה עצמים תרגול מס' 9.

Slides:



Advertisements
מצגות קשורות
הכרת תוכנת בקרים. כניסה לתוכנה תתבצע בשלבים הבאים: 1
Advertisements

תכנות בשפת C תרגול 11 - קבצים.
תוכנה 1 בשפת Java שיעור מספר 5: עצמים
© Keren Kalif JPA קרן כליף.
הרצאה 02 סוגי משתנים קרן כליף.
תוכנה 1 בשפת Java שיעור מספר 9: "יוצא מן הכלל"
מבוא לתכנות ב-JAVA מעבדה 1
תוכנה 1 תרגול 13 – סיכום.
תרגול 1: סביבת העבודה ומבוא ל-Java
תוכנה 1 בשפת Java שיעור מספר 4: מחלקות
נערך ע"י אריק הוד, הגימנסיה העברית הרצליה
תוכנה 1 תרגול 12 – סיכום.
תרגול מס' 8 משתנים מיוחסים מבוא ל-C++ קלט/פלט ב-C++
רמי כהן, מדעי המחשב, הטכניוןכל הזכויות שמורות ©
תוכנה 1 בשפת Java שיעור מספר 10: "ירושה נכונה" (הורשה II)
מבוא למדעי המחשב הרצאה מספר 12: רקורסיה
תכנות בשפת C תרגול 11 רשימות מקושרות מבנים
תרגול Introduction to C - Fall Amir Menczel.
פעולות אריתמטיות קרן כליף.
תירגול 11: מיונים וחיפוש בינארי
תוכנה 1 בשפת Java שיעור מספר 13: "אל תסתכל בקנקן"
נערך ע"י אריק הוד הגימנסיה העברית הרצליה
תכנות בשפת C תרגול 8 רקורסיה
Engineering Programming A
תירגול 8:מצביעים והקצאה דינאמית
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
תרגול 6: פונקציות, סוגי משתנים, top-down design
רובוטיקה תרגול שימוש בלולאות
תוכנה 1 בשפת Java שיעור מספר 5: מנשקים תחילה
מקורות שדה מגנטי קובץ זה נועד אך ורק לשימושם האישי של מורי הפיזיקה ולהוראה בכיתותיהם. אין לעשות שימוש כלשהו בקובץ זה לכל מטרה אחרת ובכלל זה שימוש מסחרי;
כל הזכויות שמורות לגבריאל אנקרי © 2017
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
Web Services Delegates and Events ליווי מקצועי : ארז קלר
מבוא לתכנות מונחה עצמים Object Oriented Programming
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פרופ' מוטי בן-ארי המחלקה להוראת המדעים מכון ויצמן למדע
מבוא לתכנות למערכות מידע
Computer Architecture and System Programming Laboratory
אלגוריתמי מיון רקורסיביים
כל הזכויות שמורות לגבריאל אנקרי © 2017
תרגול 13 : חזרה נכתב על-ידי לימור ליבוביץ נערך ע"י ישראל גוטר
Marina Kogan Sadetsky –
CLI vs GUI.
תוכנה 1 בשפת Java שיעור מספר 8: "ירושה נכונה" (הורשה II)
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
תוכנה 1 תרגול - Generics.
תוכנה 1 תשס"ח סמסטר ב' אוהד ברזילי ליאור שפירא
שימוש בעצם ממחלקה אחרת כמאפיין במחלקה הנוכחית
מבוא לתכנות ב- JAVA מעבדה 4
מבוא לתכנות בWINDOWS ד"ר אבי רוזנפלד.
מבנה כללי של היררכיית הקבצים עבור המסלול /A/B.txt
מבוא למדעי המחשב סמסטר ב' – 2008 מרצה: יעל סיגל מתרגל: ענבל בודובסקי.
Introduction to Programming in C
עקרונות תכנות מונחה עצמים תרגול 8: OOP in C++
מצביעים Pointers – המשך...
תוכנה 1 - תרגול תרגיל – חברת הייטק בית הספר למדעי המחשב
מעבדה 2- עיצוב (עבור חלק ג)
תרגול מס' 7: Memoization Quicksort תרגילים מתקדמים ברקורסיה
עקרונות תכנות מונחה עצמים תרגול 9:C++ - תרגילים
תוכנה 1 בשפת Java שיעור מספר 10: "ירושה נכונה" (הורשה II)
תוכנה 1 בשפת Java שיעור מספר 11: חידושים ב Java 8
Java Programming רשימות מקושרות - המשך
הפונקציה מחזירה את מספר התווים במחרוזת נתונה.
Engineering Programming A
תמליל מצגת:

המשך תכנות מונחה עצמים תרגול מס' 9

היום בתרגול this שיטות מיוחדות חריגות (Exceptions) Shallow Copy, Deep Copy שיטות מיוחדות חריגות (Exceptions)

תזכורת: מחלקות ואובייקטים הנה המחלקה MyString: public class MyString { //class fields private char[] elements; private int length; //class method public int length(){ return length; } שדות – מייצגים מצב של האובייקט שיטה – מתארת התנהגות של האובייקט

תזכורת: מחלקות ואובייקטים על מנת ליצור אובייקט מסוג MyString, נשתמש במילה new: אך כיצד ניתן לשים ערכים בתוך המחרוזת שלנו? לשם כך נגדיר בנאי, שבעזרתו נאתחל את שדה האובייקט MyString s = new MyString();

תזכורת: בנאי (constructor) בנאי – שיטה מיוחדת עבור מחלקה שתפקידה לייצר אובייקט ולאתחל את שדותיו public class MyString { //class fields private char[] elements; private int length; //constructor with a parameter public MyString(char[] otherElements){ length = otherElements.length; elements = new char[length]; for (int i = 0; i < otherElements.length; i++) { elements[i] = otherElements[i]; } ... השם זהה לשם המחלקה ואין ערך החזרה

מה היתרון בשימוש בדרך זו? this ראינו כי ניתן להגדיר מספר בנאים למחלקה בעזרת העמסה (Overloading) ניתן לקרוא מבנאי אחד לבנאי אחר בעזרת המילה השמורה: לדוגמה: הקריאה חייבת להתבצע בשורה הראשונה של הבנאי this public MyString(MyString other){ this(other.elements); } ( ) מה היתרון בשימוש בדרך זו?

this דוגמה נוספת: מה עושה הבנאי השני? public class MyString{ private char[] elements;   private int length; public MyString(String s) { … } public MyString() { this("");

this ניתן להשתמש ב - this על מנת להבדיל בין שדה לבין פרמטר או משתנה לוקאלי בעלי אותו שם . לדוגמה: בעזרת האופרטור (.) public class MyString{ private char[] elements; private int length; public MyString(char[] elements, int length) { this.length = length; this.elements = new char[this.length]; for (int i = 0; i < this.length; i=i+1) this.elements[i] = elements[i]; }

תזכורת תזכורת (מההרצאות) – המחלקות Point ו- Circle: public class Point { public double x; public double y; public Point() { x = 0; y = 0; } public Point(Point p) { x = p.x; y = p.y; בנאי חסר פרמטרים בנאי מעתיק

תזכורת בנאי חסר פרמטרים בנאי המקבל את כל השדות public class Circle{ public Point center; public double radius; //constructors public Circle() { center = new Point(); radius = 0; } public Circle(Point cen, double rad) { center = new Point(cen); if (rad >= 0) radius = rad; else rad = 0; … }//Circle בנאי חסר פרמטרים בנאי המקבל את כל השדות

Deep Copy ו- Shallow Copy בנאי מעתיק אפשרי ל- Circle: מה יקרה אם נבצע את הפעולות הבאות: הבנאי המעתיק משתמש בגישת ה- Shallow Copy. public Circle(Circle other) { center = other.center; radius = other.radius; } Copy constructor public static void main(String[] args){ Circle circ1 = new Circle(); Circle circ2 = new Circle(circ1); circ2.center.x = 4; }

Deep Copy ו- Shallow Copy בנאי מעתיק אפשרי ל- Circle: מה יקרה עכשיו אם נבצע את הפעולות הבאות: הבנאי המעתיק משתמש בגישת ה- Deep Copy. public Circle(Circle other) { center = new Point(other.center); radius = other.radius; } public static void main(String[] args){ Circle circ1 = new Circle(); Circle circ2 = new Circle(circ1); circ2.center.x = 4; }

המחלקה Object במחלקה Object מוגדרים מימושי ברירת המחדל לשיטות המשותפות לכל האובייקטים. למשל ... public String toString() כאשר ממשנו שיטה זו במחלקות שייצרנו ביצענו דריסה לשיטת ברירת המחדל שירשנו מהמחלקה Object. שיטה משותפת נוספת הינה public boolean equals(Object obj) אשר מבצעת השוואה לוגית בין שני אובייקטים (כמו שראינו ב- String). שימו לב כי שוויון לוגי אינו בהכרח השוואה של כל שדות האובייקט.

שיטות משותפות לכל האובייקטים: toString עד עתה כשרצינו להדפיס ערך כלשהו השתמשנו בפונקציה מהמשפחה של System.out.print כיצד נוכל להדפיס אובייקט מסוג Complex? ב- Java לכל אובייקט יש שיטה בשם toString, המחזירה String כמו שהמתכנת של המחלקה מחליט public class Point{ public double x; public double y; public String toString() { return "(" + x + " , " + y + ")"; }

שיטות משותפות לכל האובייקטים: toString כעת, כשנדפיס אובייקט מסוג Point (באופן הבא): שימו לב כי ניתן היה (אך לא חובה) לקרוא לשיטה כך: במקרה השני, הפונקציה println מפעילה את שיטת ה toString של האובייקט Point p1 = new Point(5, 7); System.out.println(p1.toString()); (5.0 , 7.0) Point p1 = new Point(5, 7); System.out.println(p1);

השיטה equals נרצה לממש את השיטה equals עבור Point : מה יקרה כאשר other הוא null ? שגיאה בזמן ריצה: NullPointerException public class Point { public double x; public double y; // ... public boolean equals(Object other) { boolean ans; Point otherPoint = (Point)other; ans = (x==otherPoint.x) && (y==otherPoint.y); return ans; }

השיטה equals נרצה לממש את השיטה equals עבור Point : מה יקרה כאשר other הוא אינו מטיפוס Point ? שגיאה בזמן ריצה: ClassCastException public class Point { public double x; public double y; // ... public boolean equals(Object other) { boolean ans; Point otherPoint = (Point)other; ans = (x==otherPoint.x) && (y==otherPoint.y); return ans; }

מחזיר true רק כאשר other אינו null ומטיפוס Point השיטה equals נרצה לממש את השיטה equals עבור Point : public class Point { public double x; public double y; // ... public boolean equals(Object other) { boolean ans = false; if(other instanceof Point) { Point otherPoint = (Point)other; ans = (x==otherPoint.x) && (y==otherPoint.y); } return ans; מחזיר true רק כאשר other אינו null ומטיפוס Point

השוואה בין כתובות (הערך בטבלת המשתנים) equals השיטה אם לא היינו מממשים את (מבצעים דריסה של) השיטה equals במחלקה Point, בעת הקריאה לשיטה equals היינו פונים לשיטה equals הממומשת ב-Object אשר משווה כתובות. public boolean equals(Object other){ return this == other; } השוואה בין כתובות (הערך בטבלת המשתנים)

equals השיטה אם לא היינו מממשים את (מבצעים דריסה של) השיטה equals במחלקה Point, בעת הקריאה לשיטה equals היינו פונים לשיטה equals הממומשת ב-Object אשר משווה כתובות. public boolean equals(Object other){ return this == other; } ?? מה יקרה אם נגדיר עבור מחלקה Point את השיטה הבאה: ?? public boolean equals(Point other) !! לא ביצענו דריסה של השיטה equals של מחלקת האב Object, מאחר והחתימה שונה.

חריגות (Exceptions) חריגה היא אירוע המתרחש במהלך תוכנית המפר את תהליך הריצה הנורמאלי של פקודות התוכנית. לעיתים חריגות מתרחשות בגלל תקלות בלתי צפויות, כגון בעיה בקובץ אליו כותבים (למשל אין הרשאות כתיבה), ולעיתים בגלל תקלות תוכנה, כגון שליחת פרמטר לא מתאים לפונקציה. 22

כבר נתקלנו ב-RuntimeExceptions ArithmeticException: ניסיון חלוקה באפס IndexOutOfBoundsException: חריגה ממערך NullPointerException: ניסיון לפעול על משתנה שאינו פרימיטיבי בעל ערך null וראינו כי ניתן לזרוק RuntimeException באמצעות throw 23

Throw RuntimeException public class Car { private final int MAX_SPEED = 210; private final int MIN_SPEED = -20; private int speed; … public void setSpeed(int speed){ if ((speed >= MIN_SPEED) && (speed <= MAX_SPEED)) this.speed = speed; else throw new RuntimeException(“Illegal speed”); } public static void main(String[] args) { Car car = new Car(); car.setSpeed(300); } Output: Exception in thread "main" java.lang.RuntimeException: Illegal Speed at Car.setSpeed(Car.java:11) at Car.main(Car.java:17)

NullPointerException סוגי Exceptions Object Exception IOException RuntimeException NullPointerException 25

Exception ניתן לייצר חריגה ע"י פקודת throw המייצרת את אירוע החריגה. ישנן שתי דרכים לטפל בחריגה: לתפוס את ה- Exception על ידי שימוש במילים השמורות try ו-catch להעביר את ה- Exception הלאה על ידי שימוש במילה השמורה throws בכותרת הפונקציה שאנו כותבים. (טיפול בחריגות לא הכרחי עבור (RuntimeExceptions חריגת זמן ריצה מעידה על באג בתוכנית, לכן גם לא חייבים להודיע אם לא תופסים אותה. בתוכנית תקינה חריגת זמן ריצה לא צריכה להיזרק. חריגות אחרות (למשל חריגות קלט\פלט נובעות מגורמים שלתוכנית אין שליטה עליהם (תקלת תקשורת למשל). תכנית הכתובה היטב צריכה להיות מוכנה לאירועים כאלו ולכן הצורך לתפוס חריגות או במפורש להשאיר את המשימה הזו למי שקרא לשיטה.

Throw and Catch Exceptions public class Car { private final int MAX_SPEED = 210; private final int MIN_SPEED = -20; private int speed; … public void setSpeed(int speed) throws Exception { if ((speed >= MIN_SPEED) && (speed <= MAX_SPEED)) this.speed = speed; else throw new Exception(“Illegal speed”); } public static void main(String[] args) { Car car = new Car(); car.setSpeed(100); } Compilation Error

Throw and Catch Exceptions public class Car { private final int MAX_SPEED = 210; private final int MIN_SPEED = -20; private int speed; … public void setSpeed(int speed) throws Exception { if ((speed >= MIN_SPEED) && (speed <= MAX_SPEED)) this.speed = speed; else throw new Exception(“Illegal speed”); } public static void main(String[] args) { Car car = new Car(); try{ car.setSpeed(300); System.out.println("Broke the speed limit !"); } catch(Exception e){ System.err.println("Caught Exception: "+e.getMessage()); } System.out.println("Current speed is "+car.getSpeed()+” km/h); Output: Caught Exception: Illegal Speed Current speed is 0 km/h