Top Banner
2. Object-Oriented Design Principles
50

2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap Motivation: stability in the face of change Model domain objects Model responsibilities.

Dec 22, 2015

Download

Documents

Erick Mitchell
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

2. Object-Oriented Design Principles

Page 2: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 2

Roadmap

> Motivation: stability in the face of change> Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 3: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 3

Roadmap

> Motivation: stability in the face of change> Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 4: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Motivation

© Oscar Nierstrasz

OO Design Principles

4

The law of continuing change: A large program that is used undergoes continuing change or becomes progressively less useful. The change process continues until it is judged more cost-effective to replace the system with a recreated version.

— Lehman and Belady, 1985

The law of continuing change: A large program that is used undergoes continuing change or becomes progressively less useful. The change process continues until it is judged more cost-effective to replace the system with a recreated version.

— Lehman and Belady, 1985

Page 5: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

What should design optimize?

© Oscar Nierstrasz

OO Design Principles

5

Enable small, incremental changes by designing software around stable abstractions and interchangeable parts.Enable small, incremental changes by designing software around stable abstractions and interchangeable parts.

Page 6: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

How do we find the “right” design?

© Oscar Nierstrasz

OO Design Principles

6

Object-oriented design is an iterative and exploratory processObject-oriented design is an iterative and exploratory process

Don’t worry if your initial design is ugly.If you apply the OO design principles consistently, your final design will be beautiful!

Page 7: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz

OO Design Principles

7

Running Example: Snakes and Ladders

http://en.wikipedia.org/wiki/Snakes_and_ladders

Page 8: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Game rules

> Players— Snakes and Ladders is played by two to four players, each with her own token

to move around the board.

> Moving— Players roll a die or spin a spinner, then move the designated number of

spaces, between one and six. Once they land on a space, they have to perform any action designated by the space.

> Ladders— If the space a player lands on is at the bottom of a ladder, he should climb the

ladder, which brings him to a space higher on the board.

> Snakes— If the space a player lands on is at the top of a snake, she must slide down to

the bottom of it, landing on a space closer to the beginning.

> Winning— The winner is the player who gets to the last space on the board first,

whether by landing on it from a roll, or by reaching it with a ladder.

© Oscar Nierstrasz

OO Design Principles

8http://www.ehow.com/facts_5163203_snakes-amp-ladders-rules.html

Page 9: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Variations

> A player who lands on an occupied square must go back to the start square.

> If you roll a number higher than the number of squares needs to reach the last square, you must continue moving backwards.

> …

© Oscar Nierstrasz

OO Design Principles

9

Page 10: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 10

Roadmap

> Motivation: stability in the face of change > Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 11: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Programming is modeling

© Oscar Nierstrasz

OO Design Principles

11

Players

Game Board

Start Square

Square End SquareSnake

Die

Ladder

Model domain objectsModel domain objects

What about roll, action, winner … ?

Page 12: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Everything is an object

© Oscar Nierstrasz

OO Design Principles

12

Every domain concept that plays a role in the application and assumes a responsibility is a potential object in the software design

Every domain concept that plays a role in the application and assumes a responsibility is a potential object in the software design

“Winner” is just a state of a player — it has no responsibility of its own.“Winner” is just a state of a player — it has no responsibility of its own.

Page 13: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Computation is simulation

© Oscar Nierstrasz

OO Design Principles

13

“Instead of a bit-grinding processor … plundering data structures, we have a universe of well-behaved objects that courteously ask each other to carry out their various desires.”

— Ingalls 1981

“Instead of a bit-grinding processor … plundering data structures, we have a universe of well-behaved objects that courteously ask each other to carry out their various desires.”

— Ingalls 1981

Page 14: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Model specialization

© Oscar Nierstrasz

OO Design Principles

14

The first square is a kind of square, so model it as such

Is a snake a kind of reverse ladder?Is a snake a kind of reverse ladder?

Page 15: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 15

Roadmap

> Motivation: stability in the face of change> Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 16: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Responsibility-Driven Design

© Oscar Nierstrasz

OO Design Principles

16

• What actions is this object responsible for?• What information does this object share?• What actions is this object responsible for?• What information does this object share?

Well-designed objects have clear responsibilitiesWell-designed objects have clear responsibilities

Drive design by asking:

Responsibility-driven design ... minimizes the rework required for major design changes.

— Wirfs-Brock, 1989

Responsibility-driven design ... minimizes the rework required for major design changes.

— Wirfs-Brock, 1989

Page 17: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Snakes and Ladders responsibilities

© Oscar Nierstrasz

OO Design Principles

17

Die•provides a random number from 1 to 6

Die•provides a random number from 1 to 6

Game•keeps track of the game state

Game•keeps track of the game state

Player•keeps track of where it is•moves over squares of the board

Player•keeps track of where it is•moves over squares of the board

Square•keeps track of any player on it

Square•keeps track of any player on it

First Square•can hold multiple players

First Square•can hold multiple players Last Square

•knows it is the winning squareLast Square

•knows it is the winning squareSnake

•sends a player back to an earlier square

Snake•sends a player back to an earlier square

Ladder•sends a player ahead to a later square

Ladder•sends a player ahead to a later square

Page 18: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

The Single Responsibility Principle

© Oscar Nierstrasz

OO Design Principles

18

http://en.wikipedia.org/wiki/Single_responsibility_principle

An object should have no more than one key responsibility.An object should have no more than one key responsibility.

If an object has several, unrelated responsibilities, then you are missing objects in your design!If an object has several, unrelated responsibilities, then you are missing objects in your design!

The different kinds of squares have separate responsibilities, so they must belong to separate classes!

Page 19: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Top-down decomposition

© Oscar Nierstrasz

OO Design Principles

19

Use concrete scenarios to drive interface designUse concrete scenarios to drive interface design

http://en.wikipedia.org/wiki/Top-down_and_bottom-up_design

jack = new Player("Jack");jill = new Player("Jill");Player[] args = { jack, jill };Game game = new Game(12, args);game.setSquareToLadder(2, 4);game.setSquareToLadder(7, 2);game.setSquareToSnake(11, -6);assertTrue(game.notOver());assertTrue(game.firstSquare().isOccupied());assertEquals(1, jack.position());assertEquals(1, jill.position());assertEquals(jack, game.currentPlayer());

jack = new Player("Jack");jill = new Player("Jill");Player[] args = { jack, jill };Game game = new Game(12, args);game.setSquareToLadder(2, 4);game.setSquareToLadder(7, 2);game.setSquareToSnake(11, -6);assertTrue(game.notOver());assertTrue(game.firstSquare().isOccupied());assertEquals(1, jack.position());assertEquals(1, jill.position());assertEquals(jack, game.currentPlayer());

game.movePlayer(4);assertTrue(game.notOver());assertEquals(5, jack.position());assertEquals(1, jill.position());assertEquals(jill, game.currentPlayer());

game.movePlayer(4);assertTrue(game.notOver());assertEquals(5, jack.position());assertEquals(1, jill.position());assertEquals(jill, game.currentPlayer());

Page 20: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Jack makes a move

© Oscar Nierstrasz

OO Design Principles

20

Page 21: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 21

Roadmap

> Motivation: stability in the face of change > Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 22: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Separate interface and implementation

© Oscar Nierstrasz

OO Design Principles

22

Information hiding: a component should provide all and only the information that the user needs to effectively use it.Information hiding: a component should provide all and

only the information that the user needs to effectively use it.

http://en.wikipedia.org/wiki/Information_hiding

Information hiding protects both the provider and the client from changes in the implementation.Information hiding protects both the provider and the client from changes in the implementation.

Page 23: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Abstraction, Information Hiding and Encapsulation

© Oscar Nierstrasz

OO Design Principles

23

Abstraction = elimination of inessential detailAbstraction = elimination of inessential detail

Encapsulation = bundling operations to access related data as a data abstractionEncapsulation = bundling operations to

access related data as a data abstraction

Information hiding = providing only the information a client needs to know

Information hiding = providing only the information a client needs to know

In object-oriented languages we can implement data abstractions as classes.

Page 24: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Encapsulate state

© Oscar Nierstrasz

OO Design Principles

24

public class Game {private List<ISquare> squares;private int size;private Queue<Player> players;private Player winner;...

}

public class Game {private List<ISquare> squares;private int size;private Queue<Player> players;private Player winner;...

}

Don't let anyone else play with you.

— Joseph Pelrine

Don't let anyone else play with you.

— Joseph Pelrine

public class Player {private String name;private ISquare square;...

}

public class Player {private String name;private ISquare square;...

}public class Square implements ISquare {protected int position;protected Game game;private Player player;...

}

public class Square implements ISquare {protected int position;protected Game game;private Player player;...

}

Page 25: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Keep behaviour close to state

© Oscar Nierstrasz

OO Design Principles

25

public class Square implements ISquare {private Player player;

public boolean isOccupied() {return player != null;

}

public void enter(Player player) {this.player = player;

}

public void leave(Player _) {this.player = null;

}...

}

public class Square implements ISquare {private Player player;

public boolean isOccupied() {return player != null;

}

public void enter(Player player) {this.player = player;

}

public void leave(Player _) {this.player = null;

}...

}

Page 26: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Program to an interface, not an implementation

© Oscar Nierstrasz

OO Design Principles

26

public interface ISquare {public int position();public ISquare moveAndLand(int moves);public boolean isFirstSquare();public boolean isLastSquare();public void enter(Player player);public void leave(Player player);public boolean isOccupied();public ISquare landHereOrGoHome();

}

public interface ISquare {public int position();public ISquare moveAndLand(int moves);public boolean isFirstSquare();public boolean isLastSquare();public void enter(Player player);public void leave(Player player);public boolean isOccupied();public ISquare landHereOrGoHome();

}

public class Player {private ISquare square;public void moveForward(int moves) {square.leave(this);square = square.moveAndLand(moves);square.enter(this);

} ...}

public class Player {private ISquare square;public void moveForward(int moves) {square.leave(this);square = square.moveAndLand(moves);square.enter(this);

} ...}

Depend on interfaces, not

concrete classes

Depend on interfaces, not

concrete classes

Players do not need to know all the different kinds of squares …

Players do not need to know all the different kinds of squares …

Page 27: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Aside: Messages and methods

© Oscar Nierstrasz

OO Design Principles

27

Objects send messages to one another; they don’t “call methods”Objects send messages to one another; they don’t “call methods”

public class Square implements ISquare {private Player player;

public void enter(Player player) {this.player = player;

}...

}

public class Square implements ISquare {private Player player;

public void enter(Player player) {this.player = player;

}...

} public class FirstSquare extends Square {private List<Player> players;

public void enter(Player player) {players.add(player);

}...

}

public class FirstSquare extends Square {private List<Player> players;

public void enter(Player player) {players.add(player);

}...

}

Clients should not care what kind of square they occupy

Clients should not care what kind of square they occupy

Page 28: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

public class Square implements ISquare {public ISquare moveAndLand(int moves) {return game.findSquare(position, moves).landHereOrGoHome();}public ISquare landHereOrGoHome() {return this.isOccupied() ? game.firstSquare() : this ;}...}

public class Square implements ISquare {public ISquare moveAndLand(int moves) {return game.findSquare(position, moves).landHereOrGoHome();}public ISquare landHereOrGoHome() {return this.isOccupied() ? game.firstSquare() : this ;}...}

The Open-Closed Principle

© Oscar Nierstrasz

OO Design Principles

28

public class Ladder extends Square {public ISquare landHereOrGoHome() {return this.destination().landHereOrGoHome();

}protected ISquare destination() {return game.getSquare(position+transport);

}...

}

public class Ladder extends Square {public ISquare landHereOrGoHome() {return this.destination().landHereOrGoHome();

}protected ISquare destination() {return game.getSquare(position+transport);

}...

}

Make software entities open for extension but

closed for modifications.

Make software entities open for extension but

closed for modifications.

http://en.wikipedia.org/wiki/Open/closed_principle

Page 29: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Why are data abstractions important?

Communication — Declarative Programming> Data abstractions …

— State what a client needs to know, and no more!— State what you want to do, not how to do it!— Directly model your problem domain

Software Quality and Evolution> Data abstractions …

— Decompose a system into manageable parts— Protect clients from changes in implementation— Encapsulate client/server contracts— Can extend their interfaces without affecting clients— Allow new implementations to be added transparently to a system

© Oscar Nierstrasz

OO Design Principles

29

Page 30: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 30

Roadmap

> Motivation: stability in the face of change > Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 31: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Delegate responsibility

© Oscar Nierstrasz

OO Design Principles

31

Responsibility implies non-interference.

— Timothy Budd

Responsibility implies non-interference.

— Timothy Budd

“Don’t do anything you can push off to someone else.”

— Joseph Pelrine

“Don’t do anything you can push off to someone else.”

— Joseph Pelrine

public class Player {public void moveForward(int moves) {square.leave(this);square = square.moveAndLand(moves);square.enter(this);

}...

}

public class Player {public void moveForward(int moves) {square.leave(this);square = square.moveAndLand(moves);square.enter(this);

}...

}public class Square implements ISquare {public ISquare moveAndLand(int moves) {return game.findSquare(position, moves)

.landHereOrGoHome();}...

}

public class Square implements ISquare {public ISquare moveAndLand(int moves) {return game.findSquare(position, moves)

.landHereOrGoHome();}...

}public class Game {public ISquare findSquare(...) {...return this.getSquare(target);

}...

}

public class Game {public ISquare findSquare(...) {...return this.getSquare(target);

}...

}

Page 32: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Lots of short methods

© Oscar Nierstrasz

OO Design Principles

32

http://c2.com/cgi/wiki?LotsOfShortMethods

Once and only once“In a program written with good style, everything is said once and only once.”

Lots of little pieces“Good code invariably has small methods and small objects. Only by factoring the system into many small pieces of state and function can you hope to satisfy the ‘once and only once’ rule.”

Once and only once“In a program written with good style, everything is said once and only once.”

Lots of little pieces“Good code invariably has small methods and small objects. Only by factoring the system into many small pieces of state and function can you hope to satisfy the ‘once and only once’ rule.”

Page 33: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Composed Method

© Oscar Nierstrasz

OO Design Principles

33

• Keep all of the operations in a method at the same level of abstraction.

• This will naturally result in programs with many small methods, each a few lines long.

• Keep all of the operations in a method at the same level of abstraction.

• This will naturally result in programs with many small methods, each a few lines long.

Divide your program into methods that perform one identifiable task.Divide your program into methods that perform one identifiable task.

Page 34: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Maintain a consistent level of abstraction …

© Oscar Nierstrasz

OO Design Principles

34

public class Game {public void play(Die die) {System.out.println("Initial state: " + this);while (this.notOver()) {int roll = die.roll();System.out.println(this.currentPlayer()+ " rolls " + roll + ": " + this);

this.movePlayer(roll);}System.out.println("Final state: " + this);System.out.println(this.winner() + " wins!");

}...

public class Game {public void play(Die die) {System.out.println("Initial state: " + this);while (this.notOver()) {int roll = die.roll();System.out.println(this.currentPlayer()+ " rolls " + roll + ": " + this);

this.movePlayer(roll);}System.out.println("Final state: " + this);System.out.println(this.winner() + " wins!");

}...

Page 35: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

… to obtain many small methods

© Oscar Nierstrasz

OO Design Principles

35

public boolean notOver() {return winner == null;

}

public boolean notOver() {return winner == null;

}

public Player currentPlayer() {return players.peek();

}

public Player currentPlayer() {return players.peek();

}

public void movePlayer(int roll) {Player currentPlayer = players.remove(); // from front of queuecurrentPlayer.moveForward(roll);players.add(currentPlayer); // to

back of the queueif (currentPlayer.wins()) {winner = currentPlayer;

}}

public void movePlayer(int roll) {Player currentPlayer = players.remove(); // from front of queuecurrentPlayer.moveForward(roll);players.add(currentPlayer); // to

back of the queueif (currentPlayer.wins()) {winner = currentPlayer;

}}

public Player winner() {return winner;

}

public Player winner() {return winner;

}

Page 36: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

… and simple classes

© Oscar Nierstrasz

OO Design Principles

36

public class Die {static final int MIN = 1;static final int MAX = 6;

public int roll() {return this.random(MIN,MAX);

}

public int random(int min, int max) {int result = (int) (min + Math.floor((max-min) * Math.random()));return result;

}}

public class Die {static final int MIN = 1;static final int MAX = 6;

public int roll() {return this.random(MIN,MAX);

}

public int random(int min, int max) {int result = (int) (min + Math.floor((max-min) * Math.random()));return result;

}}

Page 37: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz

OO Design Principles

37

Snakes and Ladders methods

• 76 methods• Most are 1 or 2 LOC• Average 3.2 LOC• All methods > 5 LOC

are tests or algorithms

• 76 methods• Most are 1 or 2 LOC• Average 3.2 LOC• All methods > 5 LOC

are tests or algorithms

Page 38: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Design by Contract = Don't accept anybody else's garbage!

© Oscar Nierstrasz

OO Design Principles

38

public class Game {public void movePlayer(int roll) {assert roll>=1 && roll<=6;...

}...

}

public class Game {public void movePlayer(int roll) {assert roll>=1 && roll<=6;...

}...

}

public class Player {public void moveForward(int moves) {assert moves > 0;...

}...

}

public class Player {public void moveForward(int moves) {assert moves > 0;...

}...

}

public class Square implements ISquare {public ISquare moveAndLand(int moves) {assert moves >= 0;...

}...

}

public class Square implements ISquare {public ISquare moveAndLand(int moves) {assert moves >= 0;...

}...

}

More on this in the following lectureMore on this in the following lecture

http://en.wikipedia.org/wiki/Design_by_contract

Page 39: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Demo

© Oscar Nierstrasz

OO Design Principles

39

public static void main(String args[]) {(new SimpleGameTest()).newGame().play(new Die());

}

public static void main(String args[]) {(new SimpleGameTest()).newGame().play(new Die());

}

Page 40: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 40

Roadmap

> Motivation: stability in the face of change > Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 41: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

?!

Program declaratively

© Oscar Nierstrasz

OO Design Principles

41

Name objects and methods so that code documents itselfName objects and methods so that code documents itself

public class Player {public void joinGame(Game game) {square = game.getSquare(1);((FirstSquare) square).players().add(this);

}...

}

public class Player {public void joinGame(Game game) {square = game.getSquare(1);((FirstSquare) square).players().add(this);

}...

} public class Player {public void joinGame(Game game) {square = game.firstSquare();square.enter(this);

}...

}

public class Player {public void joinGame(Game game) {square = game.firstSquare();square.enter(this);

}...

}

Page 42: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Role Suggesting Instance Variable Name

© Oscar Nierstrasz

OO Design Principles

42

Name instance variables for the role they play in the computation.Name instance variables for the

role they play in the computation.

Make the name plural if the variable will hold a collection.Make the name plural if the variable will hold a collection.

public class Game {private List<ISquare> squares;private int size;private Queue<Player> players;private Player winner;...

}

public class Game {private List<ISquare> squares;private int size;private Queue<Player> players;private Player winner;...

}

Page 43: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Intention Revealing Method Name

© Oscar Nierstrasz

OO Design Principles

43

public class Player {public void moveForward(int moves) {...square.enter(this);

}...

}

public class Player {public void moveForward(int moves) {...square.enter(this);

}...

}

public class Square implements ISquare {private Player player;public void enter(Player player) {this.player = player;

}...

}

public class Square implements ISquare {private Player player;public void enter(Player player) {this.player = player;

}...

}public class FirstSquare extends Square {private List<Player> players;public void enter(Player player) {players.add(player);

}...

}

public class FirstSquare extends Square {private List<Player> players;public void enter(Player player) {players.add(player);

}...

}

Name methods after what they accomplish, not how.Name methods after what they accomplish, not how.

Page 44: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 44

Roadmap

> Motivation: stability in the face of change > Model domain objects> Model responsibilities> Separate interface and implementation> Delegate responsibility> Let the code talk> Recognize Code Smells

OO Design Principles

Page 45: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

The Law of Demeter: “Do not talk to strangers”

© Oscar Nierstrasz

OO Design Principles

45en.wikipedia.org/wiki/Law_Of_Demeter

Don’t send messages to objects returned from other message sends

Don’t send messages to objects returned from other message sends

public void movePlayer(int roll) {...if (currentPlayer.square().isLastSquare()) {winner = currentPlayer;

}}

public void movePlayer(int roll) {...if (currentPlayer.square().isLastSquare()) {winner = currentPlayer;

}}

public void movePlayer(int roll) {...if (currentPlayer.wins()) {winner = currentPlayer;

}}

public void movePlayer(int roll) {...if (currentPlayer.wins()) {winner = currentPlayer;

}}

Tell, don't askTell, don't ask

Page 46: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Be sensitive to Code Smells

> Duplicated Code— Missing inheritance or delegation

> Long Method— Inadequate decomposition

> Large Class / God Class— Too many responsibilities

> Long Parameter List— Object is missing

> Feature Envy— Method needing too much information from another object

> Data Classes— Only accessors

© Oscar Nierstrasz

OO Design Principles

46http://en.wikipedia.org/wiki/Code_smell

Page 47: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

Conclusions and outlook

> Use responsibility-driven design to stabilize domain concepts> Delegate responsibility to achieve simple, flexible designs

> Specify contracts to protect your data abstractions— Design by Contract lecture

> Express your assumptions as tests to tell what works and doesn’t— Testing Framework lecture

> Develop iteratively and incrementally to allow design to emerge— Iterative Development lecture

> Encode specialization hierarchies using inheritance— Inheritance lecture

© Oscar Nierstrasz

OO Design Principles

47

Page 48: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 48

What you should know!

Why does software change? Why should software model domain concepts? What is responsibility-driven design? How do scenarios help us to design interfaces? What is the difference between abstraction,

encapsulation and information hiding? Can you explain the Open-Closed principle? How can delegation help you write declarative code? How should you name methods and instance variables?

Safety Patterns

Page 49: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz 49

Can you answer these questions?

How do you identify responsibilities? How can we use inheritance to model the relationship

between Snakes and Ladders? How can we tell if an object has too many

responsibilities? Is top-down design better than bottom-up design? Why should methods be short? How does the Law of Demeter help you to write flexible

software? Why do “God classes” and Data classes often occur

together?

Safety Patterns

Page 50: 2. Object-Oriented Design Principles. © Oscar Nierstrasz 2 Roadmap  Motivation: stability in the face of change  Model domain objects  Model responsibilities.

© Oscar Nierstrasz

OO Design Principles

50

Attribution-ShareAlike 3.0 UnportedYou are free:

to Share — to copy, distribute and transmit the workto Remix — to adapt the work

Under the following conditions:Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license.

For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page.

Any of the above conditions can be waived if you get permission from the copyright holder.Nothing in this license impairs or restricts the author's moral rights.

License

http://creativecommons.org/licenses/by-sa/3.0/