85
1 15-214 School of Computer Science Principles of Software Construction: Objects, Design, and Concurrency (Part 1: Designing Classes) Design for Reuse (class level) Christian Kästner Bogdan Vasilescu

Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

115-214

School of Computer Science

Principles of Software Construction: Objects, Design, and Concurrency(Part 1: Designing Classes)

Design for Reuse (class level)

Christian Kästner Bogdan Vasilescu

Page 2: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

215-214

Administrivia

• Reading assignment due today

• Homework 2 due Thursday

Page 3: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

315-214

Page 4: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

415-214

FindBugsR

evie

w

• We will enable in HW3

• IDE plugin• build.gradle: apply plugin: 'findbugs'

Page 5: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

515-214

Learning goals for today

• Explain the need for and challenges of design for reuse

• Apply inheritance and delegation appropriately and understand their tradeoffs

• Behavioral subtyping and implications for specification and testing

• Identify applicability of and apply the template method design patterns

• Read and write UML interaction diagrams

Page 6: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

615-214

The limits of exponentials

time

cap

ab

ilit

y

Computing capability

Human capacity

Page 7: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

715-214

Building complex systems

● Division of labor

● Division of knowledge and design effort

● Reuse of existing implementations

simple complex

Comprehensible bya single person

Buildable bya single person

Page 8: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

815-214

The promise of reuse:

# Products

CostWith reuse

Without reuse

Page 9: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

915-214

Reuse: Family of development tools

Page 10: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1015-214

Reuse: Web browser extensions

Page 11: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1115-214

Reuse and variation: Flavors of Linux

Page 12: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1215-214

Today: Class-level reuse with delegation and inheritance

• Delegation

• Inheritance– Java-specific details for inheritance

• Behavioral subtyping: Liskov's Substitution Principle

• Today and Thursday: – Design patterns for improved class-level reuse

• Later in the course:– System-level reuse with libraries and frameworks

Page 13: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1315-214

COMPOSITION AND DELEGATION

Page 14: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1415-214

public class Sorter {void sort(int[] list, Comparator cmp) {… boolean mustswap; mustswap = cmp.compare(list[i], list[j]);…

}}

interface Comparator {boolean compare(int i, int j);

}

class UpComparator implements Comparator {boolean compare(int i, int j) { return i<j; }}

class DownComparator implements Comparator {boolean compare(int i, int j) { return i>j; }}

Recall our earlier sorting example:

Page 15: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1515-214

Delegation

• Delegation is simply when one object relies on another object for some subset of its functionality– e.g. here, the Sorter is delegating functionality to some Comparator

• Judicious delegation enables code reusepublic class Sorter {

void sort(int[] list, Comparator cmp) {… boolean mustswap; mustswap = cmp.compare(list[i], list[j]);…

}}

interface Comparator {boolean compare(int i, int j);

}

class UpComparator implements Comparator {boolean compare(int i, int j) { return i<j; }}

class DownComparator implements Comparator {boolean compare(int i, int j) { return i>j; }}

Page 16: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1615-214

Delegation

• Delegation is simply when one object relies on another object for some subset of its functionality– e.g. here, the Sorter is delegating functionality to some Comparator

• Judicious delegation enables code reusepublic class Sorter {

void sort(int[] list, Comparator cmp) {… boolean mustswap; mustswap = cmp.compare(list[i], list[j]);…

}}

interface Comparator {boolean compare(int i, int j);

}

class UpComparator implements Comparator {boolean compare(int i, int j) { return i<j; }}

class DownComparator implements Comparator {boolean compare(int i, int j) { return i>j; }}

• Sorter can be reused with arbitrary sort orders

• Comparators can be reused with arbitrary client code that needs to compare integers

Page 17: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1715-214

Using delegation to extend functionality

• Consider the java.util.List (excerpted):

public interface List<E> {

public boolean add(E e);

public E remove(int index);

public void clear();

}

• Suppose we want a list that logs its operations to the console…

Page 18: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1815-214

Using delegation to extend functionality

• One solution:

public class LoggingList<E> implements List<E> {

private final List<E> list;

public LoggingList<E>(List<E> list) { this.list = list; }

public boolean add(E e) {

System.out.println("Adding " + e);

return list.add(e);

}

public E remove(int index) {

System.out.println("Removing at " + index);

return list.remove(index);

}

The LoggingList is composed ofa List, and delegates (the non-

logging) functionality to that List

Page 19: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

1915-214

Aside: A sequence diagram for the LoggingList

Page 20: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2015-214

Delegation and design

• Small interfaces with clear contracts

• Classes to encapsulate algorithms, behaviors– E.g., the Comparator

Page 21: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2115-214

IMPLEMENTATION INHERITANCEAND ABSTRACT CLASSES

Page 22: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2215-214

Variation in the real world: types of bank accounts

«interface» CheckingAccount

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleangetFee() : float

«interface» SavingsAccount

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleangetInterestRate() : float

Page 23: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2315-214

Variation in the real world: types of bank accounts

public interface CheckingAccount {public long getBalance();public void deposit(long amount);public boolean withdraw(long amount);public boolean transfer(long amount, Account??? target);public long getFee();

}

public interface SavingsAccount {public long getBalance();public void deposit(long amount);public boolean withdraw(long amount);public boolean transfer(long amount, Account??? target);public double getInterestRate();

}

Page 24: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2415-214

Better: Interface inheritance for an account type hierarchy

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

«interface» CheckingAccount

getFee() : float

«interface» SavingsAccount

getInterestRate() : float

«interface» InterestCheckingAccount

SavingsAccount is a subtype of

Account. Account is a supertype of SavingsAccount.

Multiple interface extension

CheckingAccountextends Account.All methods from

Account are inherited (copied to CheckingAccount)

If we know we have a CheckingAccount, additional methods

are available.

Page 25: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2515-214

Interface inheritance for an account type hierarchy

public interface Account {public long getBalance();public void deposit(long amount);public boolean withdraw(long amount);public boolean transfer(long amount, Account target);public void monthlyAdjustment();

}

public interface CheckingAccount extends Account {public long getFee();

}

public interface SavingsAccount extends Account {public double getInterestRate();

}

public interface InterestCheckingAccountextends CheckingAccount, SavingsAccount {

}

Page 26: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2615-214

The power of object-oriented interfaces

• Subtype polymorphism– Different kinds of objects can be treated uniformly by client code

– Each object behaves according to its type

• e.g., if you add new kind of account, client code does not change:

If today is the last day of the month:For each acct in allAccounts:

acct.monthlyAdjustment();

Page 27: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2715-214

Implementation inheritance for code reuse«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

«interface» CheckingAccount

getFee() : float

«interface» SavingsAccount

getInterestRate() : float

«interface» InterestCheckingAccountCheckingAccountImpl

……

SavingsAccountImpl……

InterestCheckingAccountImpl……

Page 28: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2815-214

Implementation inheritance for code reuse«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

«interface» CheckingAccount

getFee() : float

«interface» SavingsAccount

getInterestRate() : float

«interface» InterestCheckingAccountCheckingAccountImpl

……

SavingsAccountImpl……

InterestCheckingAccountImpl……

What’s wrong with this design?

Page 29: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

2915-214

Implementation inheritance for code reuse«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

«interface» CheckingAccount

getFee() : float

«interface» SavingsAccount

getInterestRate() : float

«interface» InterestCheckingAccountCheckingAccountImpl

…getBalance()…

SavingsAccountImpl…getBalance()…

InterestCheckingAccountImpl…getBalance()…

Code duplication

Page 30: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3015-214

public abstract class AbstractAccount

implements Account {

protected long balance = 0;

public long getBalance() {

return balance;

}

abstract public void monthlyAdjustment();

// other methods…

}

public class CheckingAccountImpl

extends AbstractAccount

implements CheckingAccount {

public void monthlyAdjustment() {

balance -= getFee();

}

public long getFee() { … }

}

Implementation inheritance for code reuse

Page 31: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3115-214

public abstract class AbstractAccountimplements Account {

protected float balance = 0.0;public float getBalance() {

return balance;}abstract public void monthlyAdjustment();// other methods…

}

public class CheckingAccountImplextends AbstractAcountimplements CheckingAccount {

public void monthlyAdjustment() {balance -= getFee();

}public float getFee() { /* fee calculation */ }

}

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

AbstractAccount

# balance : float

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

target : Account) : boolean+ monthlyAdjustment()

«interface» CheckingAccount

getFee() : float

Better: Reuse abstract account code

CheckingAccountImpl

monthlyAdjustment()getFee() : float

Page 32: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3215-214

CheckingAccountImpl

monthlyAdjustment()getFee() : float

Better: Reuse abstract account code

public abstract class AbstractAccountimplements Account {

protected float balance = 0.0;public float getBalance() {

return balance;}abstract public void monthlyAdjustment();// other methods…

}

public class CheckingAccountImplextends AbstractAcountimplements CheckingAccount {

public void monthlyAdjustment() {balance -= getFee();

}public float getFee() { /* fee calculation */ }

}

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

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

implementation of one or more methods

an abstract method is left to be implemented in a

subclass

no need to define getBalance() – the code is

inherited from AbstractAccount

Page 33: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3315-214

Interfaces vs Abstract Classes vs Concrete Classes

• An interface defines expectations / commitment for clients– Java: can declare methods but cannot

implement them

– Methods are abstract methods

• An abstract class is a convenient hybrid between an interface and a full implementation. Can have:– Abstract methods (no body)

– Concrete methods (w/ body)

– Data fields

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

AbstractAccount

# balance : float

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

target : Account) : boolean+ monthlyAdjustment()

«interface» CheckingAccount

getFee() : float

CheckingAccountImpl

monthlyAdjustment()getFee() : float

Page 34: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3415-214

Interfaces vs Abstract Classes vs Concrete Classes

• Unlike a concrete class, an abstract class ...– Cannot be instantiated

– Can declare abstract methods

• Which must be implemented in all concrete subclasses

• An abstract class may implement an interface– But need not define all methods of the

interface

– Implementation of them is left to subclasses

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

AbstractAccount

# balance : float

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

target : Account) : boolean+ monthlyAdjustment()

«interface» CheckingAccount

getFee() : float

“parent” or

“superclass”

“child” or

“subclass”

CheckingAccountImpl

monthlyAdjustment()getFee() : float

Page 35: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3515-214

Aside: Inheritance and Class Hierarchies

• All Java classes are arranged in a hierarchy– Object is the superclass of all Java classes

• Inheritance and hierarchical organization capture idea:– One thing is a refinement or extension of another

Page 36: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3615-214

Aside: A glimpse at the hierarchyExcerpt from Java Collections API

Collection

List SetAbstractCollection

AbstractList

LinkedList

Vector

HashSet

AbstractSequentialList

AbstractSet

Cloneable

ArrayList

“implements”

“extends”

Interface

Class

AbstractClass

Page 37: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3715-214

Aside: Inheritance and Class Hierarchies

• All Java classes are arranged in a hierarchy– Object is the superclass of all Java classes

• Inheritance and hierarchical organization capture idea:– One thing is a refinement or extension of another

• Benefits of inheritance:– Fundamentally enables reuse

– And modeling flexibility

Page 38: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3815-214

Aside: Inheritance and subtyping

• Inheritance is for code reuse– Write code once and only once

– Superclass features implicitly available in subclass

• Subtyping is for polymorphism– Accessing objects the same way, but getting

different behavior

– Subtype is substitutable for supertype

class A extends B

class A implements Iclass A extends B

Page 39: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

3915-214

Interfaces vs Abstract Classes vs Concrete Classes

• A class can extend 0 or 1 superclass– Called single inheritance

• An interface cannot extend a class at all– (Because it is not a class)

• A class or interface can implement 0 or more interfaces– Closest thing to multiple inheritance

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

AbstractAccount

# balance : float

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

target : Account) : boolean+ monthlyAdjustment()

«interface» CheckingAccount

getFee() : float

“parent” or

“superclass”

“child” or

“subclass”

CheckingAccountImpl

monthlyAdjustment()getFee() : float

Page 40: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4015-214

Multiple Inheritance, Multiple Interfaces, and Delegation

• Multiple inheritance: the ability to extend more than one class

• Multiple inheritance ...

– Is difficult to implement efficiently

Page 41: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4115-214

Multiple Inheritance, Multiple Interfaces, and Delegation

• Multiple inheritance: the ability to extend more than one class

• Multiple inheritance ...

– Is difficult to implement efficiently

Student

String namefloat gpaString majorAddress address

Address getAddress()

Employee

String nameint hoursdouble rateAddress address

Address getAddress()

FullTimeStudent

String namefloat gpaString majorAddress address...

...

FullTimeEmployee

String nameint hoursdouble rateAddress address...

...

StudentWorker

String namefloat gpaString majorint hoursdouble rateAddress address...

...

Illegalsituation

Page 42: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4215-214

Multiple Inheritance, Multiple Interfaces, and Delegation

• Multiple inheritance: the ability to extend more than one class

• Multiple inheritance ...

– Is difficult to implement efficiently

– Can lead to ambiguity:

• If two parents implement the same method, which to use?

– Java does not allow a class to extend more than one class

Page 43: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4315-214

StudentInterface

...

EmployeeInterface

...

FullTimeStudent

...

...

FullTimeEmployee

...

...

StudentWorker

...

...

• A class can implement two or more interfaces

• Multiple interfaces emulate multiple inheritance

Multiple Interfaces can Emulate Multiple Inheritance

Legalsituation

Page 44: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4415-214

StudentInterface

...

EmployeeInterface

...

FullTimeStudent

...

...

FullTimeEmployee

...

...

StudentWorker

...

...

Supporting Reuse Using Delegation

• Reduce “cut and paste polymorphism”: copied code

• Idea: Object of another class does the work

• Delegation: original object delegates to the other

Page 45: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4515-214

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

«interface» CheckingAccount

getFee() : float

«interface» SavingsAccount

getInterestRate() : float

«interface» InterestCheckingAccount

Challenge: Can we get good code reuse without inheritance?

Page 46: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4615-214

Yes! (Reuse via composition and delegation)

«interface» Account

getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : booleanmonthlyAdjustment()

«interface» CheckingAccount

getFee() : float

CheckingAccountImpl

monthlyAdjustment() { … }getFee() : float { … }getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : boolean

BasicAccountImpl

balance : float

monthlyAdjustment()getBalance() : floatdeposit(amount : float)withdraw(amount : float) : booleantransfer(amount : float,

target : Account) : boolean

public class CheckingAccountImpl

implements CheckingAccount {

BasicAccountImpl basicAcct = new(…);

public float getBalance() {

return basicAcct.getBalance();

}

// …

CheckingAccountImpl is composed of a

BasicAccountImpl

-basicAcct

Page 47: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4715-214

JAVA ASIDE: SUPER, THIS, FINAL, INSTANCEOF

Page 48: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4815-214

Java details: extended reuse with super

public abstract class AbstractAccount implements Account {

protected long balance = 0;

public boolean withdraw(long amount) {

// withdraws money from account (code not shown)

}

}

public class ExpensiveCheckingAccountImpl

extends AbstractAccount implements CheckingAccount {

public boolean withdraw(long amount) {

balance -= HUGE_ATM_FEE;

boolean success = super.withdraw(amount)

if (!success)

balance += HUGE_ATM_FEE;

return success;

}

}

Overrides withdraw but also uses the superclass withdraw method

Page 49: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

4915-214

Java details: constructors with this and super

public class CheckingAccountImpl

extends AbstractAccount implements CheckingAccount {

private long fee;

public CheckingAccountImpl(long initialBalance, long fee) {

super(initialBalance);

this.fee = fee;

}

public CheckingAccountImpl(long initialBalance) {

this(initialBalance, 500);

}

/* other methods… */ }Invokes another constructor in this same class

Invokes a constructor of the superclass. Must be the

first statement of the constructor.

Page 50: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5015-214

Java details: final

• A final field: prevents reassignment to the field after initialization

• A final method: prevents overriding the method

• A final class: prevents extending the class

– e.g., public final class CheckingAccountImpl {…}

Page 51: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5115-214

Note: type-casting in Java

• Sometimes you want a different type than you have– e.g., double pi = 3.14;

int indianaPi = (int) pi;

• Useful if you know you have a more specific subtype:– e.g.,

Account acct = …;

CheckingAccount checkingAcct = (CheckingAccount) acct;

long fee = checkingAcct.getFee();

– Will get a ClassCastException if types are incompatible

• Advice: avoid downcasting types– Never(?) downcast within superclass to a subclass

Page 52: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5215-214

Note: instanceof

• Operator that tests whether an object is of a given classpublic void doSomething(Account acct) {

long adj = 0;if (acct instanceof CheckingAccount) {

checkingAcct = (CheckingAccount) acct;adj = checkingAcct.getFee();

} else if (acct instanceof SavingsAccount) {savingsAcct = (SavingsAccount) acct;adj = savingsAcct.getInterest();

}…

}

• Advice: avoid instanceof if possible– Never(?) use instanceof in a superclass to check type against subclass

Warning:This codeis bad.

Page 53: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5315-214

Note: instanceof

• Operator that tests whether an object is of a given classpublic void doSomething(Account acct) {

long adj = 0;if (acct instanceof CheckingAccount) {

checkingAcct = (CheckingAccount) acct;adj = checkingAcct.getFee();

} else if (acct instanceof SavingsAccount) {savingsAcct = (SavingsAccount) acct;adj = savingsAcct.getInterest();

} else if (acct instanceof InterestCheckingAccount) {icAccount = (InterestCheckingAccount) acct;adj = icAccount.getInterest();adj -= icAccount.getFee();

}…

}

Warning:This codeis bad.

Page 54: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5415-214

Avoiding instanceof

public interface Account {

public long getMonthlyAdjustment();

}

public class CheckingAccount implements Account {

public long getMonthlyAdjustment() {

return getFee();

}

}

public class SavingsAccount implements Account {

public long getMonthlyAdjustment() {

return getInterest();

}

}

Page 55: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5515-214

public void doSomething(Account acct) {

float adj = 0.0;

if (acct instanceof CheckingAccount) {

checkingAcct = (CheckingAccount) acct;

adj = checkingAcct.getFee();

} else if (acct instanceof SavingsAccount) {

savingsAcct = (SavingsAccount) acct;

adj = savingsAcct.getInterest();

}

}

Instead:public void doSomething(Account acct) {

long adj = acct.getMonthlyAdjustment();

}

Avoiding instanceof

Page 56: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5615-214

THE TEMPLATE-METHOD DESIGN PATTERN

Page 57: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5715-214

Template method design pattern

• Problem: An algorithm consists of customizable parts and invariant parts

• Solution: Implement the invariant parts of the algorithm in an abstract class, with abstract (unimplemented) primitive operations representing the customizable parts of the algorithm. Subclasses customize the primitive operations

• Consequences

– Code reuse for the invariant parts of algorithm

– Customization is restricted to the primitive operations

– Inverted (Hollywood-style) control for customization: don’t call us, we’ll call you

• Ensures the invariant parts of the algorithm are not changed by subclasses

AbstractClass

TemplateMethod() {final}PrimitiveOperation() {abstract}

ConcreteClass

PrimitiveOperation()

Page 58: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5815-214

The Strategy Design Pattern

Context

Strategyexecute()

ConcreteStrA ConcreteStrB

algorithm()

execute() execute()

Rev

iew

Page 59: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

5915-214

Template method vs. the strategy pattern

• Both support variation in a larger context

• Template method uses inheritance + an overridable method

• Strategy uses an interface and polymorphism (via composition)– Strategy objects are reusable across multiple classes

– Multiple strategy objects are possible per class

Page 60: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6015-214

ASIDE: SPECIFICATION OF CLASS INVARIANTS

60

Page 61: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6115-214

Data Structure Invariants (cf. 122)

struct list {elem data;struct list* next;

};struct queue {

list front;list back;

};

bool is_queue(queue Q) {if (Q == NULL) return false;if (Q->front == NULL || Q->back == NULL) return false;return is_segment(Q->front, Q->back);

}

Page 62: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6215-214

Data Structure Invariants (cf. 122)

• Properties of the Data Structure

• Should always hold before and after method execution

• May be invalidated temporarily during method execution

void enq(queue Q, elem s)//@requires is_queue(Q);//@ensures is_queue(Q);{ … }

Page 63: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6315-214

Class Invariants

• Properties about the fields of an object

• Established by the constructor

• Should always hold before and after execution of public methods

• May be invalidated temporarily during method execution

Page 64: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6415-214

Class Invariants

• Properties about the fields of an object

• Established by the constructor

• Should always hold before and after execution of public methods

• May be invalidated temporarily during method executionpublic class SimpleSet {

int contents[];int size;

//@ ensures sorted(contents);SimpleSet(int capacity) { … }

//@ requires sorted(contents);//@ ensures sorted(contents);boolean add(int i) { … }

//@ requires sorted(contents); //@ ensures sorted(contents);boolean contains(int i) { … }

}

public class SimpleSet {

int contents[];int size;

//@invariant sorted(contents);

SimpleSet(int capacity) { … }

boolean add(int i) { … }

boolean contains(int i) { … }}

Page 65: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6515-214

BEHAVIORAL SUBTYPING

Page 66: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6615-214

Let q(x) be a property provable about objects x of type T. Then q(y)

should be provable for objects y of type S where S is a subtype of T.

Barbara Liskov

• e.g., Compiler-enforced rules in Java:

– Subtypes can add, but not remove methods

– Concrete class must implement all undefined methods

– Overriding method must return same type or subtype

– Overriding method must accept the same parameter types

– Overriding method may not throw additional exceptions

Behavioral subtyping (Liskov Substitution Principle)

Page 67: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6715-214

• e.g., Compiler-enforced rules in Java:

– Subtypes can add, but not remove methods

– Concrete class must implement all undefined methods

– Overriding method must return same type or subtype

– Overriding method must accept the same parameter types

– Overriding method may not throw additional exceptions

• Also applies to specified behavior:

– Same or stronger invariants

– Same or stronger postconditions for all methods

– Same or weaker preconditions for all methods

Let q(x) be a property provable about objects x of type T. Then q(y)

should be provable for objects y of type S where S is a subtype of T.

Barbara Liskov

This is called the LiskovSubstitution Principle.

Behavioral subtyping (Liskov Substitution Principle)

Page 68: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6815-214

Behavioral subtyping in a nutshell

• If Cowboy.draw() overrides Circle.draw() somebody gets hurt!

Page 69: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

6915-214

abstract class Vehicle {

int speed, limit;

//@ invariant speed < limit;

//@ requires speed != 0;

//@ ensures speed < \old(speed)

void brake();

}

class Car extends Vehicle {

int fuel;

boolean engineOn;

//@ invariant speed < limit;

//@ invariant fuel >= 0;

//@ requires fuel > 0 && !engineOn;

//@ ensures engineOn;

void start() { … }

void accelerate() { … }

//@ requires speed != 0;

//@ ensures speed < \old(speed)

void brake() { … }

}

Subclass fulfills the same invariants (and additional ones)

Overridden method has the same pre and postconditions

Behavioral subtyping (Liskov Substitution Principle)

Page 70: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7015-214

class Car extends Vehicle {

int fuel;

boolean engineOn;

//@ invariant fuel >= 0;

//@ requires fuel > 0 && !engineOn;

//@ ensures engineOn;

void start() { … }

void accelerate() { … }

//@ requires speed != 0;

//@ ensures speed < old(speed)

void brake() { … }

}

class Hybrid extends Car {

int charge;

//@ invariant charge >= 0;

//@ requires (charge > 0 || fuel > 0)

&& !engineOn;

//@ ensures engineOn;

void start() { … }

void accelerate() { … }

//@ requires speed != 0;

//@ ensures speed < \old(speed)

//@ ensures charge > \old(charge)

void brake() { … }

}

Subclass fulfills the same invariants (and additional ones)

Overridden method start has weaker precondition

Overridden method brake has stronger postcondition

Behavioral subtyping (Liskov Substitution Principle)

Page 71: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7115-214

class Rectangle {

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//methods

}

class Square extends Rectangle {

Square(int w) {

super(w, w);

}

}

Is this Square a behavioral subtype of Rectangle?

Behavioral subtyping (Liskov Substitution Principle)

Page 72: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7215-214

class Rectangle {

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//methods

}

class Square extends Rectangle {

Square(int w) {

super(w, w);

}

}

Is this Square a behavioral subtype of Rectangle?

(Yes.)

Behavioral subtyping (Liskov Substitution Principle)

Page 73: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7315-214

class Rectangle {

//@ invariant h>0 && w>0;

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//methods

}

class Square extends Rectangle {

//@ invariant h>0 && w>0;

//@ invariant h==w;

Square(int w) {

super(w, w);

}

}

Behavioral subtyping (Liskov Substitution Principle)

Is this Square a behavioral subtype of Rectangle?

Page 74: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7415-214

class Rectangle {

//@ invariant h>0 && w>0;

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//methods

}

class Square extends Rectangle {

//@ invariant h>0 && w>0;

//@ invariant h==w;

Square(int w) {

super(w, w);

}

}

Behavioral subtyping (Liskov Substitution Principle)

Is this Square a behavioral subtype of Rectangle?

(Yes.)

Page 75: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7515-214

class Rectangle {

//@ invariant h>0 && w>0;

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//@ requires factor > 0;

void scale(int factor) {

w=w*factor;

h=h*factor;

}

}

class Square extends Rectangle {

//@ invariant h>0 && w>0;

//@ invariant h==w;

Square(int w) {

super(w, w);

}

}

Is this Square a behavioral subtype of Rectangle?

Behavioral subtyping (Liskov Substitution Principle)

Page 76: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7615-214

class Rectangle {

//@ invariant h>0 && w>0;

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//@ requires factor > 0;

void scale(int factor) {

w=w*factor;

h=h*factor;

}

}

class Square extends Rectangle {

//@ invariant h>0 && w>0;

//@ invariant h==w;

Square(int w) {

super(w, w);

}

}

Is this Square a behavioral subtype of Rectangle?

(Yes.)

Behavioral subtyping (Liskov Substitution Principle)

Page 77: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7715-214

class Rectangle {

//@ invariant h>0 && w>0;

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

//@ requires factor > 0;

void scale(int factor) {

w=w*factor;

h=h*factor;

}

//@ requires neww > 0;

void setWidth(int neww) {

w=neww;

}

}

class Square extends Rectangle {

//@ invariant h>0 && w>0;

//@ invariant h==w;

Square(int w) {

super(w, w);

}

}

Behavioral subtyping (Liskov Substitution Principle)

Is this Square a behavioral subtype of Rectangle?

Page 78: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7815-214

class Rectangle {

//@ invariant h>0 && w>0;

int h, w;

Rectangle(int h, int w) {

this.h=h; this.w=w;

}

void scale(int factor) {

w=w*factor;

h=h*factor;

}

void setWidth(int neww) {

w=neww;

}

}

class Square extends Rectangle {

//@ invariant h>0 && w>0;

//@ invariant h==w;

Square(int w) {

super(w, w);

}

}

Maybe? (If so, it's not a square…)

← Invalidates stronger

invariant (w==h) in subclass

class GraphicProgram {void scaleW(Rectangle r, int factor) {

r.setWidth(r.getWidth() * factor);}

}

Behavioral subtyping (Liskov Substitution Principle)

Page 79: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

7915-214

Summary: Designing reusable classes

• Favor composition over inheritance– Inheritance violates information hiding

• Design and document for inheritance, or prohibit it– Document requirements for overriding any method

• Reusable implementations with simple, clear contracts

• Inheritance for reuse, its pitfalls, and its alternatives

• Liskov's Substitution Principle for behavioral subtyping

Page 80: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

8015-214

PARAMETRIC POLYMORPHISM (GENERICS)

Page 81: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

8115-214

Collection

List SetAbstractCollection

AbstractList

LinkedList

Vector

HashSet

AbstractSequentialList

AbstractSet

Cloneable

ArrayList

Interface

Class

AbstractClass

Recall the Java Collection API (excerpt)

Page 82: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

8215-214

Consider the java.util.Stack

public class Stack {

public void push(Object obj) { … }

public Object pop() { …}

}

• Some possible client code?:Stack stack = new Stack();

String s = “Hello!”;

stack.push(s);

String t = stack.pop();

Page 83: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

8315-214

Consider the java.util.Stack

public class Stack {

public void push(Object obj) { … }

public Object pop() { …}

}

• Some possible client code:Stack stack = new Stack();

String s = “Hello!”;

stack.push(s);

String t = (String) stack.pop();

To fix the type errorwith a downcast (urgs!)

Page 84: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

8415-214

Parametric polymorphism via Java Generics

• Parametric polymorphism is the ability to define a type generically to allow static type-checking without fully specifying types

• The java.util.Stack instead– A stack of some type T:

public class Stack<T> {

public void push(T obj) { … }

public T pop() { … }

}

• Improves typechecking, simplifies(?) client code:Stack<String> stack = new Stack<String>();

String s = “Hello!”;

stack.push(s);

String t = stack.pop();

Page 85: Principles of Software Construction: Objects, Design, and ...ckaestne/15214/s2017/...• All Java classes are arranged in a hierarchy – Objectis the superclass of all Java classes

8515-214

Many Java Generics details

• Can have multiple type parameters– e.g., Map<Integer,String>

• Wildcards– e.g., ArrayList<?> or ArrayList<? extends Animal>

• Subtyping– ArrayList<String> is a subtype of List<String>

– ArrayList<String> is not a subtype of ArrayList<Object>

• Cannot create Generic arraysList<String>[] foo = new List<String>[42]; // won't compile

• Type erasure– Generic type info is compile-time only

• Cannot use instanceof to check generic type

– But shouldn’t use instanceof anyway