Ch 21 Intro to Object Oriented Design

advertisement
• Given the description of a problem,
– how do you determine what classes to
define?
– how do you design each class?
• Need a design methodology
1
Object-Oriented Design
• Often software mimics the real world
• Decompose problem into objects
– identify properties and behaviors
– model in software
Ex.) FallingBall active objects behave like
falling balls
2
Abstraction
• An object provides an abstraction
– can use without knowing details of its
implementation
– abstract away details; understand at higher level
• Follows from our use of objects in real world
– can use a stopwatch without knowing exactly how
it works
• Well-designed classes provide good
abstractions.
3
A Simple Stopwatch
Consider
• implementing a simple stopwatch
• Begin by identifying properties and
behaviors to model
4
Properties
Properties of an object are the nouns and
adjectives that describe it
• Consider properties of a stopwatch; has
– buttons that control functionality
– display area
– internal memory to store timing info
5
Modeling Properties
1. Consider properties of the entity to be
modeled
2. Decide which properties relevantwhich to actually model
3. Decide how to model properties
6
Stopwatch Properties
1. Properties of real stopwatches
–
function buttons, display, memory
2. Which relevant?
–
–
Say ours will be used to get time between
mouse clicks
no display or buttons needed
3. How to model?
–
–
need to calculate elapsed time
need to model start time for calculation
7
Behaviors
The verbs that describe object functionality
• Behaviors of a real stopwatch
– reset to zero
– report elapsed time
– stop
– resume timing
• Need to choose which to model
8
Stepping Through the Process
Design and implement simple shell game
– three cups + 1 marble
– player 1 hides marble: drags marble onto a cup
– player 1 shuffles cups: drags cups with mouse
– player 2 guesses: clicks on a cup
• cup raised
• marble displayed, if there
9
Step 1:
Identify Objects to Model
• Objects in problem description
– players
– cups
– marble
• Which to model?
– cups
– marble
Note: players are users of program; provide
them interface
10
Step 2:
List Properties and Behaviors
Cup
• Properties
– image on screen
– empty or not
• Behaviors
– can be moved
– can have marble placed in it
– can be raised to reveal contents
11
// A class to represent a cup used in the Shell Game
public class Cup {
// List of cup properties
// Graphical image of the cup
// Whether the cup contains the marble
// List of cup behaviors
// Move the cup
// Place a marble in the cup
// Reveal the contents of the cup; remove marble from cup,
// if there
}
12
Marble
• Properties
– image on screen
– in a cup or not*
• Behaviors
– can be moved
– can be dropped into cup
– can be removed from cup
* will ignore this- already modeling
containment in cup
13
// A class to represent a marble
public class Marble {
// List of marble properties
// Graphical image of the marble
// List of marble behaviors
// Move the marble
// Place the marble in a cup
// Remove the marble from a cup
}
14
Need user interface- controller class
• Properties
– Physical appearance
– State of the game
• Behaviors
– set up game
– let user move cup or marble
– let user show cup contents
15
// Controller class for a simple Shell Game
public class ShellGame extends WindowController {
// Properties that describe the shell game
// Three cups
// A marble
// The current position of the mouse
// Whether a marble or cup has been selected
// Which object has been selected
// Allowable game behaviors
// Place three cups and a marble on the canvas
// Move a cup or marble
// Show contents of a cup
}
16
Step 3:
Model Properties with Inst. Vars.
// A class to represent a cup used in the Shell Game
public class Cup {
// List of cup properties
// Graphical image of the cup
private FilledRect cupSide;
private FilledOval cupTop, cupBottom;
private FramedRect sideFrame;
private FramedOval topFrame, bottomFrame;
// Whether the cup contains the marble
private boolean containsMarble;
// List of cup behaviors
// Move the cup
// Place a marble in the cup
// Reveal the contents of the cup; remove marble from cup, if there
}
17
// A class to represent a marble
public class Marble {
// Marble properties
// Graphical image of the marble
private FilledOval theMarble;
// Marble behaviors
// Move the marble
// Place the marble in a cup
// Remove the marble from a cup
}
18
// Properties that describe the shell game
// Three cups
// A marble
// The current position of the mouse
// Whether a marble or cup has been selected
// Which object has been selected
• On second thought: don’t really need current
mouse location. Can get in onMousePress,
etc, as needed.
• But need last mouse position for dragging
19
Design is a Process
• Well-defined set of steps guides process
• Need to be open to modifying early decisions
Second Level ShellGame design
20
Step 4:
Model Behaviors with Methods
• First focus on method headers
(signatures)
• Describe interface between entities in
our program
21
Cup
• Need to “Move the cup”
public void move( double dx, double dy )
• “Place a marble in the cup”
public void dropIn( Marble aMarble )
• “Reveal the contents”
public void showContents()
Note: can’t reveal marble if no ref. to it in
the class. Need to add instance variable!
22
• Don’t forget about constructors!
public Cup( Location upperLeft,
double width, double height,
DrawingCanvas canvas )
23
Making Choices
• Often need to think hard about design
choices
• Ex. Define cup width and height in Cup
class? Controller?
• "Third level design: Cup class"
24
Marble
• Need to “Move the Marble”
public void move( double dx, doubly dy )
• Need to “Place marble in cup”
– But cup already does this!
25
// A class to represent a marble
public class Marble {
// Graphical image of the marble
private FilledOval theMarble;
// Move the marble
// dx, dy - distance to move in the vertical and horizontal directions
public void move( double dx, double dy )
}
Marble class so far: Nothing but a FilledOval
that moves! Class is unnecessary!
26
ShellGame controller
• Need to “set up”
public void begin()
• “Select marble or cup”
public void onMousePress( Location mousePos)
– a problem: how to determine if mouse in a
cup?
– add contains method to Cup
Third Level for ShellGameClass
27
Refinement
Designing software is a process of
refinement
• Begin at highest level of abstraction; fill
in details
• Change earlier design decisions, if
necessary
28
Filling in the Details
• If method simple, write method body
• If method complex
– outline method body
– fill in details of outline
• Constructor
– useful to consider each instance variable
– determine instance variable initialization
Cup instance variables and constructor
29
Cup methods
• move
– straightforward
– delegate to components
• contains
– easy
• dropIn and showContents more complex
• "Cup class method details"
30
ShellGame methods
• begin
– similar to constructor
– review instance variables; initialize.
– specifying a value for a variable is a signal
that constant needed
begin()
31
• onMousePress
– check whether mouse in a cup; then check
marble
– why check cups first?
onMousePress
32
• onMouseDrag
– determine what selected for drag
– move it
onMouseDrag
33
• onMouseRelease
• onMouseClick
34
Design Process Summary
1. Identify objects to be modeled
2. For each type of object
–
–
list properties
list behaviors
3. Model Properties with inst. variables
4. Model behaviors with methods
–
–
Method headers
Don’t forget constructors
5. Implementation details
–
–
if method simple, write it
if complex, outline first
35
Incremental Testing
• Test and debug individual components
as they are developed
– Finding bugs easier if testing
smaller/simpler code
– can rely on behavior of smaller entities
when testing/debugging larger components
36
Unreal Entities
• Not all program classes model entities in the
real world
Ex. Animated Shell Game
– Player places marble in cup as before
– Computer shuffles cups
(when player moves mouse off canvas and back
again)
– Player clicks on cup to reveal contents
• Program entities
– cups, marble (Real)
– Shuffle animation (Not so “real”)
37
New Shell Game Design
• Marble - FilledOval as before
• Cups
– identical properties to earlier version
– nearly identical behaviors
– additional behaviors needed:
• ability to move to specific location
• ability to report location
• ability to be lowered (after being raised to reveal
contents)
• Additional marble methods
38
Shuffler Design Steps 1-4
*Will need to extend ActiveObject for animation
• Identify properties and behaviors (instance
variables and methods)
• Behaviors
– perform shuffling animation (run method)
• Properties
– harder to identify
– not modeling a “real-world” cup shuffler
– consider instance variables needed
• 3 cups
• possibly more later
39
// A class to animate shuffling in a Shell Game
public class Shuffle extends ActiveObject {
// Three cups to be shuffled
private Cup cup1, cup2, cup3;
// Construct a shuffler
// Shuffle the cups
public void run()
}
40
Shuffler Design Step 5
Refine ideas for animation
• Select two cups
*Need RandomIntGenerator
• Swap selected cups
– can’t simply swap locations
– swap must be visible to player
– Move 1st cup to temp location
– Move 2nd cup to 1st cup’s original spot
– Move 1st cup to 2nd cup’s original spot
*Note: need instance variable for temp location
41
42
43
44
• Constructor
– will need to be passed 3 cups
– needs to set up temp location
(choose to pass in as parameter)
– needs to construct RandomIntGenerator
for shuffling
– needs to start animation
Shuffler class design
45
User interface class
• can reuse some of previous version
• Player can’t shuffle cups
– remove selectedCup
– remove onMousePress, onMouseDrag
46
• onMouseEnter
– causes shuffling to begin
– only makes sense if marble hidden
New Controller design
47
Filling in the Details
• Easy
– follow comments that outlined our ideas
– comments continue to serve as documentation
• Let’s only consider Shuffler here
– Constructor
• remember parameters with instance variables
• start animation
shuffler Constructor
– run method
• a bit more interesting
48
• run method
– select 2 different cups to swap
• clever idea: pick the 1 cup that won’t be moved!
– perform the swap
– pause between moves to make swap visible
Implementation of shuffling
49
Writing Comments
• Each class should have a class comment
– Description of class
– Author’s name and date
• Each constant and variable should be
commented
– describe purpose (what, not how!)
– parameters
– return value, if any
• For long/complex methods
– include comments in method
– explain what is happening
– balance clarity and brevity
50
Encapsulation
• notion of taking variables and data
structures and wrapping them inside a
class definition
Information Hiding
• notion of hiding details of
implementation as much as possible
51
Why Important?
• protects variables from being modified
inappropriately by other classes
• can present classes to others for use by
simply specifying interface
ex. You used objectdraw library without
knowing any implementation details!
• can change details of class definition
without affecting those using it.
52
Summary
• Design is a process of iterative
refinement
• Good comments/documentation useful
for the designer and the reader
• Keep in mind notions of encapsulation
and information hiding
53
Download