תרגול מס' 6 מחלקות, עצמים, וקצת חוזים

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 היא שורש ההיררכיה –דריסה אופרטור.
האוניברסיטה העברית בירושלים
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
©Silberschatz, Korth and Sudarshan4.1Database System Concepts סכימה לדוגמא.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
אתחולים ובנאים יצירת מופע חדש של עצם כוללת : הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי / ים של מחלקת הבסיס תהליך זה.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תרגול 10: הכרות עם ++C ++C כ- C משופר
תוכנה 1 בשפת Java שיעור מספר 1: מתחילים מחדש
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מתמטיקה בדידה תרגול 2.
אתחול עצמים. אתחולים ובנאים יצירת מופע חדש של עצם כוללת: הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי/ם של מחלקת הבסיס.
המשך תכנות מונחה עצמים 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.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים עוברים לג ' אווה.
1 תרגול 11: Design Patterns ומחלקות פנימיות 1 תוכנה 1.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
מחרוזות – הטיפוס String
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 5 תרשימי מצבים Statecharts למחלקות תגובתיות Reactive Classes הקדמה ודוגמא.
תרגול 7: מנשקים, פולימורפיזם ועוד
Object Oriented Programming
Tirgul 12 Trees 1.
Object Oriented Programming
Operators Overloading
Formal Specifications for Complex Systems (236368) Tutorial #1
Object Oriented Programming
תרגול 7: מנשקים, פולימורפיזם ועוד
Object Oriented Programming
מחלקות classes.
מבוא לתכנות מונחה עצמים Object Oriented Programming
תוכנה 1 תרגול 13 – סיכום.
תוכנה 1 תרגול 13 – סיכום.
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
תכנות מכוון עצמים בשפת JAVA
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
ממשקים - interfaces איך לאפשר "הורשה מרובה".
תוכנה 1 בשפת Java שיעור מספר 4: "חוזים"
אובייקטים ומחלקות קרן כליף.
ניתוח מערכות מידע תכנות ב C#
د.سناء الصايغ الفصل الأول البرمجة الشيئية
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים ושפת JAVA
מבוא לתכנות מונחה עצמים Object Oriented Programming
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
תוכנה 1 תרגול 13 – סיכום.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

תרגול מס' 6 מחלקות, עצמים, וקצת חוזים תוכנה 1 תרגול מס' 6 מחלקות, עצמים, וקצת חוזים

תזכורת – מופעי מחלקה אפשר ליצור מופעים של מחלקה מסוימת (גם: עצמים מטיפוס המחלקה) בעזרת ביטוי new. BankAccount account1 = new BankAccount(...); כל מופע יכול להכיל ערכים שונים של שדות מופע בניגוד לשדות סטטיים, אשר שייכים למחלקה כל מופע יכול לקרוא לשירותי מופע מתוך שירותים אלה יש גישה למשתנה this, אשר מצביע על העצם הקורא, וממנו ניתן לגשת לשדות ושירותי מופע נוספים בניגוד לשירותים(\פונקציות\מתודות) סטטיים, אשר אינם מקושרים למופע ספציפי אלא רק למחלקה

המצב הפנימי של אובייקט המצב הפנימי של עצם מיוצג ע"י נתוניו (שדותיו) שדות עצם יהיו לרוב עם הרשאת גישה פרטית במקרה של חשבון בנק: מצב פנימי: מכיל בין היתר שדה לייצוג היתרה מאיזה טיפוס? public class BankAccount { ... private double balance; }

שירותי מופע ישנם 3 סוגי שירותים (מתודות, פונקציות, פרוצדורות): שאילתות (queries, accessors) מחזירות ערך ללא שינוי המצב הפנימי שאילתות צופות (observers): מחזירות פרט מידע הקשור לעצם (למשל, בירור יתרה) שאילתות מפיקות (producers): מחזירות עצם מאותו טיפוס (למשל, חשבון חיסכון המקושר לחשבון עובר ושב) בד"כ שימושיות עבור עצמים מקובעים (immutable) כמו מחרוזות. פקודות (commands, transformers, mutators) מבצעות שינוי במצב הפנימי של העצם כגון: משיכה, הפקדה בנאים (constructors) יצירת עצם חדש כגון: יצירת חשבון חדש

תזכורת - חוזה בין ספק ללקוח חוזה בין ספק ללקוח מגדיר עבור כל שרות: תנאי ללקוח - "תנאי קדם" - precondition תנאי לספק - "תנאי אחר" – postcondition. לקוח ספק

תנאי קדם (preconditions) מגדירים את הנחות הספק - מצבים של התוכנית שבהם מותר לקרוא לשירות בד"כ, ההנחות הללו נוגעות רק לקלט שמועבר לשירות. תנאי הקדם יכול להיות מורכב ממספר תנאים שעל כולם להתקיים (AND) סימון: @pre מקרים מורכבים - ההנחות נוגעות למצב הגלובלי

תנאי אחר (postconditions) אם תנאי הקדם מתקיים, הספק חייב לקיים את תנאי האחר ואם תנאי קדם אינו מתקיים? לא ניתן להניח דבר: אולי השרות יסתיים ללא בעיה אולי השרות יתקע בלולאה אינסופית אולי התוכנית תעוף מייד אולי יוחזר ערך שגוי אולי השרות יסתיים ללא בעיה אך התוכנית תעוף / תתקע לאחר מכן ... ובכתיב לוגי: תנאי קדם  תנאי אחר, (תנאי קדם)!  ? סימון: @post

כיצד נסמן? בכתיבת חוזים חשוב לשמור על בקורס הנוכחי אנחנו מאפשרים גמישות בתחביר של כתיבת חוזים ניתן להשתמש ב: תנאים בוליאניים בג'אווה (x >=0) תגיות מהסגנון (שנלמד בהרצאה): @pre, @post, $prev, $ret, $implies ביטויים ונוסחאות מתמטיים ( x  [0,1]) שפה חופשית ("M is a diagonal square matrix”) שילובים של הנ"ל, ועוד בכתיבת חוזים חשוב לשמור על התייחסות לכל המקרים שמתאימים לתנאי הקדם בתנאי האחר תמציתיות, בהירות ודיוק! (בייחוד אם משתמשים בשפה טבעית)

שאילתות BankAccount שאילתות public class BankAccount { public double getBalance() { ...; } public long getAccountNumber() { public Customer getOwner() { private double balance; private long accountNumber; private Customer owner; שאילתות מוסכמה: הגישה לשדה field תעשה בעזרת המתודה getField(). שמירה על מוסכמה זו הכרחית בסביבות GUI Builders ו- JavaBeans אין תנאיי קדם ואחר לשאילתות חשוב לשמור על מוסכמות השמות של getters ו-setters (JavaBeans) כי ישנם הרבה כלים שמתבססים על זה, כמו לדוגמא gui-builders מצב פנימי

getter/setter יש חשיבות לגישה לנתונים דרך מתודות. מדוע? לא כל שדה עם נראות פרטית (private) צריך getter/setter ציבורי למשל: עבור השדה balance האם דרוש getter? כן, זהו חלק מהממשק של חשבון בנק האם דרוש setter? public void setBalance(double balance) { this.balance = balance; } לא בהכרח, פעולות של משיכה או הפקדה אמנם משפיעות על היתרה, אבל פעולה של שינוי יתרה במנותק מהן אינה חלק מהממשק החשיבות של גישה לנתונים דרך מתודות: 1. מאפשר להגדיר getter ולא setter. 2. מוסכמות של JavaBeans ויש כלים שמסתמכים על מוסכמות אלו כמו מחוללי GUI. 3. מאפשר לשנות את המימוש

פקודות: משיכה והפקדה שקול ל- this.balance אפשרות א': חוזה public void deposit(double amount) { balance += amount; }   public void withdraw(double amount) { balance -= amount; שקול ל- this.balance אפשרות א': חוזה /** * Withdraw amount from the account * * @pre 0 < amount <= getBalance() * @post getBalance() == $prev(getBalance()) - amount */ ??????????????????????????????????????? ???????????????????????????????????????

אפשרות ב': תכנות מתגונן: פקודות: משיכה והפקדה public void deposit(double amount) { balance += amount; }   public void withdraw(double amount) { balance -= amount; /** * Withdraw amount from the account * * @pre 0 < amount <= getBalance() * @post getBalance() == $prev(getBalance()) - amount */ public void withdraw(double amount) { if (amount < 0 || amount > getBalance()) { System.out.println("Invalid withdrawal amount: "+ amount); return; } balance -= amount; אפשרות ב': תכנות מתגונן:

דיון – העברה בנקאית מספר חלופות למימוש העברת סכום מחשבון לחשבון: אפשרות א: מתודה סטטית שתקבל שני חשבונות בנק ותבצע ביניהם העברה: /** * Makes a transfer of amount from one account to the other * @pre 0 < amount <= from.getBalance() * @post to.getBalance() == $prev(to.getBalance()) + amount * @post from.getBalance() == $prev(from.getBalance()) – amount */ public static void transfer(double amount, BankAccount from, BankAccount to) { from.withdraw(amount); to.deposit(amount); }

אפשר גם להשתמש בהעמסה של withdraw דיון – העברה בנקאית אפשרות ב: אחד החשבונות אחראי לפעולה (למשל, מעביר הכסף) /** * Makes a transfer of amount from the current * account to the other one */ public void transferTo(double amount, BankAccount other) { other.deposit(amount); withdraw(amount); } withdraw אפשר גם להשתמש בהעמסה של withdraw

בנאי תפקיד: ליצור עצם חדש ולאתחל את שדותיו בנאי לא אמור לכלול לוגיקה נוספת פרט לכך! לאחר האתחול העצם חייב לקיים את משתמר המחלקה דוגמא למשתמר: מאזן אי-שלילי, בעלים אינו null, מס' חשבון חיובי... במחלקה BankAccount: בנאי ברירת המחדל יוצר עצם שאינו מקיים את המשתמר! נותן ערכי ברירת מחדל לכל השדות, ולכן, למשל, הבעלים הוא null. יש דברים שאינם באחריות המחלקה. למשל: מי דואג לתקינות מספרי חשבון? (למשל שיהיו שונים) מי מנהל את מאגר הלקוחות? לא בהכרח צריך לתת את ה-ID בבנאי. אפשר להחזיק מחולל במחלקה

בנאי BankAccount /** * Constructs a new account and sets its owner and identifier * @pre id > 0 * @pre customer != null * @post getOwner() == customer * @post getAccountNumber() == id * @post getBalance() == 0 */ public BankAccount(Customer customer, long id) { accountNumber = id; owner = customer; } אין ערך החזרה לבנאי! לא נקרא ל- new BankAccount מכאן אם יש בעיה בקלט אי אפשר להחזיר null

העמסת בנאים /** * Constructs a new account and sets its owner and identifier * @pre id > 0 * @pre customer != null * @pre initialBalance >= 0 * @post getOwner() == customer * @post getAccountNumber() == id * @post getBalance() == initialBalance */ public BankAccount(Customer customer, long id, double initialBalance) { this(customer, id); balance = initialBalance; } תזכורת: העמסה = יצירת מתודה בעלת שם זהה אך עם ארגומנטים שונים. באופן דומה ניתן להגדיר בנאים עם ארגומנטים שונים. this() כאן משמש לא כמשתנה אלא כקריאה לבנאי אחר של אותה מחלקה שיבצע אתחול ראשוני על העצם שאנו מייצרים. ניתן להשתמש בתחביר זה רק מתוך בנאי!

עצמים, מחלקות, נראות ומה שביניהם

קריאה למתודה פרטית ממתודה פומבית המחלקה CurrentClass public class CurrentClass {   public static void myPublicStaticMethod() { System.out.println("In myPublicStaticMethod"); } private static void myPrivateStaticMethod() { System.out.println("In myPrivateStaticMethod"); public void myPublicMethod() { System.out.print("In myPublicMethod >> "); myPrivateMethod(); private void myPrivateMethod() { System.out.println("In myPrivateMethod"); קריאה למתודה פרטית ממתודה פומבית (גם ההפך זה בסדר)

המחלקה OtherClass public class OtherClass { public static void othersPublicStaticMethod() { System.out.println("In othersPublicStaticMethod"); } private static void othersPrivateStaticMethod() { System.out.println("In othersPrivateStaticMethod"); public void othersPublicMethod() { System.out.print("In othersPublicMethod >> "); othersPrivateMethod();   private void othersPrivateMethod() { System.out.println("In othersPrivateMethod");

נוסיף main ל-CurrentClass public class CurrentClass {   public static void main(String[] args) { CurrentClass.myPublicStaticMethod(); myPublicStaticMethod(); CurrentClass.myPrivateStaticMethod(); CurrentClass.myPublicMethod(); CurrentClass currentClass = new CurrentClass(); currentClass.myPublicMethod(); currentClass.myPrivateMethod(); currentClass.myPublicStaticMethod(); OtherClass.othersPublicStaticMethod(); othersPublicStaticMethod(); OtherClass.othersPrivateStaticMethod(); OtherClass otherClass = new OtherClass(); otherClass.othersPublicMethod(); otherClass.othersPrivateMethod(); } ... // Prints: In myPublicStaticMethod // Prints: In myPublicStaticMethod // Prints: In myPrivateStaticMethod // Prints: In myPublicMethod >> In myPrivateMethod // Prints: In myPrivateMethod //Has a warning, Prints: In myPublicStaticMethod // Prints: In othersPublicStaticMethod // Prints: In othersPublicMethod >> In othersPrivateMethod

מסקנות מתודה סטטית אינה יכולה לקרוא למתודה שאינה סטטית חייבים לציין מיהו העצם שהשירות משויך אליו myPublicMethod()לא יעבוד (מתוך מתודה סטטית) currentClass.myPublicMethod() כן! נראות מגדירה מאיזה מקום בקוד ניתן לגשת למתודה נראות פרטית = ניתן לגשת רק מהקוד של אותה מחלקה נראות פומבית = ניתן לגשת מכל מחלקה (אם היא לא באותה חבילה, יש להוסיף הצהרת import) נלמד על עוד שני סוגים בהמשך

Instance vs. Class (static) Fields Instance fields Class (static) fields למה? ייצוג פנימי של המופע מתי? מאותחלים עם יצירת האובייקט כמה? אחד לכל מופע מאיפה? נגישים אך ורק ממתודות מופע! (למה?) למה? קבועים ערכים המשותפים לכל מופעי המחלקה מתי? מאותחלים לפי הסדר עם טעינת המחלקה כמה? יש רק 1 בכל התוכנית! (0 לפני טעינת המחלקה) מאיפה? נגישים ממתודות סטטיות ומתודות מופע מתי מחלקה מאותחלת בג'אווה? A class or interface type T will be initialized immediately before the first occurrence of any one of the following: T is a class and an instance of T is created. T is a class and a static method declared by T is invoked. A static field declared by T is assigned. A static field declared by T is used and the field is not a constant variable (§4.12.4). T is a top level class (§7.6), and an assert statement (§14.10) lexically nested within T (§8.1.3) is executed.

דוגמא public class BankAccount { public static final String BANK_NAME = "BNP"; //static constant private static int lastAccountId = 0; //static field private int id; public BankAccount() { id = ++lastAccountId; // unique ID for every account } /* static method */ public static void main(String[] args) { System.out.println(lastAccountId); System.out.println(id); BankAccount account = new BankAccount(); System.out.println(account.id); /* instance method */ public void printStuff() { Why?? ניגשים לשדה פרטי של מחלקה, ולכן הוא לא מוגדר בסקופ הזה

הסוף... 25