Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... ·...

29
toad Fall 2012 © 2012 C Garrod, J Aldrich, and W Scherlis School of Computer Science Principles of Software Construction: Objects, Design and Concurrency Packages and Polymorphism Jonathan Aldrich Charlie Garrod 15-214

Transcript of Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... ·...

Page 1: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

 toad    

Fall  2012  

© 2012 C Garrod, J Aldrich, and W Scherlis

School of Computer Science

Principles of Software Construction: Objects, Design and Concurrency Packages and Polymorphism

Jonathan Aldrich Charlie Garrod

15-214

Page 2: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 2 15-­‐214    Garrod  

Homework 1: Representing graphs

Two common representations Ø Adjacency matrix Ø Adjacency list

Adjacency matrix Adjacency list

b

d

c

a

0 1 0 0

0 0 1 0

1 0 0 1

1 0 0 0

a

b

c

d

a b c d a

b

c

d

b

c

a d

a

sour

ce

target

Page 3: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 3 15-­‐214    Garrod  

15-214 Lab work

• Attending recitation (Wednesday) is required

• Attending lab (Monday) is not required § But you still must complete the lab work

• Handout via SVN (trunk/lab/01) later this week • Commit due Tuesday (11 Sept) 11:59 p.m.

Page 4: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 4 15-­‐214    Garrod  

Key concepts from Tuesday

• Exceptions

• Classes, revisited § Objects vs. classes § Null references § Mutability

• Abstract vs. implementation § Static fields and methods

Page 5: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 5 15-­‐214    Garrod  

• Multiple methods of the same name but different argument types

An earlier aside: Overloading!

Page 6: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 6 15-­‐214    Garrod  

• Syntax is: CLASSNAME.METHODNAME(ARGS) §  e.g.:

An earlier aside: Using a static method!

String s = null;!int i = 42;!s = String.valueOf(i);!!

Page 7: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 7 15-­‐214    Garrod  

Key concepts for today

• Packages § Name and visibility management § Qualified names

• Inheritance and polymorphism §  For maximal code re-use § Diagrams to show the relationships between classes §  Polymorphism and its alternatives § Method dispatch, revisited § Etc.

Page 8: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 8 15-­‐214    Garrod  

Recall: Inheritance, class hierarchy

Dog

AbstractDog

Chiuaua GermanShepherd …

“parent” or

“superclass”

“child” or

“subclass”

Page 9: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 9 15-­‐214    Garrod  

Programming languages: a complex view

Small-scale Larger-scale

Data Primitives Arrays Structures

Objects Heaps

Control Basic (if, while, ;) Function/method calls

Method dispatch Concurrency

Naming and Reference

Local variables Parameters

Package, imports Visibility Qualification

Page 10: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 10 15-­‐214    Garrod  

An earlier code example, revisited

package edu.cmu.cs.geo; class Point {

private int x, y; public int getX() { return x; } // a method; getY() is similar public Point(int px, int py) { x = px; y = py; } // …

} class Rectangle {

private Point origin; private int width, height; public Point getOrigin() { return origin; } public int getWidth() { return width; } // …

}

Page 11: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 11 15-­‐214    Garrod  

Packages and visibility

• Packages divide the Java namespace to organize related classes

• Visibility of names: §  public: visible everywhere §  private: visible only within class § default (no modifier needed): visible only within package §  protected: visible within package and also to subclasses

Modifier Class Package Subclass World public Y Y Y Y protected Y Y Y N default Y Y N N private Y N N N

Page 12: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 12 15-­‐214    Garrod  

Packages and qualified names

• E.g., three ways to refer to a java.util.Queue: § Use the full name:

java.util.Queue q = …;!q.add(…);!

§  Import java.util.Queue, then use the unqualified name: import java.util.Queue; Queue q = …;!

§  Import the entire java.util package: import java.util.*;!Queue q = …;!

• Compiler will warn about ambiguous references § Must then use qualified name to disambiguate

Page 13: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 13 15-­‐214    Garrod  

An introduction to inheritance

• A dog of an example: § Dog.java § AbstractDog.java § Chiuaua.java § GermanShepherd.java

• Typical roles: § An interface define expectations / commitment for clients § An abstract class is a convenient hybrid between an interface and a full implementation

§ Can override a method definition to specialize its implementation

Page 14: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 14 15-­‐214    Garrod  

Inheritance: a glimpse at the hierarchy

• Examples from Java § Collections library [next slide] § Graphics objects §  java.lang.Object

• Benefits and risks of inheritance § Reuse of code § Modeling flexibility

• Specialization çè Subtyping § Multiple inheritance

• In Java: • Can extend only one parent class • Can implement multiple interface

Page 15: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 15 15-­‐214    Garrod  

JavaCollection API (excerpt)

Collection

List Set AbstractCollection

AbstractList

LinkedList

Vector

HashSet

AbstractSequentialList

AbstractSet

Cloneable

ArrayList

interfaces

Page 16: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 16 15-­‐214    Garrod  

Inheritance: a glimpse at the hierarchy

• Examples from Java § Collections library § Graphics objects §  java.lang.Object

• Benefits and risks of inheritance § Reuse of code § Modeling flexibility

• Specialization çè Subtyping § Multiple inheritance

• In Java: • Can extend only one parent class • Can implement multiple interface

Page 17: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 17 15-­‐214    Garrod  

Aside: UML class diagram notation

«interface»  Dog    getName()  :  String  getBreed()  :  String  bark()  :  String  setName(name  :  String)  toString()  :  String  

AbstractDog  -­‐  name  :  String    -­‐  breed  :  String    +  getName()  :  String  +  getBreed()  :  String  +  bark()  :  String  +  setName(name  :  String)  #  setBreed(breed  :  String)  +  toString()  :  String  

GermanShephard    bark()  :  String  play()  

«interface»  brand  

Name  of  class  or  interface  in  top  compartment  

Return  type  comes  aDer  

method  or  field  Methods  in  boGom  

compartment   Dashed  line,  open  triangle  arrowhead  for  implements  

Solid  line,  open  triangle  arrowhead  

for  extends  

Italics  means  abstract  

Italics  means  abstract  

OpMonal  visibility:  +  for  public  -­‐   for  private  #  for  protected  ~  for  package  (not  used  much)  

Fields  in  middle  compartment  

Page 18: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 18 15-­‐214    Garrod  

Consider different kinds of bank accounts:

«interface»  CheckingAccount    getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  getFee()  :  float  

«interface»  SavingsAccount    getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  getInterestRate()  :  float  

Page 19: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 19 15-­‐214    Garrod  

A better design: An account type hierarchy

«interface»  Account    getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

«interface»  CheckingAccount    getFee()  :  float  

«interface»  SavingsAccount    getInterestRate()  :  float  

«interface»  InterestCheckingAccount      

SavingsAccount  is  a  subtype  of  

Account.    Account  is  a  supertype  of  SavingsAccount.  

MulPple  interface  extension  

CheckingAccount  extends  Account.  All  methods  from  

Account  are  inherited  (copied  to  CheckingAccount)  

If  we  know  we  have  a  CheckingAccount,  addiPonal  methods  

are  available.  

Page 20: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 20 15-­‐214    Garrod  

A better design: An account type hierarchy

«interface»  Account    getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

«interface»  CheckingAccount    getFee()  :  float  

«interface»  SavingsAccount    getInterestRate()  :  float  

«interface»  InterestCheckingAccount      

SavingsAccount  is  a  subtype  of  

Account.    Account  is  a  supertype  of  SavingsAccount.  

MulPple  interface  extension  

CheckingAccount  extends  Account.  All  methods  from  

Account  are  inherited  (copied  to  CheckingAccount)  

If  we  know  we  have  a  CheckingAccount,  addiPonal  methods  

are  available.  

public interface CheckingAccount ! extends Account {! …!} !

public interface InterestCheckingAccount! extends CheckingAccount, SavingsAccount {! …!} !

Page 21: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 21 15-­‐214    Garrod  

The power of Object-Oriented interfaces

• Polymorphism § Different kinds of objects can be treated uniformly by client code • e.g., a list of all accounts

§ Each object behaves according to its type §  If you add new kind of account, client code does not change

§ Consider this pseudocode:

§ See the DogWalker example

If today is the last day of the month:! For each acct in allAccounts:! acct.monthlyAdjustment();! !

Page 22: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 22 15-­‐214    Garrod  

One implementation: Just use interface inheritance

«interface»  Account    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

«interface»  CheckingAccount    

getFee()  :  float  

«interface»  SavingsAccount    

getInterestRate()  :  float  

«interface»  InterestCheckingAccount      

CheckingAccountImpl    

…  

SavingsAccountImpl    

…  

InterestCheckingAccountImpl    

…  

Page 23: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 23 15-­‐214    Garrod  

Better: Reuse abstract account code

public abstract class AbstractAccount implements Account { protected float balance = 0.0; public float getBalance() { return balance; } abstract public void monthlyAdjustment(); // other methods…

} public class CheckingAccountImpl

extends AbstractAcount implements CheckingAccount { public void monthlyAdjustment() { balance -= getFee(); } public float getFee() { /* fee calculation */ }

}

«interface»  Account    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

CheckingAccountImpl    

monthlyAdjustment()  getFee()  :  float  

AbstractAccount    

#  balance  :  float    

+  getBalance()  :  float  +  deposit(amount  :  float)  +  withdraw(amount  :  float)  :  boolean  +  transfer(amount  :  float,  

 target  :  Account)  :  boolean  +  monthlyAdjustment()  

«interface»  CheckingAccount    

getFee()  :  float  

Page 24: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 24 15-­‐214    Garrod  

Better: Reuse abstract account code

public abstract class AbstractAccount implements Account { protected float balance = 0.0; public float getBalance() { return balance; } abstract public void monthlyAdjustment(); // other methods…

} public class CheckingAccountImpl

extends AbstractAcount implements CheckingAccount { public void monthlyAdjustment() { balance -= getFee(); } public float getFee() { /* fee calculation */ }

}

«interface»  Account    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

CheckingAccountImpl    

monthlyAdjustment()  getFee()  :  float  

AbstractAccount    

#  balance  :  float    

+  getBalance()  :  float  +  deposit(amount  :  float)  +  withdraw(amount  :  float)  :  boolean  +  transfer(amount  :  float,  

 target  :  Account)  :  boolean  +  monthlyAdjustment()  

«interface»  CheckingAccount    

getFee()  :  float  

protected  elements  are  visible  in  subclasses  

an  abstract  class  is  missing  the  

implemenPon  of  one  or  more  methods  

an  abstract  method  is  leU  to  be  implemented  in  a  

subclass  

no  need  to    define  getBalance()  –  the  code  is  

inherited  from  AbstractAccount  

Page 25: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 25 15-­‐214    Garrod  

Inheritance vs. subtyping

• Inheritance § A class reuses code from a superclass

• class A extends B §  Inheritance is for code reuse

• Write code once and only once • Code from superclass implicitly available in subclass

• Subtyping § A class implements a (Java) interface

• class A implements I § A class implements the (implicit) interface of another class • class A extends B : both subtyping and inheritance

§ Subtyping is for polymorphism • Accessing objects the same way, but getting different behavior

• Subtype is substitutable for supertype

Page 26: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 26 15-­‐214    Garrod  

Challenge: Is inheritance necessary?

• Can we get the same amount of code reuse using only interfaces?

«interface»  Account    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

«interface»  CheckingAccount    

getFee()  :  float  

«interface»  SavingsAccount    

getInterestRate()  :  float  

«interface»  InterestCheckingAccount      

Page 27: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 27 15-­‐214    Garrod  

Reuse via code wrappers

«interface»  Account    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

«interface»  CheckingAccount    

getFee()  :  float  

CheckingAccountImpl    

monthlyAdjustment()  {  …  }  getFee()  :  float  {  …  }  getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean    

BasicAccountImpl    

balance  :  float    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean    

public class CheckingAccountImpl! implements CheckingAccount {! BasicAccountImpl basicAcct = new(…);! public float getBalance() {! return basicAcct.getBalance();! }! // …!

CheckingAccountImpl  depends  on  

BasicAccountImpl  

Page 28: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 28 15-­‐214    Garrod  

Reuse via code wrappers, version 2: Delegation

«interface»  Account    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

«interface»  Adjustment    

doAdjust()  

SavingsAccountAdjustment    

doAdjust()  

adjustment! .doAdjust()!

BasicAccountImpl    

balance  :  float    

getBalance()  :  float  deposit(amount  :  float)  withdraw(amount  :  float)  :  boolean  transfer(amount  :  float,  

 target  :  Account)  :  boolean  monthlyAdjustment()  

adjustment  account  

float bal = account.getBalance();!float interest = bal * interestRate;!account.deposit(interest);!

requires  two-­‐way  dependence  

Page 29: Principles of Software Construction: Objects, Design …aldrich/courses/15-214-12fa/slides/04... · Principles of Software Construction: Objects, Design and Concurrency Packages and

toad 29 15-­‐214    Garrod  

Inheritance vs. delegation

• Delegation can be cleaner than inheritance § Reused code in a separate object §  Interfaces between objects

• Inheritance has less boilerplate code § No forwarding functions, recursive dependencies