basic class design
Download
Skip this Video
Download Presentation
Basic Class Design

Loading in 2 Seconds...

play fullscreen
1 / 89

Basic Class Design - PowerPoint PPT Presentation


  • 111 Views
  • Uploaded on

Basic Class Design. Example: Payroll. Purpose : Picture the object-creation, message-passing interplay of objects in an executing program. Statement of The Problem: Given a source of time card information and a personnel file, print payroll checks. What Objects Would You Expect?.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Basic Class Design' - garrett-sharpe


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
example payroll
Example: Payroll

Purpose:

Picture the object-creation, message-passing interplay of objects in an executing program.

Statement of The Problem:

Given a source of time card information and a personnel file, print payroll checks

what objects would you expect
What Objects Would You Expect?

Statement of The Problem (again):

Given a source of time card information and a personnel file, print payroll checks

Common heuristic: look for the nouns.

payroll classes
PayrollMaster

Employee

PersonnelFile

TimeCard

TimeCardFile

Check

SS#

Hours

Payroll Classes
payroll objects

Time

getHours

Program

PersonnelFile

main

lookup

PayYourself

Employee

TimeCard File

getCard

Payroll Master

TimeCard

DoPayroll

getTime

SS

Check

getSS

match

print

Payroll Objects
payroll program 1

Program

PersonnelFile

PersonnelFile

PersonnelFile

main

lookup

lookup

lookup

TimeCard File

TimeCard File

TimeCard File

getCard

getCard

getCard

Payroll Master

Payroll Master

Payroll Master

DoPayroll

DoPayroll

DoPayroll

Payroll Program (1)
payrollmaster dopayroll 1

PersonnelFile

lookup

TimeCard

TimeCard

TimeCard

TimeCard File

getTime

getTime

getTime

getSS

getSS

getSS

getCard

Payroll Master

DoPayroll

PayrollMaster: DoPayroll (1)
payrollmaster dopayroll 2

PersonnelFile

lookup

get SS

get SS

get SS

get SS

TimeCard

TimeCard File

getTime

getSS

getCard

Payroll Master

DoPayroll

SS

SS

SS

SS

match

match

match

match

PayrollMaster: DoPayroll (2)
payrollmaster dopayroll 3

Time

Time

Time

Time

Time

getHours

getHours

getHours

getHours

getHours

PersonnelFile

lookup

get Time

get Time

get Time

get Time

TimeCard

TimeCard File

getTime

getSS

getCard

Payroll Master

DoPayroll

SS

match

PayrollMaster: DoPayroll (3)
personnel lookup

Time

getHours

PersonnelFile

lookup

PayYourself

PayYourself

PayYourself

Employee

Employee

Employee

TimeCard File

getCard

Payroll Master

TimeCard

DoPayroll

getTime

SS

getSS

match

Personnel: Lookup
payrollmaster dopayroll 4

Time

getHours

PersonnelFile

lookup

PayYourself

Employee

TimeCard File

getCard

Payroll Master

TimeCard

DoPayroll

getTime

SS

Check

Check

Check

Check

Check

Check

getSS

match

print

print

print

print

print

print

PayrollMaster: DoPayroll (4)
payroll program 2

Time

getHours

Program

PersonnelFile

main

lookup

PayYourself

Employee

TimeCard File

getCard

Payroll Master

TimeCard

DoPayroll

getTime

SS

Check

getSS

match

print

Payroll Program (2)
a peculiar employee design

SMART and HELPFUL Objects

A Peculiar Employee Design?
  • Since when do employees create their own checks?
  • Since when are employees trusted to determine their own pay?

(not in OUR contract!)

oop and o o design
OOP and O-O Design
  • Can\'t rush in and “program”
  • Design phase needed even in simple problems
    • desirable in procedural programming
    • sine qua non in O-O world
  • O-O design methodologies:
    • numerous
    • we\'ll consider just one simple one
kindergarten ood

Statement of Problem

Possible Objects

Primary Object

Behavior

Interface

Sample Use

Implement

Kindergarten OOD
kindergarten ood1
Kindergarten OOD
  • Not appropriate for all problems
  • Works surprisingly well on many
    • great for CS1
  • Illustrate with an example:

Find the value of a portfolio of stocks based on “ticker-tape” information

statement of problem
Statement of Problem:

Find the value of a portfolio of stocks based on "ticker-tape" information.

possible objects
Possible Objects:
  • Portfolio
  • Holding (a portfolio item)
  • Value
  • TickerTape
primary object
Primary Object?
  • not Holding
  • not Value
  • Portfolio vs. TickerTape?
portfolio vs tickertape
Portfolio vs. TickerTape?
  • Both primary in the sense of independence
  • But to which object should we send a message to solve our problem?
is portfolio the primary object
Is Portfolio the Primary Object?
  • If so, Portfolio has this behavior:

get Value of Portfolio, given TickerTape

is tickertape the primary object
Is TickerTape the Primary Object?
  • If so, TickerTape has this behavior:
    • get Value of Portfolio, given Portfolio
  • Should TickerTape be responsible for computing the Value of a Portfolio?
responsibility driven design
Responsibility-Driven Design:
  • objects should be responsible for themselves
  • example:
    • objects should be responsible for their own initialization (constructors)
  • TickerTape should not be responsible for Value of a Portfolio, Portfolio should
  • Primary Object:Portfolio
behavior of portfolio
Behavior of Portfolio:
  • get Value, given TickerTape
  • constructor, given a file listing of a portfolio
interface of portfolio
Interface of Portfolio:

class Portfolio { Portfolio create() Value getValue(TickerTape t)}

sample use
Sample Use:

create TickerTape t create Portfolio p to p: get Value v, given t to v: print

implementing portfolio
Implementing Portfolio:

class Portfolio {

constructor() {

}

Value getValue(TickerTape t) {

}

}

implementing portfolio getvalue 1
Implementing Portfolio: getValue (1):

class Portfolio {

Value getValue(TickerTape t) {for each Holding h in Collection c of Holdings { get the Value of h increase the total by v } return total}

}

  • Needed:
    • STATE: Collection object, c

A Portfolio HAS-A collection of holdings

    • Local Value object, total
implementing portfolio getvalue 2
Implementing Portfolio: getValue (2):

class Portfolio {Value getValue(TickerTape t) {Value total initialized to 0

for each Holding h in Collection c of Holdings { get the Value of h increase the total by v } return total}

STATE: Collection c

}

getting the value of a holding 1
Getting The Value of a Holding (1)
  • This is OOP
  • Ya want something done, send an object a message

to h: getValue

getting the value of a holding 2
Getting The Value of a Holding (2)

to h: getValue

  • Problem: a Holding is responsible for
      • name of stock
      • number of shares
      • NOT current market value
  • Solution: send h an object that has the necessary behavior

to h: getValue given TickerTape t

increasing a value
Increasing a Value
  • This is OOP
  • Ya want something done, send an object a message

to total: increase by ...

implementing portfolio getvalue 3
Implementing Portfolio: getValue (3):

class Portfolio {Value getValue(TickerTape t) { Value total initialized to 0

for each Holding h in Collection c of Holdings {to h: get the Value v of your stock, given t to total: increase by v } return total}

STATE: Collection c

}

  • Remark: Who initializes the Collection?
the portfolio constructor 1
The Portfolio Constructor (1)

class Portfolio {constructor() {create Collection c ... ???}...STATE: Collection c

}

constructor questions and answers
Constructor Questions and Answers
  • Questions:
    • where will the portfolio data come from?
    • in what form will it be?
  • Answers (let\'s say):
    • from a TokenSource
    • a sequence of (stock name and number) pairs
  • Question:
    • Where should the responbility for creating TokenSource lie?
the portfolio constructor 2
The Portfolio Constructor (2)

class Portfolio {constructor(TokenSource src) { create Collection ccreate Holding h, given src while h was created successfully { to c: add h create Holding h, given src }}

STATE: Collection c

}

portfolio class
Portfolio Class:

class Portfolio { constructor(TokenSource src) { create Collection c create Holding h, given src while h was created successfully { to c: add h create Holding h, given src }}

Value getValue(TickerTape t) { Value total initialized to 0

for each Holding h in Collection c of Holdings { to h: get the Value v of your stock, given t to total: increase by v } return total}

STATE: Collection c

}

class summary
Completed:

Portfolio

Yet To Complete:

TickerTape

TokenSource

Collection

Holding

Value

Class Summary
details of remaining classes
Details of Remaining Classes:
  • TickerTape— constructor
  • TokenSource — constructor get String
  • Collection— constructor add ... some way of iterating …
  • Holding— constructor, given TokenSource get Value given TickerTape
  • Value— constructor, given an integer value increase, given a Value print
next step pick a class and follow same procedure
NEXT STEP: Pick a class and follow same procedure…
  • TickerTape
  • TokenSource
  • Collection
  • Holding
  • Value
statement of subproblem
Statement of SubProblem…

… skip steps because

behavior

interface

have been determined

behavior of holding
Behavior of Holding:
  • create, given TokenSource
  • get Value given TickerTape
interface of holding
Interface of Holding:

class Holding { constructor(TokenSource src) Value getValue(TickerTape t)

}

sample use1
Sample Use:

... from implementation of Portfolio

implementing holding
Implementing Holding:

class Holding {

constructor(TokenSource src) {

}

Value getValue(TickerTape t) }

}

}

implementing holding getvalue
Implementing Holding: getValue

class Holding {Value getValue(TickerTape t) {to t: get Value v of stock named by my StockName to v: multiply by my Number return v}

}

  • Remarks:
    • the object must maintain a StockName and a Number, call them sn and n
implementing holding state
Implementing Holding: STATE

class Holding {Value getValue(TickerTape t) { to t: get Value v given sn to v: multiply by n return v}STATE: StockName sn Number n

}

implementing holding constructor
Implementing Holding: constructor

class Holding {constructor(TokenSource src) { create StockName sn, given src create Number n, given src}

...

STATE: StockName sn Number n

}

  • Remark: Each class bears the responsibility for doing most of the work to create its own instances
the holding class
The Holding Class

class Holding {constructor(TokenSource src) { create StockName sn, given src create Number n, given src}

Value getValue(TickerTape t) { to t: get Value v given sn to v: multiply by n return v}

STATE: StockName sn Number n

}

class summary1
Completed:

Portfolio

Holding

Yet To Complete:

TickerTape

TokenSource

Collection

Value

Number

StockName

Class Summary
details of remaining classes i
Details of Remaining Classes (I):

NEW!

  • TickerTape— constructor
    • get Value given a StockName
  • TokenSource — constructor
    • get String
  • Collection— constructor
    • add
    • ... some way of iterating …
details of remaining classes ii
Details of Remaining Classes (II):
  • Value— constructor, given an integer value
    • increase, given a Value
    • multiply, given a Number
    • print
  • Number— constructor
  • StockName— constructor

NEW!

NEW!

next step pick a class and follow procedure
NEXT STEP: Pick a class and follow procedure....
  • TickerTape
  • TokenSource
  • Collection
  • Value
  • Number
  • StockName
statement of subproblem1
Statement of SubProblem:
  • ... skip steps because behavior, interface has been determined
behavior of tickertape
Behavior of TickerTape:
  • Create
  • get Value given StockName
interface of tickertape
Interface of TickerTape:

class TickerTape { constructor() TickerTape getValue(StockName sn)

}

sample use2
Sample Use:

... from implementation of Holding

implementing tickertape
Implementing TickerTape

class TickerTape {constructor() {}Value getValue(StockName sn) {}

}

implementing tickertape getvalue
Implementing TickerTape: getValue

class TickerTape {Value getValue(StockName sn) {for each StockQuote s

in my Collection c of StockQuotes { to s: does sn match? if yes { to s: getValue v return v } } error}

}

Remark: need a Collection in my state

implementing tickertape state
Implementing TickerTape: State

class TickerTape {

Value getValue(StockName sn) { for each StockQuote s

in my Collection c of StockQuotes { to s: does sn match? if yes { to s: getValue v return v } } error}STATE: Collection c

}

implementing tickertape constructor
Implementing TickerTape: constructor

class TickerTape {constructor(TokenSource src) {create Collection c create StockQuote s given src while not failure { to c: add s create StockQuote s given src }}...

STATE: Collection c

}

the tickertape class
The TickerTape Class

class TickerTape {constructor(TokenSource src) { create Collection c create StockQuote s given src while not failure { to c: add s create StockQuote s given src }}

the tickertape class continued
The TickerTape Class (continued)

Value getValue(StockName sn) { for each StockQuote s

in my Collection c of StockQuotes { to s: does sn match? if yes { to s: getValue v return v } } error } STATE: Collection c}

class summary2
Completed:

Portfolio

Holding

TickerTape

Yet To Complete:

TokenSource

Collection

Value

Number

StockName

StockQuote

Class Summary
details of remaining classes i1
Details of Remaining Classes (I):
  • TokenSource — constructor
    • get String
  • Collection— constructor
    • add
    • ... some way of iterating …
  • Value— constructor, given an integer value
    • increase, given a Value
    • multiply, given a Number
    • print
details of remaining classes ii1
Details of Remaining Classes (II):

NEW!

  • Number— constructor
  • StockName— constructor
  • StockQuote— constructor, given a TokenSource
    • match a StockName
    • return the Value of a stock
next step pick a class and follow procedure1
NEXT STEP: Pick a class and follow procedure....
  • TickerTape
  • TokenSource
  • Collection
  • Value
  • Number
  • StockName
  • StockQuote
statement of subproblem2
Statement of SubProblem:

... skip steps because behavior, interface has been determined

behavior of stockquote
Behavior of StockQuote:
  • create, given a TokenSource
  • get Value
  • is match? given a StockName
interface of stockquote
Interface of StockQuote:

class StockQuote {constructor(TokenSource src)Value getValue()boolean isMatch(StockName sn)

}

sample use3
Sample Use:
  • ... from implementation of TickerTape
implementing stockquote
Implementing StockQuote

class StockQuote {constructor(TokenSource src) {

}

StockQuote getValue() {

}

boolean isMatch(StockName sn) {

}

}

implementing stockquote i
Implementing StockQuote (I)

class StockQuote {constructor(TokenSource src) {

}

StockQuote getValue() {return v;

}

boolean isMatch(StockName sn) {to sn: does my StockName sn match? if yes return true else return false

}STATE: Value v StockName sn

}

implementing stockquote ii
Implementing StockQuote (II)

class StockQuote {constructor(TokenSource src) {create StockName sn, given src create Value v, given src}...STATE: Value v StockName sn

}

the stockquote class
The StockQuote Class

class StockQuote {constructor(TokenSource src) { create StockName sn, given src create Value v, given src}

StockQuote getValue() { return v;

}

boolean isMatch(StockName sn) { to sn: does my StockName sn match? if yes return true else return false

}STATE: Value v StockName sn

}

class summary3
Completed:

Portfolio

Holding

TickerTape

StockQuote

Yet To Complete:

TokenSource

Collection

Value

Number

StockName

Class Summary
details of remaining classes i2
Details of Remaining Classes (I):
  • TokenSource — constructor
    • get String
  • Collection— constructor
    • add
    • ... some way of iterating …
  • Value— constructor, given an integer value
    • increase, given a Value
    • multiply, given a Number
    • print
details of remaining classes ii2
Details of Remaining Classes (II):
  • Number— constructor
  • StockName— constructor
    • is Match? given another StockName

NEW!

next step pick a class and follow procedure2
NEXT STEP: Pick a class and follow procedure....
  • TickerTape
  • TokenSource
  • Collection
  • Value
  • Number
  • StockName
statement of subproblem3
Statement of SubProblem:
  • ... skip steps because behavior, interface has been determined
behavior of value
Behavior of Value:
  • create, given a TokenSource
  • increase, given a Value
  • multiply, given a Number
  • print
interface of value
Interface of Value:

class Value { Value create(TokenSource src) void increase(Value v) void multiply(Number n) void print()

}

sample use4
Sample Use:

... from implementation of TickerTape

implementing value
Implementing Value

class Value {Value create(TokenSource src) {}void increase(Value v) {}void multiply(Number n) {}void print() {}

}

implementing value constructor
Implementing Value: constructor

class Value {constructor(TokenSource src) {to src: get String integerPart to src: get String fraction to fraction: contains / ? if no to src: put back String fraction // just use integerPart else // use integerPart and fraction } ...

}

implementing value other methods
Implementing Value: other methods

class Value {Value create(TokenSource src) { ...}void increase(Value v) { // defer}void multiply(Number n) { // defer}void print() { // defer}STATE: ???

}

class summary4
Completed:

Portfolio

Holding

TickerTape

StockQuote

Value (partially)

Yet To Complete:

TokenSource

Collection

Number

StockName

Class Summary
details of remaining classes1
Details of Remaining Classes:

NEW!

  • TokenSource — constructor
    • get String
    • put back String, given String
  • Collection— constructor
    • add
    • ... some way of iterating …
  • Number— constructor
  • StockName— constructor
    • is Match? given another StockName
next step
NEXT STEP:

And so on …

(I\'m tired now— aren\'t you?)

ad