55
ההההה1 ההההJava ההההה הההה ססס ססססס ססס סססס ססססס ססססס סססססססססס סס סססס

תוכנה 1 בשפת Java שיעור חזרה

  • Upload
    aradia

  • View
    67

  • Download
    10

Embed Size (px)

DESCRIPTION

תוכנה 1 בשפת Java שיעור חזרה. ניר אטיאס. בית הספר למדעי המחשב אוניברסיטת תל אביב. היום בשיעור. jPaint היררכיית I/O עוד תבניות עיצוב Decorator, Visitor, Composite. jPaint. תרגיל בית. jPaint. בתרגיל הבית נפתח את הבסיס לתוכנת ציור כיצד ניגשים לבניית תוכנה מורכבת? מתכננים - PowerPoint PPT Presentation

Citation preview

Page 1: תוכנה 1 בשפת  Java שיעור חזרה

Java בשפת 1תוכנה שיעור חזרה

ניר אטיאס

בית הספר למדעי המחשב

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

Page 2: תוכנה 1 בשפת  Java שיעור חזרה

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

2

היום בשיעור

jPaint היררכייתI/Oעוד תבניות עיצוב

Decorator, Visitor, Composite

Page 3: תוכנה 1 בשפת  Java שיעור חזרה

jPaint

תרגיל בית

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

Page 4: תוכנה 1 בשפת  Java שיעור חזרה

jPaint

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

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

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

4

Page 5: תוכנה 1 בשפת  Java שיעור חזרה

הפרדת רשויות

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

ממשק משתמש)לוגיקת הפעולה )לדוגמא מבני נתונים

ממשק המשתמש תלוי בשכבת הלוגיקה דרךמנשקים מוגדרים

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

5

Page 6: תוכנה 1 בשפת  Java שיעור חזרה

לוגיקה

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

ציור העצמים הכללים ביותר איתם אנו עובדים הן

צורות.?במה מאופיינת צורה

צבעמסגרתמיקום בציור

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

6

Page 7: תוכנה 1 בשפת  Java שיעור חזרה

המנשק הראשון שלי

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

7

Page 8: תוכנה 1 בשפת  Java שיעור חזרה

המנשק הראשון שלי

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

8

Data

Page 9: תוכנה 1 בשפת  Java שיעור חזרה

המנשק הראשון שלי

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

9

Function

Page 10: תוכנה 1 בשפת  Java שיעור חזרה

ריבוי צורות

כעת, ניתן להוסיף את הצורות הקונקרטיות איתןנעבוד. לדוגמא:

-ההחלטה שDrawing הוא Shape מאפשרת קינון של ציורים

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

10

Page 11: תוכנה 1 בשפת  Java שיעור חזרה

ריבוי צורות

"ניתן גם להוסיף צורות "מיוחדות לדוגמא פעולותgroup-ו ungroup בתוכנות גרפיות

תמומש ע"י צורה שהיא אוסף של צורות, בדומה Drawingל-

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

11

Page 12: תוכנה 1 בשפת  Java שיעור חזרה

צייר לי כבשה

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

?כיצד מצייריםעל גבי חלון

תלות במערכת הפעלה + מערכת גרפית)?לתוך קובץ תמונה )באיזה פורמט

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

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

12

Page 13: תוכנה 1 בשפת  Java שיעור חזרה

כיצד מציירים?

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

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

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

13

Page 14: תוכנה 1 בשפת  Java שיעור חזרה

כיצד שומרים?

?כיצד ניתן להוסיף פורמט שמירה בקלות

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

14

Page 15: תוכנה 1 בשפת  Java שיעור חזרה

כיצד שומרים?

?כיצד ניתן להוסיף פורמט שמירה בקלות!דרושה מזכירות

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

15

Page 16: תוכנה 1 בשפת  Java שיעור חזרה

כיצד שומרים?

?כיצד ניתן להוסיף פורמט שמירה בקלות!דרושה מזכירותמי שיודע לשמור ציורים ירשם במזכירות

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

16

רישום במזכירות

Page 17: תוכנה 1 בשפת  Java שיעור חזרה

כיצד שומרים?

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

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

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

17

בירור

Page 18: תוכנה 1 בשפת  Java שיעור חזרה

כיצד שומרים?

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

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

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

18

שמירה/טעינה

Page 19: תוכנה 1 בשפת  Java שיעור חזרה

?2כיצד שומרים

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

עבור חלק מהמימושים ניתן לייצרDevice ששומר לקובץ

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

ייתכן שיש צורות שאינן מצוירות, כמו קבוצות

בתרגיל – נשמור ע"יSerliaization?יתרונות?חסרונות

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

19

Page 20: תוכנה 1 בשפת  Java שיעור חזרה

I/O

קלט פלט

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

Page 21: תוכנה 1 בשפת  Java שיעור חזרה

רגע לפני...

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

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

21

/** * @inv getEmployees().size() >= 0 */public class Department { private List<Employee> employees;

public List<Employee> getEmployees() {…

}}

Page 22: תוכנה 1 בשפת  Java שיעור חזרה

מחלקות אחרות

-הבעיה: לקוח שקורא לgetEmployees יכול )(.employeesלשנות את המשתנה

:'פתרון א של האוסף )לא יעיל(עותק ניתן להחזיר לפעמים ניתן לרשום חוזה מתאים )בלתי ניתן

לאכיפה(

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

22

/** * @inv getEmployees().size() >= 0 */public class Department { private List<Employee> employees;

public List<Employee> getEmployees() {…

}}

Page 23: תוכנה 1 בשפת  Java שיעור חזרה

העלילה מסתבכת

-האם לכולם מותר לקרוא לgetEmployees?)(לא בהכרחמידע בנוגע לעובדים עלול להיות רגישייתכן שישנם חוקים בארגון באשר לגישה למידע זה

הרשאותתיעוד הגישות בקובץ...

?כיצד נממשם

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

23

Page 24: תוכנה 1 בשפת  Java שיעור חזרה

תבניות

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

יתנהג בצורה שונה ממופעים "רגילים" במחלקהListשלא ניתן לשנותו Department שלא מאפשרת קריאה

)(getEmployeesל-?כיצד נממש זאת

תבנית העצובDecorator

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

24

Page 25: תוכנה 1 בשפת  Java שיעור חזרה

Decorator

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

25

Page 26: תוכנה 1 בשפת  Java שיעור חזרה

ListDecorator

עמ"נ לממש אתgetEmployees נפעל עפ"י תבנית העיצוב:

)נגדיר מחלקה )אבסטרקטיתListDecorator

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

26

public abstract class ListDecorator<E> implements List<E> {

List<E> component;

public ListDecorator(List<E> component) { this.component = component; }

@Override public boolean add(E e) { return component.add(e); }

. . .}

Page 27: תוכנה 1 בשפת  Java שיעור חזרה

ReadonlyList

כעת נוכל לממשReadonlyList

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

27

public class ReadonlyList<T> extends ListDecorator<T> {

public ReadonlyList(List<T> component) { super(component); }

@Override public void clear() { throw new RuntimeException("Read only list"); }

. . .}

Page 28: תוכנה 1 בשפת  Java שיעור חזרה

דון קישוט

לבסוף נוכל לממש אתgetEmployees

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

28

/** * @inv getEmployees().size() >= 0 */public class Department { private List<Employee> employees;

public List<Employee> getEmployees() {return new ReadonlyList<Employee>(employees);

}}

Page 29: תוכנה 1 בשפת  Java שיעור חזרה

ועדת קישוט

בדומה נוכל להגדירDecorator למחלקה Department:ולממש

AccessControlDecoratorLogQueriesDecorator...

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

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

29

Page 30: תוכנה 1 בשפת  Java שיעור חזרה

חזרה לקלט/פלט

כבר ראינו את החבילהjava.io:נזכר

Streamsמטפלים בסדרות של נתונים Readers/Writersמטפלים בקבצי טקסט

שימוש בזרמים פתיחת הזרם )בד"כ ע"י יצירת עצם מטיפוס

מתאים(קריאת הנתוניםסגירת הזרם

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

30

Page 31: תוכנה 1 בשפת  Java שיעור חזרה

זרמי קלט - היררכיה

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

31

abstractsuper-class

InputStream

ByteArrayInputStream

FileInputStream

FilterInputStream

ObjectInputStream

PipedInputStream

SequenceInputStream

DataInputStream

BufferedInputStream

PushbackInputStream

-read from data sinks

-perform some processing

Page 32: תוכנה 1 בשפת  Java שיעור חזרה

זרמי קלט - היררכיה

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

32

abstractsuper-class

InputStream

ByteArrayInputStream

FileInputStream

FilterInputStream

ObjectInputStream

PipedInputStream

SequenceInputStream

DataInputStream

BufferedInputStream

PushbackInputStream

-read from data sinks

-perform some processing

Decorators!

Page 33: תוכנה 1 בשפת  Java שיעור חזרה

היררכיית זרמי הפלט

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

33

abstractsuper-class

OutputStream

ByteArrayOutputStream

FileOutputStream

FilterOutputStream

ObjectOutputStream

PipedOutputStream

BufferedOutputStream

DataOutputStream

PrintStream

-write to data sinks

-perform some processing

Page 34: תוכנה 1 בשפת  Java שיעור חזרה

Readers

abstractsuper-class

Reader

LineNumberReader

FileReader

PushbackReader

BufferedReader

CharArrayReader

FilterReader

InputStreamReader

PipedReader

StringReader

-read from data sinks

-perform some processingJava בשפת 1תוכנה

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

34

Page 35: תוכנה 1 בשפת  Java שיעור חזרה

Writers

abstractsuper-class

Writer FileWriter

BufferedWriter

CharArrayWriter

FilterWriter

OutputStreamWriter

PipedWriter

PrintWriter

StringWriter -write to data sinks

-perform some processing

Page 36: תוכנה 1 בשפת  Java שיעור חזרה

תבניות עיצוב נוספות

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

Page 37: תוכנה 1 בשפת  Java שיעור חזרה

חלק מהשלם

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

יותר:ביטויים מתמטיים

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

37

(1+ 2) × (3+ 4) − 5 1 2 3 4 5

+ +

*

-

Page 38: תוכנה 1 בשפת  Java שיעור חזרה

חלק מהשלם

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

-ציור הUIמציאת קבציםקביעת העלות של מוצרשערוך הביטוי המתמטי

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

38

Page 39: תוכנה 1 בשפת  Java שיעור חזרה

דוגמא: שערוך

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

39

public static double evaluate(Expression e) { if(e instanceof BinaryOperator) { if(e instanceof Plus) { Plus p = (Plus)e; return evaluate(p.getLhs()) + evaluate(p.getRhs()); } else if (e instanceof Minus) { Minus p = (Minus)e; return evaluate(p.getLhs()) - evaluate(p.getRhs()); } else if (e instanceof Multiply) { Multiply p = (Multiply)e; return evaluate(p.getLhs()) * evaluate(p.getRhs()); } } else if (e instanceof ConstantExpression) { return ((ConstantExpression)e).getValue(); }

throw new RuntimeException("Unknown operation");}

Page 40: תוכנה 1 בשפת  Java שיעור חזרה

שערוך

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

הפונקציהתמיכה באופרטורים נוספים

העלאה בחזקהשורשלוגריתם...

קל לשכוח להוסיף מימוש לאופרטורים חדשים

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

40

Page 41: תוכנה 1 בשפת  Java שיעור חזרה

Compositeתבנית העיצוב

תבנית העיצובComposite.נותנת מענה לבעיה

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

41

Page 42: תוכנה 1 בשפת  Java שיעור חזרה

Compositeמימוש השערוך לפי

נגדיר מנשק עם הפעולה הרצויה

:)קל לשערך ביטויים קבועים )עלים

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

42

public interface Expression { public double evaluate();}

public class ConstantExpression implements Expression { double value; public ConstantExpression(double value) { this.value = value; } @Override public double evaluate() { return value; }}

Page 43: תוכנה 1 בשפת  Java שיעור חזרה

Compositeמימוש השערוך לפי

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

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

43

public abstract class BinaryOperator implements Expression {

private Expression lhs; private Expression rhs;

public BinaryOperator(Expression lhs, Expression rhs) { this.lhs = lhs; this.rhs = rhs; } @Override public double evaluate() { return op(lhs.evaluate(), rhs.evaluate()); } . . . protected abstract double op(double lhs, double rhs);}

Page 44: תוכנה 1 בשפת  Java שיעור חזרה

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

44

public class Plus extends BinaryOperator {

public Plus(Expression lhs, Expression rhs) { super(lhs, rhs); } @Override protected double op(double lhs, double rhs) { return lhs + rhs; }}

public class Minus extends BinaryOperator {

public Minus(Expression lhs, Expression rhs) { super(lhs, rhs); } @Override protected double op(double lhs, double rhs) { return lhs - rhs; }}

Page 45: תוכנה 1 בשפת  Java שיעור חזרה

:והשימוש, פשוט

בתרגיל הבית המתודהDraw פועלת בדיוק לי Compositeתבנית העיצוב

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

45

public static void main(String[] args) { Expression e = new Minus( new Multiply( new Plus(new ConstantExpression(1), new ConstantExpression(2)), new Plus(new ConstantExpression(3), new ConstantExpression(4))), new ConstantExpression(5));

System.out.println(e.evaluate());}

Page 46: תוכנה 1 בשפת  Java שיעור חזרה

Here to stay

פעולה שכיחה על מבנה הנתונים היא שמירהלקובץ.

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

ניתן להשתמש בתבנית בעיצובComposite גם כאן:

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

46

public interface Expression { public double evaluate(); public void save(Writer stm);}

Page 47: תוכנה 1 בשפת  Java שיעור חזרה

שאלות

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

תחזוקתההמתודות נקבעות בצורה סטטית בזמן הקומפילציה

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

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

47

Page 48: תוכנה 1 בשפת  Java שיעור חזרה

Visitorתבנית העיצוב

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

48

Page 49: תוכנה 1 בשפת  Java שיעור חזרה

מימוש בביטויים מתמטיים

נרחיב את המנשקExpression:

נגדיר אתExpressionVisitor:

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

49

public interface Expression { public double evaluate(); public void postorder(ExpressionVisitor v);}

public interface ExpressionVisitor { public void visitConstant(ConstantExpression e); public void visitPlus(Plus p); public void visitMinus(Minus m); public void visitMultiply(Multiply m); public void visitPower(Power p);}

Page 50: תוכנה 1 בשפת  Java שיעור חזרה

Javaהמרה לקוד

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

50

public class JavaCodeVisitor implements ExpressionVisitor { Stack<String> stack = new Stack<String>(); protected void pushOperator(String op) { String last = stack.pop(); String first = stack.pop(); stack.push("(" + first + op + last + ")"); }

public void visitConstant(ConstantExpression e) { stack.push(String.valueOf(e.getValue())); }

public void visitPlus(Plus p) { pushOperator("+"); } ... public String getExpression(String name) { return "double " + name + " = " + stack.peek(); }}

Page 51: תוכנה 1 בשפת  Java שיעור חזרה

:והשימוש

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

51

public static void main(String[] args) { Expression e = new Minus( new Multiply( new Plus(new ConstantExpression(1), new ConstantExpression(2)), new Plus(new ConstantExpression(3), new ConstantExpression(4))), new ConstantExpression(5));

JavaCodeVisitor vis = new JavaCodeVisitor(); e.postorder(vis);

System.out.println(vis.getExpression("e"));}

double e = (((1.0+2.0)*(3.0+4.0))-5.0)

Page 52: תוכנה 1 בשפת  Java שיעור חזרה

jPaintדוגמא נוספת:

:בתרגיל הבית, ניתן היה לממש שמירה גם כך

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

52

Page 53: תוכנה 1 בשפת  Java שיעור חזרה

שמירה

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

53

מעבר כללי על המודל

Page 54: תוכנה 1 בשפת  Java שיעור חזרה

שמירה

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

54

אובייקטים מפעילים פונקציות יעודיות

Page 55: תוכנה 1 בשפת  Java שיעור חזרה

שמירה

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

55

מנשק ייעודילמעבר על המודל