תוכנה 1 בשפת Java שיעור מספר 4: מחלקות
description
Transcript of תוכנה 1 בשפת Java שיעור מספר 4: מחלקות
Java בשפת 1תוכנה
: מחלקות 4שיעור מספר
דן הלפרין
Java בשפת 1תוכנה אוניברסיטת תל אביב
2
על סדר היום
חוזים, נכונות והסתרת מידעמחלקות כטיפוסי נתונים
שימוש במחלקות קיימות
Java בשפת 1תוכנה אוניברסיטת תל אביב
3
טענות על המצב
נכונההאם התוכנה שכתבנו? נכונותאיך נגדיר?שמורה, משתמר( invariant הוא ביטוי בולאני – )
שערכו נכון 'תמיד' נוכיח כי התוכנה שלנו נכונה ע"י כך שנגדיר עבורה
בכל רגע נתוןtrue שערכו ונוכיחמשתמר, להוכחה פורמלית )בעזרת לוגיקה( יש חשיבות
של הדו משמעיותמכיוון שהיא מנטרלת את אופן השפה הטבעית וכן היא לא מניחה דבר על
בתוכנההשימוש
Java בשפת 1תוכנה אוניברסיטת תל אביב
4
זהו אינו "דיון אקדמי"
להוכחת נכונות של תוכנה חשיבות גדולה במגוון רחב של יישומים
:לדוגמא בתוכנית אשר שולטת על בקרת הכור הגרעיני נרצה שיתקיים בכל
רגע נתון:plutoniumLevel < CRITICAL_MASS_THRESHOLD
בתוכנית אשר שולטת על בקרת הטיסה של מטוס נוסעים נרצהשיתקיים בכל רגע נתון:
(cabinAirPressure < 1) $implies airMaskState == DOWN
נרצה להשתכנע כי בכל רגע נתון בתוכנית לא יתכן כי המשתמר אינוtrue
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
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 .מ.ש.ל. כנדרש
Java בשפת 1תוכנה אוניברסיטת תל אביב
7
דוגמא נגדית
public class CounterExample {
public static void main(String[] args) { StaticMemberExample.m(); StaticMemberExample.m(); StaticMemberExample.counter++;
}}
?מה היה חסר ב"הוכחה" בשקף הקודם לא לקחנו בחשבון שניתן לשנות אתcounter גם מחוץ למחלקה
שבה הוגדר של הלקוחות בקודבאופן השימושכלומר, נכונות הטענה תלויה מלקוחות המחלקה את למנועלצורך שמירה על הנכונות יש צורך
counterהגישה למשתנה
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");
}}
Java בשפת 1תוכנה אוניברסיטת תל אביב
9
הסתרת מידע והכמסה
-שימוש בprivate תוחם את הבאג" ונאכף על ידי" המהדר
כעת אם קיימת שגיאה בניהול המשתנהcounter היא ואין StaticMemberExampleלבטח נמצאת בתוך המחלקה
צורך לחפש אותה בקרב הלקוחות )שעשויים להיות רבים(
הכמסהתיחום זה מכונה( encapsulation)
הסתרת מידעאת ההכמסה הישגנו בעזרת( information hidingמהלקוח )
בעיה – ההסתרה גורפת מדי - כעת הלקוח גם לא יכולcounter את ערכו של לקרוא
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++; }}
המשתמר הוא חלק מהחוזה של הספק כלפי הלקוח ולכן הוא מנוסח בשפה שהלקוח
מבין
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"); }}
Java בשפת 1תוכנה אוניברסיטת תל אביב
12
הוכחת החוזה
נוסף על הוכחת נכונות המשתמר, נרצה להוכיח כי החוזה של כל אחתמהמתודות מתקיים
כלומר בהינתן שתנאי הקדם מתקיים נובע תנאי האחר
מבנה הוכחות אלו כולל בדיקת כל המקרים האפשריים או הוכחהבאינדוקציה )בדומה למה שראינו בהוכחת המשתמר(
כי ומוכיחים כי תנאי הקדם מתקיים בכניסה לשרות מניחיםאנו תנאי האחר מתקיים ביציאה מהשרות
להוכחות כאלו יש חשיבות בבניית אמינות לספריות תוכנה, בפרט אםהם משמשות במערכות חיוניות
דוגמאות לכך ניתן למצוא בקובץ הדוגמאות באתר הקורס – "הוכחתנכונות של שרותים"
Java בשפת 1תוכנה אוניברסיטת תל אביב
13
משתמר הייצוג
ראינו שימוש בחוזה של מחלקה כדי לבטא בצורה מפורשתאת גבולות האחריות עם לקוחות המחלקה
"אולם, ניתן להשתמש במתודולוגיה של "עיצוב ע"פ חוזהגם "לצורכי פנים"
כשם שהחוזה מבטא הנחות והתנהגות בצורה פורמליתיותר מאשר הערות בשפה טבעית, כך ניתן להוסיף טענות
בולאניות לגבי היבטים של המימוש
כדי שלא לבלבל את הלקוחות עם משתמר המכיל ביטויים המיועד לספקי משתמר ייצוגשאינם מוכרים להם, נגדיר
המחלקה בלבד
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; }}
Java בשפת 1תוכנה אוניברסיטת תל אביב
15
תנאי בתר ייצוגי
גם בתנאי בתר עלולים להיות ביטויים פרטייםשנרצה להסתיר מהלקוח:
/** @imp_post isIntialized */public static void init(String login, String password)
אבל לא בתנאי קדם?מדוע
Java בשפת 1תוכנה אוניברסיטת תל אביב
16
מתודות עזר
ע"י הגדרתו כ לשרותניתן למנוע גישה private הדבר מאפיין שרותי עזר, אשר אין רצון לספק לחשוף אותם
כלפי חוץ:סיבות אפשריות להגדרת שרותים כפרטיים
השרות מפר את המשתמר ויש צורך לתקנו אחר כך השרות מבצע חלק ממשימה מורכבת, ויש לו הגיון רק
במסגרתה )לדוגמא שרות שנוצר ע"י חילוץ קטע קוד למתודה(
הספק מעוניין לייצא מספר שרותים מצומצם, וניתן לבצע אתהשרות הפרטי בדרך אחרת
השרות מפר את רמת ההפשטה של המחלקה )לדוגמאsort כמתודת עזר(quicksortהמשתמשת ב
Java בשפת 1תוכנה אוניברסיטת תל אביב
17
נראות ברמת החבילה(package friendly)
כאשר איננו מציינים הרשאת גישה )נראות( של תכונה או מאפיין קיימתנראות ברמת החבילהברירת מחדל של
כלומר ניתן לגשת לתכונה )משתנה או שרות( אך ורק מתוך מחלקות( כמו המחלקה שהגדירה את התכונהpackageשבאותה החבילה )
ההיגיון בהגדרת נראות כזו, הוא שמחלקות באותה החבילה כנראהנכתבות באותו ארגון )אותו צוות בחברה( ולכן הסיכוי שיכבדו את
המשתמרים זו של זו גבוה
:נראות ברמת החבילה היא יצור כלאיים לא שימושימתירני מדי מכדי לאכוף את המשתמרקפדני מדי מכדי לאפשר גישה חופשית
המחלקה כטיפוס
שימוש במחלקות קיימות
Java בשפת 1תוכנה אוניברסיטת תל אביב
19
מחלקות כטיפוסי נתונים
ביסודה של גישת התכנות מונחה העצמים היא ההנחהבשפת ע"י ישויות מעולם הבעיהשניתן לייצג ישויות
התכנות
( בכתיבת מערכת תוכנה בתחום מסויםdomain נרצה ,)לתאר את המרכיבים השונים באותו תחום כטיפוסים
ומשתנים בתוכנית המחשב
:התחומים שבהם נכתבות מערכות תוכנה מגוונים בנקאות, ספורט, תרופות, מוצרי צריכה, משחקים
ומולטימדיה, פיסיקה ומדע, מנהלה, מסחר ושרותים...
שישקפו את התחום, כדי טיפוסי נתוניםיש צורך בהגדרת שנוכל לעלות ברמת ההפשטה שבה אנו כותבים תוכניות
Java בשפת 1תוכנה אוניברסיטת תל אביב
20
מחלקות כטיפוסי נתונים
של טיפוסים הרכבהמחלקות מגדירות טיפוסים שהם אחרים )יסודיים או מחלקות בעצמם(
מופע( instance של מחלקה נקרא )עצם( object)
בשפתJava כל המופעים של מחלקות הם עצמים חסרי שם )אנונימיים( והגישה אליהם היא דרך הפניות בלבד
:כל מופע עשוי להכיל( נתוניםdata members, instance fields)( שרותיםinstance methods) ,בנאים( פונקציות אתחולconstructors)
Java בשפת 1תוכנה אוניברסיטת תל אביב
21
מחלקות ועצמים
כבר ראינו בקורס שימוש בטיפוסים שאינם פרימיטיביים: מחרוזתומערך
גם ראינו שעקב שכיחות השימוש בהם יש להם הקלות תחביריות והעמסת אופרטור(newמסוימות )פטור מ-
:ראינו כי עבודה עם טיפוסים אלה מערבת שתי ישויות נפרדותהמכיל את המידעהעצם :משתנה שדרכו ניתן לגשת לעצם ההפנייה :
)זאת בשונה ממשתנים יסודיים )טיפוסים פרימיטיביים
:דוגמא: בהגדרהint i=5 , j=7;i -וj הם מופעים שלint" כשם ש hello "" -וworld הם מופעים "
Stringשל
שרותי מופע
פונקציות אשר מופעלות על מופע מסוים של שרותי מופע למחלקות יש –המחלקה
:תחביר של הפעלת שרות מופע הוא
objRef.methodName)arguments(
לדוגמא:
String str = "SupercaliFrajalistic";int len = str.length();
( זאת בשונה מזימון שרות מחלקהstatic:)
className.methodName)arguments(
לדוגמא:
String.valueOf(15); // returns the string “15”
!שימו של כי האופרטור נקודה ).( משמש בשני המקרים בתפקידים שונים לגמריJava בשפת 1תוכנה
אוניברסיטת תל אביב
22
new
כדי לייצר אובייקט ממחלקה מסוימת יש לקרוא לאופרטורnew ואחריו שם המחלקה ואחריו סוגריים
new ClassName([Arguments]);
בכל מחלקה מוגדרות פונקציות אתחול )אחת לפחות( ששמןבנאיםכשם המחלקה. פונקציות אלו נקראות
-אופרטור הnew מקצה זיכרון לאובייקט החדש ומאתחל אותו ע"י קריאה לבנאי
לדוגמא: כדי לייצר אובייקט מהמחלקהTurtle נקרא לבנאי שלו:
Turtle leonardo = new Turtle();
Java בשפת 1תוכנה אוניברסיטת תל אביב
23
Java בשפת 1תוכנה אוניברסיטת תל אביב
24
שימוש במחלקות קיימות
לטיפוס מחלקה תכונות בסיסיות, אשר סיפק כותב המחלקה, ואולםניתן לבצע עם העצמים פעולות מורכבות יותר ע"י שימוש באותן תכונות
את התכונות הבסיסיות יכול הספק לציין למשל בקובץ תיעוד הם ממומשיםאיך השרותים הללו עושים ולא מהתיעוד נכון יתאר התיעוד יפרט את חתימת השרותים ואת החוזה שלהם
נתבונן במחלקהTurtle המתקדם על משטח ציורצב לוגו המייצגת כאשר זנבו למטה הוא מצייר קו במסלול ההתקדמותכאשר זנבו למעלה הוא מתקדם ללא ציור
כותב המחלקה לא סיפק את הקוד שלה אלא רק עמוד תיעוד המתאר(class של קובצי JARאת הצב )המחלקה ארוזה ב
Java בשפת1תוכנה אוניברסיטת תל אביב
25
Turtle API
- – פונקצית אתחולבנאיניתן לייצר מופעים חדשים של
המחלקה ע"י קריאה לבנאי עם newהאופרטור
סוגים 2 – נפריד בין שרותיםשונים:
– אינם שרותי מחלקה1.מתייחסים לעצם מסוים,
staticמסומנים
– שרותים אשר שרותי מופע2.מתייחסים לעצם מסוים. יופנו לעצם מסוים ע"י שימוש
באופרטור הנקודה
Java בשפת 1תוכנה אוניברסיטת תל אביב
26
Turtle API
סוגים של שרותי מופע:( – queries )שאילתות1.
שרותים שיש להם ערך מוחזר •בדרך כלל לא משנים את •
מצב העצםבשיעור הבא נדון בסוגים •
שונים של שאילתות
( – commands )פקודות2.שרותים ללא ערך מוחזר•בדרך כלל משנים את מצב •
העצם שעליו הם פועלים
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);
}}
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);
}}
}
Java בשפת 1תוכנה אוניברסיטת תל אביב
29
"לאונרדו יודע..."
?מה לאונרדו יודע לעשות ומה אנו צריכים ללמד אותו
מדוע המחלקהTurtle לא הכילה מלכתחילה את ?drawSquarePattern ו- drawSquareהשרותים
יש לכך יתרונות וחסרונות
?איך לימדנו את הצב את התעלולים החדשים
עצם נשים לב להבדל בין השרותים הסטטיים שמקבלים ומבצעים עליו פעולות ובין שרותי המופע אשר כארגומנט
כארגומנט מפורשאינם מקבלים את העצם
בניית אפליקציה בגישה פרוצדורלית
בשפה מונחית עצמיםמסנכרן כתוביות
מבוסס על סיפור אמיתי...
הכתוביות יצאו מסנכרון אחרי הפסקת הפרסומות
אנו מחפשים פתרון לבעיה ספציפית?באילו דרכים ניתן לפתור את הבעיה
:קריטריונים לפתרוןפשוטמהיר
Java בשפת 1תוכנה אוניברסיטת תל אביב
31
סנכרון כתוביות מחדש
חלופותלהוריד תוכנית מחשב שתסנכרן את הכתוביותסנכרון ידניכתיבת תוכנית סנכרון בעצמנו
?איך כותבים תוכנית סנכרון כזוReverse Engineeringניסוי וטעייהCommon Sense
Java בשפת 1תוכנה אוניברסיטת תל אביב
32
(High Level Design)תוכנית הפעולה
נחשב כמה זמן נמשכת הפסקת הפרסומות1.
נוסיף את הזמן הזה לכל תזמוני הכתוביות 2.מנקודה זו ואילך
( תיכון מפורטLow Level Design). נקרא את הקובץ שורה אחר שורה1
אם כבר הגענו לחלק שיצא מסנכרון1.1 נזהה איזה חלק של השורה מייצג את הזמן1.1.1
נחשב את הזמן החדש )ע"י הוספת משך הפרסומות(1.1.2
נחליף את הזמן הישן בזמן החדש1.1.3
Java בשפת 1תוכנה אוניברסיטת תל אביב
33
כדי לפשט את התוכנית במקום
את הקובץ לשנותנדפיס את הכתוביות
המתוקנות למסך)ונעתיק אותן אחר כך
לקובץ חדש(
צורת העבודה
( צעדי תינוקbaby steps)פשטותמהירות)לימוד תוך כדי ריצה )אד-הוק
איך לקרוא קובץ שורה אחרי שורהבעיה : כנראה יש כבר ספריות \ מחלקות שעושות את זה, אבל
אנחנו אפילו לא יודעים איך הן נקראות
אם משהו כבר עשה את זה – גוגל בטח יודע מזהפתרון :Java בשפת 1תוכנה
אוניברסיטת תל אביב
34
Java בשפת 1תוכנה אוניברסיטת תל אביב
35
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
לזהות את הפסקת הפרסומות
איך משווים בין מחרוזות בJava? אוליGoogle יודע? אולי יש שרות כזה למחלקה
String? מכיוון שיש סבירות גבוהה שיש שרות כזה למחלקה
Stringנחפש בתיעוד המחלקה ישירות
37
Java בשפת 1תוכנה אוניברסיטת תל אביב
38
לזהות את הפסקת הפרסומות
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
עידון התנאי
גם אחרי הפסקת הפרסומות לא כל השורות דורשותשינוי
רק השורות שבהן מופיעים זמנים?איך נזהה אותן באילו מילות חיפוש נשתמש כדי למצוא את השרות
?Stringהמתאים של contain, substring
if (passedCommescialBreak && strLine.contains("-->")){System.out.println("*** TO CHANGE *** " + strLine);
}Java בשפת 1תוכנה
אוניברסיטת תל אביב
40
מה עכשיו?
חלקים:3נחלק את השורה ל-1.זמן התחלה--<זמן סיום
עבור הזמנים נחשב את הזמנים המתוקנים2.
נרכיב חזרה3.
?איך שוברים שורה מהן מילות החיפוש שיניבו את השרות המתאים במחלקהString?
?איך בודקים שהשרות עובדכותבים תוכנית בדיקה
Java בשפת 1תוכנה אוניברסיטת תל אביב
41
תוכנית בדיקה
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
הורדת תווים לבנים
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);
{
{
חישוב הזמנים החדשים
חישוב ידני של הזמן החדשהרבה מקרי קצה
מציאת מחלקות \ שרותי עזר שעושים זאת
Java בשפת 1תוכנה אוניברסיטת תל אביב
44
מחרוזות וזמנים
הפעולה מורכבת
יש בJavaמחלקות אשר יודעות לייצג זמנים ולבצע עליהם פעולות java.util.Datejava.util.GregorianCalendar
נתרגם את המחרוזת שלנו לאחד מהאובייקטים האלהכעת, נוכל לבצע בקלות את הוספת הזמןלאחר הוספה נייצג את הזמן החדש בחזרה כמחרוזת
את התרגום ניתן לבצע ידנית: ע"יsplit',' -של המחרוזת לפי התווים ':' ו אוטומטית: ע"י מחלקת עזרjava.text.SimpleDateFormat –נתמקד בזה
Java בשפת 1תוכנה אוניברסיטת תל אביב
45
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תוכנית בדיקה
Q.A.
נבדוק שהתוכנית עובדתנוודא שלא הרסנו כלוםנעדן את הדיוק של הזזת הזמנים
גיבוי
Java בשפת 1תוכנה אוניברסיטת תל אביב
49
(reuseשימוש חוזר )
?עד כמה התוכנית שלנו ניתנת לשימוש חוזרשימוש חוזר על ידי מי? משתמשים, מתכנתים
האם ניתן לבצע בה שינויים שיגדילו את אפשרות השימושהחוזר בה?
?אילו שינויים רלוונטיים למשתמשים?אילו שינויים רלוונטיים למתכנתים
כך שתהיה מראשהאם היה עדיף לכתוב את התוכנית ,כללית?
הדבר תלוי בשאלה האם אנחנו כותבים אפליקציה או ספריה
Java בשפת 1תוכנה אוניברסיטת תל אביב
50
ספריות ויישומים(Libraries and Applications)
Java בשפת 1תוכנה אוניברסיטת תל אביב
52
ספריות
ספרייה היא מודול תוכנה המכיל אוסף של טיפוסים ושרותים שימושיים
כותב המחלקה )הספק( אמור לענות על צרכי לקוחותיו, כאשר הואהקשרי השימוש אינו יודע ורצוי שלא יניח הנחות מרומזות על
במחלקה שלו
לדוגמא: מחלקות הספרייהString, Date, LinkedList מספקות לוגיקה שימושית בהקשרים רבים
לספרייה איןmain?אז איך מריצים אותה ,לא מריצים. משתמשים. לקוחות של הספרייה, אולי ספריות בעצמן
ייצרו ממנה מופעים או ישתמשו בשרותיה
Java בשפת 1תוכנה אוניברסיטת תל אביב
53
ספריות
ספרייה אינה מדפיסה למסך כדי לתקשר עם לקוחותיה ספרייה יכולה להחזיר ערכים או
לשנות ערכי שדות לקוחות של הספרייה, אולי ספריות בעצמן, יקבלו ממנה
את הערך המוחזר ויחליטו מה לעשות איתו, לפי המידע שברשותן
אלא מקבלת ספרייה אינה קולטת קלט מהמשתמש ,אותו כארגומנטים )או כשדות של העצם שעליו היא פועלת(
אם נדרש קלט מהמשתמש, לקוחות הספרייה יקלטו אותוויעבירו לה אותו כארגומנט
Java בשפת 1תוכנה אוניברסיטת תל אביב
54
יישומים
הוא בעצם שימוש באוסף של ספריות \ יישום בעיה ידועהמחלקות קיימות וקוד חדש לצורך פתרון
,כגון: תוכנית לסנכרון כתוביות, מערכת לניהול ספרייהמעבד תמלילים, תוכנת דואר
כותב היישום, בשונה מכותב המחלקה, יודע מההבעיה שברצונו לפתור ולכן יכול לממש את היישום
בהקשר זה בלבד למשל: הוא יכול להדפיס למסך )כי הוא יודע שיש
מסך(, הוא יכול לקרוא קלט מהמשתמש או מהרשת, הוא יכול להחליט על טיפול במקרי קצה
Java בשפת 1תוכנה אוניברסיטת תל אביב
55
יישומים
כאשר היישום הוא גדול ומורכב )למשל מעבדתמלילים( קיים קושי להחליט עד כמה כללי יהיה
הקוד שכן מחלקה אשר נכתבה כחלק ממימוש של מודול
מסוים עשויה להתגלות כשימושית גם עבור מודול אחר
שימוש חוזר בתוך היישום
שימוש חוזר בתוך היישום מצריך ראייה כוללת שלכל חלקי המערכת ותכנון החלקים המשותפים
תיכון או עיצובמראש. שלב זה נקרא גם
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
עיצוב יישומים
פירוק פונקציונלי ספר"להשאיללדוגמא: "המערכת תאפשר דוא"ל"לשלוחלדוגמא: "התוכנה תאפשר
פירוק מונחה עצמים :שואל, השאלה, ספרלדוגמא :איש-קשר, כתובת, תיבת דואר, הודעהלדוגמא
שמות בעיצוב תוכנה מודרני מקובל לתכנן מערכות תוכנה על פי, מתוך ההנחה כי המעבר בין העיצוב ובין הישויות מעולם הבעיה
מימושו כמחלקות טבעי ויעודד שימוש חוזר
העיצוב מתבצע בדרך כלל במספר רמות הפשטה כדי לאפשר הבנהשל הקוד על ידי מספר גורמים. למשל: מתכנתים, מנהלים ואנשי שיווק
Java בשפת 1תוכנה אוניברסיטת תל אביב
57
תרגיל בית )לא להגשה(
,שכתבו את מסנכרן הכתוביות שכתבנו זה עתהבצורה שתגדיל את פוטנציאל השימוש החוזר בו
)כיישום למשתמש קצה )אפליקציה )כספרייה )כלומר: מחלקת עזר למתכנת
כתיבת מחלקות תילמד בשבוע הבא
?עם איזו מהם כדאי להתחיל
Java בשפת 1תוכנה אוניברסיטת תל אביב
58