Presentation is loading. Please wait.

Presentation is loading. Please wait.

 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.

Similar presentations


Presentation on theme: " Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח."— Presentation transcript:

1  Client, Supplier ומה שביניהם ( ADT!)

2  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח את ה -ADT הבא עבור מעגל במישור ( ממשק ואינווריאנטות ). הממשק : Signature: make-circle(x-center, y-center, radius) Purpose: constructs a circle. Type: [Number * Number * Number -> Circle] Pre-conditions: radius >= 0 Signature: get-x-center(circle) Purpose: returns the x coordinate of the circle's center. Type: [Circle -> Number] Signature: get-y-center(circle) Purpose: returns the y coordinate of the circle's center. Type: [Circle -> Number] Signature: circle? (x) Purpose: returns true iff x is a circle. Type: [T -> Boolean] Signature: circle-equal?(circle1, circle2) Purpose: Compares two circles. Type: [Circle * Circle -> Boolean] *Signature: small-enough?(circle, edge) Purpose: Check whether the circle can fit into a square of a given edge length. Type: [Circle * Number -> Boolean]

3 1. לכל x,y,r : get-x-center (make-circle (x, y, r)) = x get-y-center (make-circle (x, y, r)) = y get-radius (make-circle (x, y, r)) = r 2. לכל e : circle?(e) ≡ ∃x, y, r: make-circle (x, y, r) = e 3. לכל e1, e2 : circle-equal(e1, e2) ≡ get-x-center(e1) = get-x-center(e2) & get-y-center(e1) = get-y-center(e2) & get- radius(e1) = get- radius(e2) 4. לכל x,y,r,a : small-enough(make-circle(x, y, r), a) ≡ 2r≤a  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל, חישוב שטח מעגל. הספק יספק ללקוח את ה -ADT הבא עבור מעגל במישור ( ממשק ואינווריאנטות ). האינווריאנטות :

4  שאלה 1: יצירת ADT עבור מעגל במישור – צד הלקוח Signature: move-circle(circle, x, y) Purpose: return a circle, with a center point that is transposed by (x, y) (we get a new circle, in Scheme we can't change the existing one) Type: [Circle * Number * Number -> Circle] (define move-circle (lambda (circle x y) (make-circle (+ (get-x-center circle) x) (+ (get-y-center circle) y) (get-radius circle)))) Signature: area-circle(circle) Purpose: Calculate the area of circle Type: [Circle -> Number] (define area-circle (lambda (circle) (* pi (sqr (get-radius circle)))))

5  שאלה 1: יצירת ADT עבור מעגל במישור – צד הספק נייצג את המעגל באמצעות זוגות, בצורה הבאה : התווית circle מאפשרת לנו להבדיל מעגלים מ " סתם " זוגות אחרים. השימוש בתוויות מקובל במיוחד בשפות עם בדיקת טיפוסים דינאמית : לכל ערך מצמידים תווית טיפוס, ואז בודקים התאמה בזמן ריצה. לכן נוסיף ADT עבור tagging...

6  ADT עבור tagging: ממשק : Signature: attach-tag(x, tag) Purpose: Construct a tagged-data value Type: [T * Symbol -> Tagged-data(T)] Signature: get-tag(tagged) Purpose: Select the tag from a tagged-data value Type: [Tagged-data(T) -> Symbol] Signature: get-content(tagged) Purpose: Select the data from a tagged-data value Type: [Tagged-data(T) -> T] Signature: tagged-data?(datum) Purpose: Identify tagged-data values Type: [T -> Boolean] Signature: tagged-by?(tagged, tag) Purpose: Identify tagged-data values Type: [T * Symbol -> Boolean]

7  ADT עבור tagging: מימוש : (define attach-tag (lambda (x tag) (cons tag x))) (define get-tag (lambda (tagged) (car tagged))) (define get-content (lambda (tagged) (cdr tagged))) (define tagged-data? (lambda (datum) (and (pair? datum) (symbol? (car datum))))) (define tagged-by? (lambda (x tag) (and (tagged-data? x) (eq? (get-tag x) tag))))

8  שאלה 1: יצירת ADT עבור מעגל במישור – צד הספק - מימוש Signature: make-circle(x-center, y-center, radius) Type: [Number * Number * Number -> Tagged-data(Pair(Number, Pair(Number, Number)))] (define make-circle (lambda (x-center y-center radius) (attach-tag (cons radius (cons x-center y-center)) 'circle))) בתוכניות הלקוח הטיפוס מוצהר באמצעות ADT מעגל, אבל המימוש של המעגל מוצהר רק באמצעות טיפוסים שמוגדרים ב -Scheme, או ב -ADT אחרים.

9  שאלה 1: יצירת ADT עבור מעגל במישור – צד הספק - מימוש Signature: get-x-center(circle), get-y-center(circle), get-radius(circle) Type: [Tagged-data(Pair(Number, Pair(Number, Number))) -> Number] Pre-condition: (circle? circle) = #t (define get-x-center (lambda (circle) (cadr (get-content circle)))) (define get-y-center (lambda (circle) (cddr (get-content circle)))) (define get-radius (lambda (circle) (car (get-content circle))))

10  שאלה 1: יצירת ADT עבור מעגל במישור – צד הספק - מימוש Signature: circle?(object) Type: [T -> Boolean] (define circle? (lambda (obj) (tagged-by? obj 'circle))) Signature: small-enough?(circle, edge) Type: [Tagged-data(Pair(Number, Pair(Number, Number))) * Number -> Boolean] Pre-condition: (circle? circle) = #t (define small-enough? (lambda (circle edge) (<= ((* 2 (get-radius circle)) edge)))) שימו לב כי במסגרת מימוש הפרדיקטים לא השתמשנו בפרטי המימוש של המעגל ( הזוגות ), אלא רק בסלקטורים. זה נותן לנו אפשרות לשנות את המימוש של המעגל מבלי לשכתב את הפרדיקטים.

11  שאלה 1: יצירת ADT עבור מעגל במישור – צד הספק - מימוש Signature: circle-equal?(circle1, circle2) Type: [Tagged-data(Pair(Number, Pair(Number, Number)) * Tagged-data(Pair(Number, Pair(Number, Number))) -> Boolean] Pre-condition: (and (circle? circle1) (circle? circle2)) = #t (define circle-equal? (lambda (circle1 circle2) (and (= (get-x-center circle1) (get-x-center circle2)) (= (get-y-center circle1) (get-y-center circle2)) (= (get-radius circle1) (get-radius circle2))))) שימו לב כי במסגרת מימוש הפרדיקטים לא השתמשנו בפרטי המימוש של המעגל ( הזוגות ), אלא רק בסלקטורים. זה נותן לנו אפשרות לשנות את המימוש של המעגל מבלי לשכתב את הפרדיקטים.

12  שאלה 1: יצירת ADT עבור מעגל במישור – צד הספק - הוכחות הוכחת האינווריאנטות של ה -ADT: הפרוצדורות שכתבנו חייבות למלא את הממשק ולכבד את האינווריאנטות של ה -ADT כדי שנאשר את השימוש בו. נוכיח, לדוגמה, את האינווריאנטה השלישית : get-radius(make-circle(x, y, r)) = r צריך להוכיח כי : For all x, y, r: applicative-eval[ (get-radius (make-circle x y r)) ] ==>* r

13 (define make-circle (lambda (x-center y-center radius) (attach-tag (cons radius (cons x-center y-center)) 'circle))) (define get-x-center (lambda (circle) (cadr (get-content circle)))) (define get-y-center (lambda (circle) (cddr (get-content circle)))) (define get-radius (lambda (circle) (car (get-content circle)))) (define circle? (lambda (circle) (tagged-by? circle 'circle)))

14  שאלה 2: יצירת ADT עבור מעגל במישור – צד הספק – מימוש נוסף  ניתן לממש ערך באמצעות פרוצדורה המאחסנת את המידע של הערך.  פעולות שליפה יעשו ע " י הפניית בקשות messages לפרוצדורה.

15  שאלה 2: יצירת ADT עבור מעגל במישור – צד הספק – מימוש חרוץ Signature: make-circle(x-center, y-center, radius) Type: [Number * Number * Number -> Tagged-data([Symbol -> Number])] (define make-circle (lambda (x-center y-center radius) (attach-tag (lambda (m) (cond ((eq? m 'x) x-center) ((eq? m 'y) y-center) (else radius))) 'circle))) Signature: get-x-center(circle), get-y-center(circle), get-radius(circle) Type: [Tagged-data([Symbol -> Number] ) -> Number] (define get-x-center (lambda (circle) ((get-content circle) 'x))) (define get-y-center (lambda (circle) ((get-content circle) 'y))) (define get-radius (lambda (circle) ((get-content circle) 'r))) השאר ללא שינוי – למה ?

16  שאלה 2: יצירת ADT עבור מעגל במישור – צד הספק – הוכחות גם עבור המימוש החדש צריך להוכיח שמתקיימות האינווריאנטות ( ראו תרגול באתר הקורס )

17  שאלה 3: יצירת ADT עבור מעגל במישור – צד הספק – מימוש עצל במימוש הזה הבנאי עוטף את המידע עם פרוצדורה אשר מצפה כפרמטר לפרוצדורה אחרת, שתופעל על המידע. Signature: make-circle(x-center, y-center, radius) Type: [Number * Number * Number -> Tagged-data([[Number * Number * Number -> T] -> T])] (define make-circle (lambda (x-center y-center radius) (attach-tag (lambda(sel) (sel x-center y-center radius)) 'circle))) Signature: get-x-center(circle), get-y-center(circle), get-radius(circle) Type: [Tagged-data([[Number * Number * Number->T] ->T]) -> Number] (define get-x-center (lambda (circle) ((get-content circle) (lambda (x y r) x)))) (define get-y-center (lambda (circle) ((get-content circle) (lambda (x y r) y))))

18  שאלה 3: יצירת ADT עבור מעגל במישור – צד הספק – הוכחות גם עבור המימוש החדש צריך להוכיח שמתקיימות האינווריאנטות ( ראו תרגול באתר הקורס )

19  שאלה 3: יצירת ADT עבור מעגל במישור – צד הספק – מימוש  הבדלים בין מימוש חרוץ למימוש עצל : ◦ במימוש העצל כל הלוגיקה נמצאת בסלקטורים, במימוש החרוץ כל הלוגיקה נמצאת בבנאי. ◦ אפשרות להרחיב את המימוש ע " י פרוצדורות נוספות בממשק : במימוש עצל צריך להוסיף פרוצדורה, במימוש חרוץ גם להוסיף פרוצדורה וגם לשכתב את הבנאי. ◦ המימוש החרוץ יקשה עלינו במקרה של יצירת מופעי מעגל רבים : אם למשל נוצרו אלפי מעגלים, שינוי כלשהו בלוגיקה ידרוש ליצור את כל המופעים שוב. לעומת זאת, המימוש העצל יאפשר להמשיך לעבוד עם אותם מופעים.


Download ppt " Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח."

Similar presentations


Ads by Google