המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

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

מצגות קשורות


מצגת בנושא: "תוכנה 1 בשפת Java שיעור חזרה"— תמליל מצגת:

1 תוכנה 1 בשפת Java שיעור חזרה
ניר אטיאס בית הספר למדעי המחשב אוניברסיטת תל אביב

2 היום בשיעור jPaint היררכיית I/O עוד תבניות עיצוב
Decorator, Visitor, Composite תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

4 jPaint בתרגיל הבית נפתח את הבסיס לתוכנת ציור
כיצד ניגשים לבניית תוכנה מורכבת? מתכננים נעזרים בידע קיים גישת הפרד ומשול בודקים תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

6 לוגיקה נתחיל בהגדרת מודל, כלומר בבניית מנשק למבנה נתונים (ופעולות רלוונטיות) אשר מאפשר ייצוג של ציור העצמים הכללים ביותר איתם אנו עובדים הן צורות. במה מאופיינת צורה? צבע מסגרת מיקום בציור תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

8 המנשק הראשון שלי Data תוכנה 1 בשפת Java אוניברסיטת תל אביב

9 המנשק הראשון שלי Function תוכנה 1 בשפת Java אוניברסיטת תל אביב

10 ריבוי צורות כעת, ניתן להוסיף את הצורות הקונקרטיות איתן נעבוד. לדוגמא:
ההחלטה ש-Drawing הוא Shape מאפשרת קינון של ציורים תוכנה 1 בשפת Java אוניברסיטת תל אביב

11 ריבוי צורות ניתן גם להוסיף צורות "מיוחדות"
לדוגמא פעולות group ו-ungroup בתוכנות גרפיות תמומש ע"י צורה שהיא אוסף של צורות, בדומה ל-Drawing תוכנה 1 בשפת Java אוניברסיטת תל אביב

12 צייר לי כבשה נרצה ליצור תמונה ממבנה נתון של אובייקטים ישנן שתי בעיות:
כיצד מציירים? על גבי חלון תלות במערכת הפעלה + מערכת גרפית לתוך קובץ תמונה (באיזה פורמט?) טכניקת המעבר על כל האובייקטים וציורם האם יש חשיבות לסדר? תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

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

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

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

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

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

19 כיצד שומרים 2? כדי לממש שמירה וטעינה יש לעבור על האובייקטים
עבור חלק מהמימושים ניתן לייצר Device ששומר לקובץ טוב עבור שמירת קבצי גרפיקה לא טוב עבור שמירת המודל בכללותו ייתכן שיש צורות שאינן מצוירות, כמו קבוצות בתרגיל – נשמור ע"י Serliaization יתרונות? חסרונות? תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

21 רגע לפני... רוצים לממש תוכנה עבור ניהול כ"א בארגון.
העובדים מחולקים למחלקות. אין מחלקות ריקות /** getEmployees().size() >= 0 */ public class Department { private List<Employee> employees; public List<Employee> getEmployees() { } תוכנה 1 בשפת Java אוניברסיטת תל אביב

22 מחלקות אחרות הבעיה: לקוח שקורא ל-getEmployees() יכול לשנות את המשתנה employees. פתרון א': ניתן להחזיר עותק של האוסף (לא יעיל) לפעמים ניתן לרשום חוזה מתאים (בלתי ניתן לאכיפה) /** getEmployees().size() >= 0 */ public class Department { private List<Employee> employees; public List<Employee> getEmployees() { } תוכנה 1 בשפת Java אוניברסיטת תל אביב

23 העלילה מסתבכת האם לכולם מותר לקרוא ל-getEmployees()? לא בהכרח
מידע בנוגע לעובדים עלול להיות רגיש ייתכן שישנם חוקים בארגון באשר לגישה למידע זה הרשאות תיעוד הגישות בקובץ ... כיצד נממשם? תוכנה 1 בשפת Java אוניברסיטת תל אביב

24 תבניות מהי התבנית החוזרת?
בשני המקרים אנו רוצים שמופע נתון של מחלקה יתנהג בצורה שונה ממופעים "רגילים" במחלקה List שלא ניתן לשנותו Department שלא מאפשרת קריאה ל-getEmployees() כיצד נממש זאת? תבנית העצוב Decorator תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

26 ListDecorator עמ"נ לממש את getEmployees נפעל עפ"י תבנית העיצוב:
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); . . . תוכנה 1 בשפת Java אוניברסיטת תל אביב

27 ReadonlyList כעת נוכל לממש ReadonlyList
public class ReadonlyList<T> extends ListDecorator<T> { public ReadonlyList(List<T> component) { super(component); } @Override public void clear() { throw new RuntimeException("Read only list"); . . . תוכנה 1 בשפת Java אוניברסיטת תל אביב

28 דון קישוט לבסוף נוכל לממש את getEmployees /**
getEmployees().size() >= 0 */ public class Department { private List<Employee> employees; public List<Employee> getEmployees() { return new ReadonlyList<Employee>(employees); } תוכנה 1 בשפת Java אוניברסיטת תל אביב

29 ועדת קישוט בדומה נוכל להגדיר Decorator למחלקה Department ולממש:
AccessControlDecorator LogQueriesDecorator ... בצורה זו צרכי הארגון מופרדים ממימוש נכון של מבנה הנתונים. תוכנה 1 בשפת Java אוניברסיטת תל אביב

30 חזרה לקלט/פלט כבר ראינו את החבילה java.io נזכר: שימוש בזרמים
Streams מטפלים בסדרות של נתונים Readers/Writers מטפלים בקבצי טקסט שימוש בזרמים פתיחת הזרם (בד"כ ע"י יצירת עצם מטיפוס מתאים) קריאת הנתונים סגירת הזרם תוכנה 1 בשפת Java אוניברסיטת תל אביב

31 ByteArrayInputStream
זרמי קלט - היררכיה ByteArrayInputStream FileInputStream DataInputStream FilterInputStream BufferedInputStream InputStream ObjectInputStream PushbackInputStream abstract super-class PipedInputStream SequenceInputStream - read from data sinks - perform some processing תוכנה 1 בשפת Java אוניברסיטת תל אביב

32 ByteArrayInputStream
זרמי קלט - היררכיה ByteArrayInputStream FileInputStream DataInputStream FilterInputStream BufferedInputStream InputStream ObjectInputStream PushbackInputStream abstract super-class PipedInputStream SequenceInputStream Decorators! - read from data sinks - perform some processing תוכנה 1 בשפת Java אוניברסיטת תל אביב

33 היררכיית זרמי הפלט ByteArrayOutputStream FileOutputStream
BufferedOutputStream OutputStream FilterOutputStream DataOutputStream abstract super-class ObjectOutputStream PrintStream PipedOutputStream - write to data sinks - perform some processing תוכנה 1 בשפת Java אוניברסיטת תל אביב

34 - perform some processing
Readers BufferedReader LineNumberReader CharArrayReader FilterReader PushbackReader Reader InputStreamReader FileReader abstract super-class PipedReader StringReader - read from data sinks - perform some processing תוכנה 1 בשפת Java אוניברסיטת תל אביב

35 - perform some processing
Writers BufferedWriter CharArrayWriter FilterWriter Writer OutputStreamWriter FileWriter abstract super-class PipedWriter PrintWriter StringWriter - write to data sinks - perform some processing

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

37 חלק מהשלם פעמים רבות אנו נתקלים במבנים היררכיים: ממשק משתמש (מעטפות)
מערכת הקבצים מחולקת לספריות מוצרים מורכבים ממכלולים והם מחלקים פשוטים יותר ביטויים מתמטיים: - * + + 1 2 3 4 5 תוכנה 1 בשפת Java אוניברסיטת תל אביב

38 חלק מהשלם כחלק מחבילת תוכנה אנו נדרשים לפעול על המבנים בצורה אחידה:
ציור ה-UI מציאת קבצים קביעת העלות של מוצר שערוך הביטוי המתמטי תוכנה 1 בשפת Java אוניברסיטת תל אביב

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"); תוכנה 1 בשפת Java אוניברסיטת תל אביב

40 שערוך המימוש שביר בכל שינוי לביטויים האפשריים יש לשנות את הפונקציה
תמיכה באופרטורים נוספים העלאה בחזקה שורש לוגריתם ... קל לשכוח להוסיף מימוש לאופרטורים חדשים תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

42 מימוש השערוך לפי Composite
נגדיר מנשק עם הפעולה הרצויה קל לשערך ביטויים קבועים (עלים): 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; תוכנה 1 בשפת Java אוניברסיטת תל אביב

43 מימוש השערוך לפי Composite
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); תוכנה 1 בשפת Java אוניברסיטת תל אביב

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) { return lhs - rhs; תוכנה 1 בשפת Java אוניברסיטת תל אביב

45 בתרגיל הבית המתודה Draw פועלת בדיוק לי תבנית העיצוב Composite
והשימוש, פשוט: בתרגיל הבית המתודה Draw פועלת בדיוק לי תבנית העיצוב Composite 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()); } תוכנה 1 בשפת Java אוניברסיטת תל אביב

46 Here to stay פעולה שכיחה על מבנה הנתונים היא שמירה לקובץ.
כיצד נבצע זאת? נעבור על מבנה הנתונים נזהה את סוג העצם ונשמור אותו לזרם ניתן להשתמש בתבנית בעיצוב Composite גם כאן: public interface Expression { public double evaluate(); public void save(Writer stm); } תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

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

49 מימוש בביטויים מתמטיים
נרחיב את המנשק Expression: נגדיר את ExpressionVisitor: 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); } תוכנה 1 בשפת Java אוניברסיטת תל אביב

50 המרה לקוד Java 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(); תוכנה 1 בשפת Java אוניברסיטת תל אביב

51 double e = (((1.0+2.0)*(3.0+4.0))-5.0)
והשימוש: 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 = ((( )*( ))-5.0) תוכנה 1 בשפת Java אוניברסיטת תל אביב

52 דוגמא נוספת: jPaint בתרגיל הבית, ניתן היה לממש שמירה גם כך:
תוכנה 1 בשפת Java אוניברסיטת תל אביב

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

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

55 שמירה מנשק ייעודי למעבר על המודל תוכנה 1 בשפת Java אוניברסיטת תל אביב


הורד את "ppt "תוכנה 1 בשפת Java שיעור חזרה

מצגות קשורות


מודעות Google