Examining Two Pieces of Data

Slides:



Advertisements
Similar presentations
Templates CS 5010 Program Design Paradigms “Bootcamp” Lesson
Advertisements

Working with images and scenes CS 5010 Program Design Paradigms “Bootcamp” Lesson 2.5 TexPoint fonts used in EMF. Read the TexPoint manual before you delete.
Function Composition CS 5010 Program Design Paradigms “Bootcamp” 1 © Mitchell Wand, This work is licensed under a Creative Commons Attribution-NonCommercial.
Midterm Review CS 5010 Program Design Paradigms “Bootcamp” Lesson 9.4 TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.:
Function Composition CS 5010 Program Design Paradigms “Bootcamp” Lesson © Mitchell Wand, This work is licensed under a Creative Commons.
Structural Decomposition CS 5010 Program Design Paradigms “Bootcamp” Lesson 2.1 © Mitchell Wand, This work is licensed under a Creative Commons.
Mutually-Recursive Data Definitions CS 5010 Program Design Paradigms “Bootcamp” Lesson 6.4 © Mitchell Wand, This work is licensed under a Creative.
Foldr CS 5010 Program Design Paradigms “Bootcamp” Lesson 5.4 TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AAA © Mitchell.
Patterns of Communication Between Objects CS 5010 Program Design Paradigms "Bootcamp" Lesson 11.1 © Mitchell Wand, This work is licensed under.
Solving Your Problem by Generalization CS 5010 Program Design Paradigms “Bootcamp” Lesson 7.1 © Mitchell Wand, This work is licensed under a.
The Function Design Recipe CS 5010 Program Design Paradigms “Bootcamp” Lesson 1.1 TexPoint fonts used in EMF. Read the TexPoint manual before you delete.
Examining Two Pieces of Data CS 5010 Program Design Paradigms “Bootcamp” Lesson © Mitchell Wand, This work is licensed under a Creative.
The Design Recipe using Classes CS 5010 Program Design Paradigms "Bootcamp" Lesson 10.5 © Mitchell Wand, This work is licensed under a Creative.
Design Strategies 1: Combine Simpler Functions CS 5010 Program Design Paradigms “Bootcamp” Lesson © Mitchell Wand, This work is licensed.
Design Strategies 3: Divide into cases CS 5010 Program Design Paradigms “Bootcamp” Lesson © Mitchell Wand, This work is licensed under.
Using Inheritance to Share Implementations CS 5010 Program Design Paradigms "Bootcamp" Lesson 12.1 © Mitchell Wand, This work is licensed under.
Introduction to Universe Programs CS 5010 Program Design Paradigms “Bootcamp” Lesson TexPoint fonts used in EMF. Read the TexPoint manual before.
Design Strategies 2: Using a template CS 5010 Program Design Paradigms “Bootcamp” Lesson 2.1 © Mitchell Wand, This work is licensed under a Creative.
A Case Study: Space Invaders CS 5010 Program Design Paradigms "Bootcamp" Lesson © Mitchell Wand, This work is licensed under a Creative.
Solving Your Problem by Generalization CS 5010 Program Design Paradigms “Bootcamp” Lesson 7.1 © Mitchell Wand, This work is licensed under a.
The Design Recipe using Classes CS 5010 Program Design Paradigms "Bootcamp" Lesson © Mitchell Wand, This work is licensed under a Creative.
The Last Lecture CS 5010 Program Design Paradigms "Bootcamp" Lesson © Mitchell Wand, This work is licensed under a Creative Commons Attribution-NonCommercial.
Using Inheritance to Share Implementations CS 5010 Program Design Paradigms "Bootcamp" Lesson © Mitchell Wand, This work is licensed under.
Functions vs. Classes CS 5010 Program Design Paradigms "Bootcamp" Lesson © Mitchell Wand, This work is licensed under a Creative Commons.
Midterm Review CS 5010 Program Design Paradigms “Bootcamp” Lesson TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.:
Solving Your Problem by Generalization CS 5010 Program Design Paradigms “Bootcamp” Lesson © Mitchell Wand, This work is licensed under.
Classes, Objects, and Interfaces CS 5010 Program Design Paradigms "Bootcamp" Lesson © Mitchell Wand, This work is licensed under a Creative.
How to use an Observer Template
CS 5010 Program Design Paradigms “Bootcamp” Lesson 2.4
Contracts, Purpose Statements, Examples and Tests
CS 5010 Program Design Paradigms “Bootcamp” Lesson 2.2
CS 5010 Program Design Paradigms “Bootcamp” Lesson 5.2
Examining Two Pieces of Data
More About Recursive Data Types
CS 5010 Program Design Paradigms “Bootcamp” Lesson 3.1
CS 5010 Program Design Paradigms “Bootcamp” Lesson 4.3
CS 5010 Program Design Paradigms “Bootcamp” Lesson 1.3
Introduction to Invariants
Reviewing your Program
More Recursive Data Types
CS 5010 Program Design Paradigms “Bootcamp” Lesson 8.7
CS 5010 Program Design Paradigms “Bootcamp” Lesson 6.2
Halting Functions for Tree-Like Structures
Generalizing this Design
CS 5010 Program Design Paradigms “Bootcamp” Lesson 5.3
CS 5010 Program Design Paradigms "Bootcamp" Lesson 12.1
CS 5010 Program Design Paradigms “Bootcamp” Lesson 1.3
CS 5010 Program Design Paradigms “Bootcamp” Lesson 5.1
From Templates to Folds
CS 5010 Program Design Paradigms “Bootcamp” Lesson 3.4
CS 5010 Program Design Paradigms “Bootcamp” Lesson 3.2
CS 5010 Program Design Paradigms "Bootcamp" Lesson 9.3
CS 5010 Program Design Paradigms “Bootcamp” Lesson 7.5
Solving Your Problem by Generalization
A Case Study: Space Invaders
Contracts, Purpose Statements, Examples and Tests
CS 5010 Program Design Paradigms “Bootcamp” Lesson 6.5
More examples of invariants
ormap, andmap, and filter
The Iterative Design Recipe
CS 5010 Program Design Paradigms "Bootcamp" Lesson 12.1
Rewriting your function using map and foldr
Working with images and scenes
Introduction to Universe Programs
A Case Study: Space Invaders
CS 5010 Program Design Paradigms “Bootcamp” Lesson 4.1
When do I need an invariant?
CS 5010 Program Design Paradigms “Bootcamp” Lesson 3.4
Design Strategies 3: Divide into cases
Presentation transcript:

Examining Two Pieces of Data CS 5010 Program Design Paradigms “Bootcamp” Lesson 2.3 © Mitchell Wand, 2012-2014 This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.

You can only use one template at a time. If you need to do examine more than one value, examine one argument first, using its template, and pass the results on to a suitable help function or functions. There's one small exception to this; see slides 10-11 below.

Examining multiple values: example #1 Reminder: “structural decomposition” is just a fancier word for what we’re calling “using the template”. YouTube link

Examining more than one value: example #2 Let's consider ball-after-mouse: We are modelling the behavior of a ball in a simulation. The ball responds to mouse events. To model this response, we clearly have to look both at the ball and the mouse event. Let's look at the data definition and the functions.

Structural Decomposition on more than one value: example #2 Contract and Purpose Statement: ;; ball-after-mouse : ;; Ball Integer Integer MouseEvent -> Ball ;; GIVEN: a ball, a location and a mouse event ;; RETURNS: the ball after the given mouse event at ;; the given location. Remember, when we say "a ball", we mean “the state of the ball”: this function takes a ball state and returns another ball state. This is sometimes called “the successor-value pattern.”

Data Definition: Ball (define-struct ball (x y radius selected?)) ;; A Ball is a (make-ball Integer Integer Real Boolean) ;; x and y are the coordinates of the center of the ball, ;; in pixels, relative to the origin of the scene. ;; radius is the radius of the ball, in pixels ;; selected? is true iff the ball has been selected for dragging. ;; TEMPLATE: ;; (define (ball-fn b) ;; (... ;; (ball-x b) (ball-y b) (ball-radius b) (ball-selected? b))) We follow the design recipe: we start with the data definitions.

ball-after-mouse ;; ball-after-mouse : ;; Ball Integer Integer MouseEvent -> Ball ;; GIVEN: a ball, a location and a mouse event ;; RETURNS: the ball after the given mouse event at ;; the given location. ;; STRATEGY: Cases on mev (define (ball-after-mouse b mx my mev) (cond [(mouse=? mev "button-down") (ball-after-button-down b mx my)] [(mouse=? mev "drag") (ball-after-drag b mx my)] [(mouse=? mev "button-up") (ball-after-button-up b mx my)] [else b])) We first do cases on the mouse event. The data is handed off to one of several help functions. Each help function will decompose the compound data. We now have a wishlist of functions to design: ball-after-button-down ball-after-drag ball-after-button-up

Let’s draw a picture ball-after-mouse ball-after-button-down ball-after-button-up ball-after-drag This tree shows the organization of these functions. The arrows go from the called function to the caller. Let’s explore ball-after-drag

ball-after-drag ;; ball-after-drag ;; : Ball Integer Integer -> Ball ;; GIVEN: a ball and a location ;; RETURNS: the ball after a drag event at the ;; given location. ;; STRATEGY: Use template for Ball on b. (define (ball-after-drag b x y) (if (ball-selected? b) (ball-moved-to b x y) b)) This moves the ball so its center is at the mouse point. That’s probably not what you want in a real application. You probably want something that we call “smooth drag”, which we’ll learn about in a problem set coming up soon.

ball-moved-to ;; ball-moved-to : Ball Integer Integer -> Ball ;; GIVEN: a ball and a set of coordinates ;; RETURNS: a ball like the given one, except ;; that it has been moved to the given ;; coordinates. ;; STRATEGY: use template for Ball on b (define (ball-moved-to b x y) (make-ball x y (ball-radius b) (ball-selected? b))) So now we need to write ball-moved-to. It’s also going to look at the data inside the ball, using the Ball template.

A bigger portion of the call tree ball-after-mouse ball-after-button-down ball-after-button-up ball-after-drag ball-moved-to Will need to fill in more functions here

An inferior version of ball-after-drag ;; ball-after-drag ;; : Ball Integer Integer -> Ball ;; GIVEN: a ball and a location ;; RETURNS: the ball after a drag event at the ;; given location. ;; STRATEGY: Use template for Ball on b (define (ball-after-drag b x y) (if (ball-selected? b) (make-ball x y (ball-radius b) (ball-selected? b))) b)) This version is not as good as the preceding one, because it does two tasks: it decides WHEN to move the ball, and it also figures out HOW to move the ball.

Exception You can use the template for more than one compound if you really need to.

Example: balls-collide.rkt ;; balls-intersect? : Ball Ball -> Boolean ;; GIVEN: two balls ;; ANSWERS: do the balls intersect? ;; STRATEGY: Use template for Ball on b1 and b2. (define (balls-intersect? b1 b2) (circles-intersect? (ball-x b1) (ball-y b1) (ball-radius b1) (ball-x b2) (ball-y b2) (ball-radius b2))) This is OK, because trying to take the balls apart in separate functions just leads to awkward code.

circles-intersect? ;; circles-intersect? : Real^3 Real^3 -> Boolean ;; GIVEN: two positions and radii ;; ANSWERS: Would two circles with the given ;; positions and radii intersect? ;; STRATEGY: Function Composition (define (circles-intersect? x1 y1 r1 x2 y2 r2) (<= (+ (sqr (- x1 x2)) (sqr (- y1 y2))) (sqr (+ r1 r2)))) circles-intersect? knows about geometry. It doesn't know about balls: eg it doesn't know the field names of Ball or about ball-selected? . If we changed the representation of balls, to add color, text, or to change the names of the fields, circles-intersect? wouldn't need to change. If you didn't break up balls-intersect? with a help function like this, you would very likely be penalized for "needs help function"

Writing good definitions If your code is ugly, try decomposing things in the other order Remember: Keep it short! If you have complicated junk in your function, you must have put it there for a reason. Turn it into a separate function so you can explain it and test it. If your function is long and unruly, it probably means you are trying to do too much in one function. Break up your function into separate pieces and use “Combine Simpler Functions.”

The shape of the data determines the shape of the program. Summary We’ve now seen three Design Strategies: Combine Simpler Functions Combine simpler functions in series or pipeline Use with any kind of data Use Template Used for enumeration , compound, or mixed data Template gives sketch of function Our most important tool Cases For when you need to divide data into cases, but the template doesn’t fit. Remember: The shape of the data determines the shape of the program.

Next Steps Study the files in the Examples folder. 02-3-traffic-light-with-timer.rkt 02-4-ball-after-mouse.rkt 02-5-balls-collide.rkt in the Examples folder. Especially look at the tests. Observe how the unused code shows up in orange or black. If you have questions or comments about this lesson, post them on the discussion board. Go on to the next lesson.