56
ההההה1 ההההJava ההההה הההה4 : הההההה ןן ןןןןןן

תוכנה 1 בשפת Java שיעור מספר 4: מחלקות

  • Upload
    lesa

  • View
    105

  • Download
    11

Embed Size (px)

DESCRIPTION

תוכנה 1 בשפת Java שיעור מספר 4: מחלקות. דן הלפרין. על סדר היום. חוזים, נכונות והסתרת מידע מחלקות כטיפוסי נתונים שימוש במחלקות קיימות. טענות על המצב. האם התוכנה שכתבנו נכונה ? איך נגדיר נכונות ? משתמר (שמורה, invariant ) – הוא ביטוי בולאני שערכו נכון 'תמיד' - PowerPoint PPT Presentation

Citation preview

Page 1: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה

: מחלקות 4שיעור מספר

דן הלפרין

Page 2: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

2

על סדר היום

חוזים, נכונות והסתרת מידעמחלקות כטיפוסי נתונים

שימוש במחלקות קיימות

Page 3: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

3

טענות על המצב

נכונההאם התוכנה שכתבנו? נכונותאיך נגדיר?שמורה, משתמר( invariant הוא ביטוי בולאני – )

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

בכל רגע נתוןtrue שערכו ונוכיחמשתמר, להוכחה פורמלית )בעזרת לוגיקה( יש חשיבות

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

בתוכנההשימוש

Page 4: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

4

זהו אינו "דיון אקדמי"

להוכחת נכונות של תוכנה חשיבות גדולה במגוון רחב של יישומים

:לדוגמא בתוכנית אשר שולטת על בקרת הכור הגרעיני נרצה שיתקיים בכל

רגע נתון:plutoniumLevel < CRITICAL_MASS_THRESHOLD

בתוכנית אשר שולטת על בקרת הטיסה של מטוס נוסעים נרצהשיתקיים בכל רגע נתון:

(cabinAirPressure < 1) $implies airMaskState == DOWN

נרצה להשתכנע כי בכל רגע נתון בתוכנית לא יתכן כי המשתמר אינוtrue

Page 5: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

5

הוכחת נכונות של טענה

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

:)(mלשרות

/** @inv counter == #calls for m() */ public class StaticMemberExample {

public static int counter; //initialized by default to 0

public static void m() { counter++;}

} על מספר הקריאות ל- באינדוקציהנוכיח זאת m)( עבור ,

כל קטע קוד שיש בו התייחסות למחלקה StaticMemberExample

Page 6: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

6

"הוכחה"( מקרה בסיסn=0:) אם בקטע קוד מסוים אין קריאה למתודה m()

לזיכרון התוכנית StaticMemberExampleאזי בזמן טעינת המחלקה לאפס. והדרוש נובע. counterמאותחל המשתנה

( הנחת האינדוקציהn=k:) נניח כי קיים k טבעי כלשהו כך שבסופו . k הוא counter ערכו של ()m קריאות לשרות kשל כל קטע קוד שבו

( צעד האינדוקציהn=k+1:) נוכיח כי בסופו של קטע קוד עם k+1 k+1 הוא counter ערכו של ()mקריאות ל

. נתבונן בקריאה ()m קריאות ל k+1: יהי קטע הקוד שבו הוכחה קריאות k. קטע הקוד עד לקריאה זו הוא קטע עם ()mהאחרונה ל-

. בעת counter==kבלבד. ולכן לפי הנחת האינדוקציה בנקודה זו . k+1 ולכן ערכו עולה ל ++counter מתבצע ()mביצוע המתודה

בתוכנית, ערכו של ()mמכיוון שזוהי הקריאה האחרונה ל counter עד לסוף התוכנית ישאר k+1 .מ.ש.ל. כנדרש

Page 7: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

7

דוגמא נגדית

public class CounterExample {

public static void main(String[] args) { StaticMemberExample.m(); StaticMemberExample.m(); StaticMemberExample.counter++;

}}

?מה היה חסר ב"הוכחה" בשקף הקודם לא לקחנו בחשבון שניתן לשנות אתcounter גם מחוץ למחלקה

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

counterהגישה למשתנה

Page 8: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

8

(private visibilityנראות פרטית )

הגדרת משתנה או שרות כprivate מאפשרים גישה אליו רק מתוך המחלקה שבה הוגדר:

/** @inv counter == #calls for m() */ public class StaticMemberExample {

private static int counter; //initialized by default to 0

public static void m() { counter++;}

}

public class CounterExample {

public static void main(String[] args) { StaticMemberExample.m(); StaticMemberExample.m(); StaticMemberExample.counter++; System.out.println("main(): m() was called " + StaticMemberExample.counter + " times");

}}

Page 9: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

9

הסתרת מידע והכמסה

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

כעת אם קיימת שגיאה בניהול המשתנהcounter היא ואין StaticMemberExampleלבטח נמצאת בתוך המחלקה

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

הכמסהתיחום זה מכונה( encapsulation)

הסתרת מידעאת ההכמסה הישגנו בעזרת( information hidingמהלקוח )

בעיה – ההסתרה גורפת מדי - כעת הלקוח גם לא יכולcounter את ערכו של לקרוא

Page 10: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

10

גישה מבוקרת

( נגדיר מתודות גישה ציבוריותpublic אשר )יחזירו את ערכו של המשתנה הפרטי

/** @inv getCounter() == #calls for m() */ public class StaticMemberExample {

private static int counter; public static int getCounter() { return counter; }

public static void m() { counter++; }}

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

מבין

Page 11: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

11

גישה מבוקרת

הלקוחות ניגשים למונה דרך המתודה שמספק להםהספק

public class CounterExample {

public static void main(String[] args) { StaticMemberExample.m(); StaticMemberExample.m(); // StaticMemberExample.counter++; - access forbidden

System.out.println("main(): m() was called " + StaticMemberExample.getCounter() + " times"); }}

Page 12: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

12

הוכחת החוזה

נוסף על הוכחת נכונות המשתמר, נרצה להוכיח כי החוזה של כל אחתמהמתודות מתקיים

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

מבנה הוכחות אלו כולל בדיקת כל המקרים האפשריים או הוכחהבאינדוקציה )בדומה למה שראינו בהוכחת המשתמר(

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

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

דוגמאות לכך ניתן למצוא בקובץ הדוגמאות באתר הקורס – "הוכחתנכונות של שרותים"

Page 13: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

13

משתמר הייצוג

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

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

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

בולאניות לגבי היבטים של המימוש

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

המחלקה בלבד

Page 14: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

14

משתמר הייצוג

( משתמר ייצוגrepresentation invariant, Implementation invariant הוא בעצם משתמר המכיל )

(privateמידע פרטי ):לדוגמא

/** @inv getCounter() == #calls for m() * @imp_inv counter == #calls for m() */ public class StaticMemberExample { private static int counter; public static int getCounter() { return counter; }}

Page 15: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

15

תנאי בתר ייצוגי

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

/** @imp_post isIntialized */public static void init(String login, String password)

אבל לא בתנאי קדם?מדוע

Page 16: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

16

מתודות עזר

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

כלפי חוץ:סיבות אפשריות להגדרת שרותים כפרטיים

השרות מפר את המשתמר ויש צורך לתקנו אחר כך השרות מבצע חלק ממשימה מורכבת, ויש לו הגיון רק

במסגרתה )לדוגמא שרות שנוצר ע"י חילוץ קטע קוד למתודה(

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

השרות מפר את רמת ההפשטה של המחלקה )לדוגמאsort כמתודת עזר(quicksortהמשתמשת ב

Page 17: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

17

נראות ברמת החבילה(package friendly)

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

כלומר ניתן לגשת לתכונה )משתנה או שרות( אך ורק מתוך מחלקות( כמו המחלקה שהגדירה את התכונהpackageשבאותה החבילה )

ההיגיון בהגדרת נראות כזו, הוא שמחלקות באותה החבילה כנראהנכתבות באותו ארגון )אותו צוות בחברה( ולכן הסיכוי שיכבדו את

המשתמרים זו של זו גבוה

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

Page 18: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

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

שימוש במחלקות קיימות

Page 19: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

19

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

ביסודה של גישת התכנות מונחה העצמים היא ההנחהבשפת ע"י ישויות מעולם הבעיהשניתן לייצג ישויות

התכנות

( בכתיבת מערכת תוכנה בתחום מסויםdomain נרצה ,)לתאר את המרכיבים השונים באותו תחום כטיפוסים

ומשתנים בתוכנית המחשב

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

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

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

Page 20: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

20

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

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

מופע( instance של מחלקה נקרא )עצם( object)

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

:כל מופע עשוי להכיל( נתוניםdata members, instance fields)( שרותיםinstance methods) ,בנאים( פונקציות אתחולconstructors)

Page 21: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

21

מחלקות ועצמים

כבר ראינו בקורס שימוש בטיפוסים שאינם פרימיטיביים: מחרוזתומערך

גם ראינו שעקב שכיחות השימוש בהם יש להם הקלות תחביריות והעמסת אופרטור(newמסוימות )פטור מ-

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

)זאת בשונה ממשתנים יסודיים )טיפוסים פרימיטיביים

:דוגמא: בהגדרהint i=5 , j=7;i -וj הם מופעים שלint" כשם ש hello "" -וworld הם מופעים "

Stringשל

Page 22: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

שרותי מופע

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

:תחביר של הפעלת שרות מופע הוא

objRef.methodName)arguments(

לדוגמא:

String str = "SupercaliFrajalistic";int len = str.length();

( זאת בשונה מזימון שרות מחלקהstatic:)

className.methodName)arguments(

לדוגמא:

String.valueOf(15); // returns the string “15”

!שימו של כי האופרטור נקודה ).( משמש בשני המקרים בתפקידים שונים לגמריJava בשפת 1תוכנה

אוניברסיטת תל אביב

22

Page 23: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

new

כדי לייצר אובייקט ממחלקה מסוימת יש לקרוא לאופרטורnew ואחריו שם המחלקה ואחריו סוגריים

new ClassName([Arguments]);

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

-אופרטור הnew מקצה זיכרון לאובייקט החדש ומאתחל אותו ע"י קריאה לבנאי

לדוגמא: כדי לייצר אובייקט מהמחלקהTurtle נקרא לבנאי שלו:

Turtle leonardo = new Turtle();

Java בשפת 1תוכנה אוניברסיטת תל אביב

23

Page 24: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

24

שימוש במחלקות קיימות

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

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

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

כותב המחלקה לא סיפק את הקוד שלה אלא רק עמוד תיעוד המתאר(class של קובצי JARאת הצב )המחלקה ארוזה ב

Page 25: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת1תוכנה אוניברסיטת תל אביב

25

Turtle API

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

המחלקה ע"י קריאה לבנאי עם newהאופרטור

סוגים 2 – נפריד בין שרותיםשונים:

– אינם שרותי מחלקה1.מתייחסים לעצם מסוים,

staticמסומנים

– שרותים אשר שרותי מופע2.מתייחסים לעצם מסוים. יופנו לעצם מסוים ע"י שימוש

באופרטור הנקודה

Page 26: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

26

Turtle API

סוגים של שרותי מופע:( – queries )שאילתות1.

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

מצב העצםבשיעור הבא נדון בסוגים •

שונים של שאילתות

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

העצם שעליו הם פועלים

Page 27: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

27

דוגמת שימושpublic class TurleClient {

public static void main(String[] args) {Turtle leonardo = new Turtle();

if(!leonardo.isTailDown()) leonardo.tailDown();

leonardo.moveForward(50);leonardo.turnRight(90);

leonardo.moveForward(50);leonardo.turnRight(90);

leonardo.moveForward(50);leonardo.turnRight(90);

leonardo.moveForward(50);leonardo.turnRight(90);

}}

Page 28: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

28

עוד דוגמת שימוש

public class TurleClient {

public static void main(String[] args) {Turtle leonardo = new Turtle();leonardo.tailDown();drawSquarePattern(leonardo, 50, 10);

}

public static void drawSquare(Turtle t, int size) {for (int i = 0; i < 4; i++) {

t.moveForward(size);t.turnRight(90);

}}

public static void drawSquarePattern(Turtle t, int size, int angle) {for (int i = 0; i < 360/angle; i++) {

drawSquare(t, size);t.turnRight(angle);

}}

}

Page 29: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

29

"לאונרדו יודע..."

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

מדוע המחלקהTurtle לא הכילה מלכתחילה את ?drawSquarePattern ו- drawSquareהשרותים

יש לכך יתרונות וחסרונות

?איך לימדנו את הצב את התעלולים החדשים

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

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

Page 30: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

בניית אפליקציה בגישה פרוצדורלית

בשפה מונחית עצמיםמסנכרן כתוביות

Page 31: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

מבוסס על סיפור אמיתי...

הכתוביות יצאו מסנכרון אחרי הפסקת הפרסומות

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

:קריטריונים לפתרוןפשוטמהיר

Java בשפת 1תוכנה אוניברסיטת תל אביב

31

Page 32: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

סנכרון כתוביות מחדש

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

?איך כותבים תוכנית סנכרון כזוReverse Engineeringניסוי וטעייהCommon Sense

Java בשפת 1תוכנה אוניברסיטת תל אביב

32

Page 33: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

(High Level Design)תוכנית הפעולה

נחשב כמה זמן נמשכת הפסקת הפרסומות1.

נוסיף את הזמן הזה לכל תזמוני הכתוביות 2.מנקודה זו ואילך

( תיכון מפורטLow Level Design). נקרא את הקובץ שורה אחר שורה1

אם כבר הגענו לחלק שיצא מסנכרון1.1 נזהה איזה חלק של השורה מייצג את הזמן1.1.1

נחשב את הזמן החדש )ע"י הוספת משך הפרסומות(1.1.2

נחליף את הזמן הישן בזמן החדש1.1.3

Java בשפת 1תוכנה אוניברסיטת תל אביב

33

כדי לפשט את התוכנית במקום

את הקובץ לשנותנדפיס את הכתוביות

המתוקנות למסך)ונעתיק אותן אחר כך

לקובץ חדש(

Page 34: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

צורת העבודה

( צעדי תינוקbaby steps)פשטותמהירות)לימוד תוך כדי ריצה )אד-הוק

איך לקרוא קובץ שורה אחרי שורהבעיה : כנראה יש כבר ספריות \ מחלקות שעושות את זה, אבל

אנחנו אפילו לא יודעים איך הן נקראות

אם משהו כבר עשה את זה – גוגל בטח יודע מזהפתרון :Java בשפת 1תוכנה

אוניברסיטת תל אביב

34

Page 35: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

35

Page 36: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

import java.io.*;

public class SubSynchronizer {

public static void main(String args[]) {try {

// Open the file that is the first command line parameterFileInputStream fstream = new FileInputStream("C:\\home\\danha\\COURSES\\SOFT1-0910\\PROGRAMS\\movie.srt ");

// Get the object of DataInputStreamDataInputStream in = new DataInputStream(fstream);BufferedReader br = new BufferedReader(new InputStreamReader(in));String strLine = null;

// Read File Line By Linewhile ((strLine = br.readLine()) != null) {

// Print the content on the consoleSystem.out.println(strLine);

{

// Close the input streamin.close)(;

} catch (Exception e) { // Catch exception if anySystem.err.println("Error: " + e.getMessage());

}}

} Java בשפת 1תוכנה אוניברסיטת תל אביב

36

Page 37: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

לזהות את הפסקת הפרסומות

איך משווים בין מחרוזות בJava? אוליGoogle יודע? אולי יש שרות כזה למחלקה

String? מכיוון שיש סבירות גבוהה שיש שרות כזה למחלקה

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

37

Page 38: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

38

Page 39: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

לזהות את הפסקת הפרסומות

boolean passedCommescialBreak = false;

// Read File Line By Linewhile ((strLine = br.readLine()) != null) {

if (strLine.equals("498"))passedCommescialBreak = true;

if (passedCommescialBreak)System.out.println("*** TO CHANGE *** " + strLine);

else// Print the content on the consoleSystem.out.println(strLine);

}

39

Page 40: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

עידון התנאי

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

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

?Stringהמתאים של contain, substring

if (passedCommescialBreak && strLine.contains("-->")){System.out.println("*** TO CHANGE *** " + strLine);

}Java בשפת 1תוכנה

אוניברסיטת תל אביב

40

Page 41: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

מה עכשיו?

חלקים:3נחלק את השורה ל-1.זמן התחלה--<זמן סיום

עבור הזמנים נחשב את הזמנים המתוקנים2.

נרכיב חזרה3.

?איך שוברים שורה מהן מילות החיפוש שיניבו את השרות המתאים במחלקהString?

?איך בודקים שהשרות עובדכותבים תוכנית בדיקה

Java בשפת 1תוכנה אוניברסיטת תל אביב

41

Page 42: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

תוכנית בדיקה

public class TestSplit {

public static void main(String[] args) {String s = "00:42:14,550 --> 00:42:16,350";String [] parts = s.split)"-->"(;System.out.println(parts[0]);System.out.println(parts[1]);

}}

Java בשפת 1תוכנה אוניברסיטת תל אביב

42

Page 43: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

הורדת תווים לבנים

Java בשפת 1תוכנה אוניברסיטת תל אביב

43

public class TestSplit{

public static void main(String[] args) {String s = "00:42:14,550 --> 00:42:16,350";String [] parts = s.split)"-->"(;

String startTime = parts[0].trim();String endTime = parts[1].trim();

System.out.println(startTime);System.out.println(endTime);

{

{

Page 44: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

חישוב הזמנים החדשים

חישוב ידני של הזמן החדשהרבה מקרי קצה

מציאת מחלקות \ שרותי עזר שעושים זאת

Java בשפת 1תוכנה אוניברסיטת תל אביב

44

Page 45: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

מחרוזות וזמנים

הפעולה מורכבת

יש בJavaמחלקות אשר יודעות לייצג זמנים ולבצע עליהם פעולות java.util.Datejava.util.GregorianCalendar

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

את התרגום ניתן לבצע ידנית: ע"יsplit',' -של המחרוזת לפי התווים ':' ו אוטומטית: ע"י מחלקת עזרjava.text.SimpleDateFormat –נתמקד בזה

Java בשפת 1תוכנה אוניברסיטת תל אביב

45

Page 46: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

try {String startTime = "00:42:14,550";

SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss,SSS");formatter.parse(startTime);Calendar cal = formatter.getCalendar();

System.out.println("hours: " + cal.get(Calendar.HOUR));System.out.println("minutes: " + cal.get(Calendar.MINUTE));System.out.println("seconds: " + cal.get(Calendar.SECOND));System.out.println("miliseconds: " + cal.get(Calendar.MILLISECOND));

cal.add(Calendar.SECOND, 50);System.out.println("\n*** Adding 50 seconds ***\n");

System.out.println("hours: " + cal.get(Calendar.HOUR));System.out.println("minutes: " + cal.get(Calendar.MINUTE));System.out.println("seconds: " + cal.get(Calendar.SECOND));System.out.println("miliseconds: " + cal.get(Calendar.MILLISECOND));

startTime = formatter.format(cal.getTime());System.out.println(startTime);

} catch (ParseException e) {System.out.println("Exception :" + e);

}

Java בשפת 1תוכנה אוניברסיטת תל אביב

48

SimpleDateFormatתוכנית בדיקה

Page 47: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Q.A.

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

גיבוי

Java בשפת 1תוכנה אוניברסיטת תל אביב

49

Page 48: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

(reuseשימוש חוזר )

?עד כמה התוכנית שלנו ניתנת לשימוש חוזרשימוש חוזר על ידי מי? משתמשים, מתכנתים

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

?אילו שינויים רלוונטיים למשתמשים?אילו שינויים רלוונטיים למתכנתים

כך שתהיה מראשהאם היה עדיף לכתוב את התוכנית ,כללית?

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

Java בשפת 1תוכנה אוניברסיטת תל אביב

50

Page 49: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

ספריות ויישומים(Libraries and Applications)

Page 50: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

52

ספריות

ספרייה היא מודול תוכנה המכיל אוסף של טיפוסים ושרותים שימושיים

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

במחלקה שלו

לדוגמא: מחלקות הספרייהString, Date, LinkedList מספקות לוגיקה שימושית בהקשרים רבים

לספרייה איןmain?אז איך מריצים אותה ,לא מריצים. משתמשים. לקוחות של הספרייה, אולי ספריות בעצמן

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

Page 51: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

53

ספריות

ספרייה אינה מדפיסה למסך כדי לתקשר עם לקוחותיה ספרייה יכולה להחזיר ערכים או

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

את הערך המוחזר ויחליטו מה לעשות איתו, לפי המידע שברשותן

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

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

Page 52: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

54

יישומים

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

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

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

בהקשר זה בלבד למשל: הוא יכול להדפיס למסך )כי הוא יודע שיש

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

Page 53: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

55

יישומים

כאשר היישום הוא גדול ומורכב )למשל מעבדתמלילים( קיים קושי להחליט עד כמה כללי יהיה

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

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

שימוש חוזר בתוך היישום

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

תיכון או עיצובמראש. שלב זה נקרא גם

Page 54: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

Java בשפת 1תוכנה אוניברסיטת תל אביב

56

עיצוב ספריות

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

Application Programming Interface )API(

עקרונות לAPI:מוצלח פשוטקטןשימושיסימטרי

דרוש הרבה נסיון כדי לכתובAPI מוצלח - לדעת מה הלקוחות רוצים וצריכים

How To Design A Good API and Why it Mattershttp://video.google.com/videoplay?docid=-3733345136856180693

Page 55: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

עיצוב יישומים

פירוק פונקציונלי ספר"להשאיללדוגמא: "המערכת תאפשר דוא"ל"לשלוחלדוגמא: "התוכנה תאפשר

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

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

מימושו כמחלקות טבעי ויעודד שימוש חוזר

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

Java בשפת 1תוכנה אוניברסיטת תל אביב

57

Page 56: תוכנה 1 בשפת   Java שיעור מספר 4:  מחלקות

תרגיל בית )לא להגשה(

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

)כיישום למשתמש קצה )אפליקציה )כספרייה )כלומר: מחלקת עזר למתכנת

כתיבת מחלקות תילמד בשבוע הבא

?עם איזו מהם כדאי להתחיל

Java בשפת 1תוכנה אוניברסיטת תל אביב

58