Assigning Responsibilities

Similar documents
Principles of Software Construction: Objects, Design, and Concurrency. Assigning Responsibilities to Objects. toad. Jonathan Aldrich Charlie Garrod

Principles of Software Construction: Objects, Design and Concurrency. Object-Oriented Design: Assigning Responsibilities.

Principles of Software Construction: Objects, Design, and Concurrency

Object-Oriented Design

17. GRASP: Designing Objects with Responsibilities

Responsibilities. Using several specific design principles to guide OO design decisions.

ADVANCED SOFTWARE DESIGN LECTURE 7 GRASP

GRASP Design Patterns A.A. 2018/2019

Assigning Responsibilities (Patterns of Responsibility Assignment Principles: GRASP)

Object-Oriented Design

GRASP: Patterns for. chapter18

Software Engineering

Object Analysis & Design in the textbook. Introduction to GRASP: Assigning Responsibilities to Objects. Responsibility-Driven Design

Information Expert (or Expert)

GRASP ing at the First 5 Patterns Principles CSSE 574: Session 3, Part 4

ADVANCED SOFTWARE DESIGN LECTURE 4 GRASP. Dave Clarke

References: Applying UML and patterns Craig Larman

The Strategy Pattern Design Principle: Design Principle: Design Principle:

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 6: Design Patterns

GRASP 2. CSC 440: Software Engineering Slide #1

Keywords: Abstract Factory, Singleton, Factory Method, Prototype, Builder, Composite, Flyweight, Decorator.

Last Time: Object Design. Comp435 Object-Oriented Design. Last Time: Responsibilities. Last Time: Creator. Last Time: The 9 GRASP Patterns

From Design Patterns: Elements of Reusable Object Oriented Software. Read the sections corresponding to patterns covered in the following slides.

Design patterns. Jef De Smedt Beta VZW

Object-Oriented Design

Eliminate enterprise software design instability - protect variations! Nickolay Kofanov

Produced by. Design Patterns. MSc in Communications Software. Eamonn de Leastar

be used for more than one use case (for instance, for use cases Create User and Delete User, one can have one UserController, instead of two separate

Patterns and Testing

An Introduction to Patterns

Assigning Responsibilities by Larman

Design Pattern. CMPSC 487 Lecture 10 Topics: Design Patterns: Elements of Reusable Object-Oriented Software (Gamma, et al.)

CSSE 374: GRASP ing at the First Five Patterns Principles. Shawn Bohner Office: Moench Room F212 Phone: (812)

1 Software Architecture

OODP Session 5a. Web Page: Visiting Hours: Tuesday 17:00 to 19:00

Introduction to Software Engineering (2+1 SWS) Winter Term 2009 / 2010 Dr. Michael Eichberg Vertretungsprofessur Software Engineering Department of

Design Patterns #3. Reid Holmes. Material and some slide content from: - GoF Design Patterns Book - Head First Design Patterns

OODP Session 4. Web Page: Visiting Hours: Tuesday 17:00 to 19:00

COMP 6471 Software Design Methodologies

Software Design Patterns. Background 1. Background 2. Jonathan I. Maletic, Ph.D.

CS 370 Design Heuristics D R. M I C H A E L J. R E A L E F A L L

ADVANCED SOFTWARE DESIGN LECTURE 4 SOFTWARE ARCHITECTURE

Application Architectures, Design Patterns

The Software Design Process. CSCE 315 Programming Studio, Fall 2017 Tanzir Ahmed

Design Pattern What is a Design Pattern? Design Pattern Elements. Almas Ansari Page 1

Think of drawing/diagramming editors. ECE450 Software Engineering II. The problem. The Composite pattern

In this Lecture you will Learn: Design Patterns. Patterns vs. Frameworks. Patterns vs. Frameworks

Object-Oriented Design II - GRASP

2 GRASP Patterns and basic OO Design. Roel Wuyts OASS

Avancier Methods. Very basic design patterns. It is illegal to copy, share or show this document

Design Patterns. An introduction

Design Patterns: Structural and Behavioural

Applying Some Gang of Four Design Patterns CSSE 574: Session 5, Part 3

Produced by. Design Patterns. MSc in Communications Software. Eamonn de Leastar

CSCD01 Engineering Large Software Systems. Design Patterns. Joe Bettridge. Winter With thanks to Anya Tafliovich

Modellistica Medica. Maria Grazia Pia, INFN Genova. Scuola di Specializzazione in Fisica Sanitaria Genova Anno Accademico

Tecniche di Progettazione: Design Patterns

SDC Design patterns GoF

Principles of Software Construction: Objects, Design, and Concurrency

CSE 70 Final Exam Fall 2009

THOMAS LATOZA SWE 621 FALL 2018 DESIGN PATTERNS

Lecture 20: Design Patterns II

A few important patterns and their connections

Plan. A few important patterns and their connections. Singleton. Singleton: class diagram. Singleton Factory method Facade

The Design Patterns Matrix From Analysis to Implementation

2009 Shawn A. Bohner. Shawn Bohner Office: Moench Room F212 Phone: (812)

CS342: Software Design. November 21, 2017

Software Design COSC 4353/6353 D R. R A J S I N G H

Four More GRASP Principles CSSE 574: Session 5, Part 2

Object Relationships

Chapter 8: Class and Method Design

OODP OOAD Session 7a

Modellistica Medica. Maria Grazia Pia, INFN Genova. Scuola di Specializzazione in Fisica Sanitaria Genova Anno Accademico

Object-oriented Software Design Patterns

Relationships amongst Objects

Expanding Our Horizons. CSCI 4448/5448: Object-Oriented Analysis & Design Lecture 9 09/25/2011

Object- Oriented Design with UML and Java Part I: Fundamentals

EINDHOVEN UNIVERSITY OF TECHNOLOGY

18.1 Definitions and General OO Principles

Design Patterns. (and anti-patterns)

COMP 6471 Software Design Methodologies

Object-Oriented Oriented Programming

A Reconnaissance on Design Patterns

Abstraction. Design fundamentals in OO Systems. Fundamental Software Development Principles

Topics in Object-Oriented Design Patterns

CPSC 310 Software Engineering. Lecture 11. Design Patterns

Design Patterns V Structural Design Patterns, 2

Object Oriented. Analysis and Design

On to Object-oriented Design

Design Pattern- Creational pattern 2015

Socket attaches to a Ratchet. 2) Bridge Decouple an abstraction from its implementation so that the two can vary independently.

CS342: Software Design. Oct 9, 2017

Design Patterns Design patterns advantages:

Object-Oriented Design I

CS246 Software Abstraction and Specification Final Examination

What is a Pattern? Lecture 40: Design Patterns. Elements of Design Patterns. What are design patterns?

CSCD01 Engineering Large Software Systems. Design Patterns. Joe Bettridge. Winter With thanks to Anya Tafliovich

Idioms and Design Patterns. Martin Skogevall IDE, Mälardalen University

Review Software Engineering October, 7, Adrian Iftene

Compsci 290/Mobile, Java

Transcription:

Principles of Software Construction: Objects, Design, and Concurrency (Part 2: Designing (Sub-)Systems) Assigning Responsibilities Christian Kästner Bogdan Vasilescu School of Computer Science 1

2 2

Learning Goals Apply GRASP patterns to assign responsibilities in designs Reason about tradeoffs among designs Discuss tradeoffs in terms of coupling and cohesion 3 3

Today s topics Object-Oriented Design: After identifying your requirements and creating a domain model, then add methods to the software classes, and define the messaging between the objects to fulfill the requirements. But how? How should concepts be implemented by classes? What method belongs where? How should the objects interact? This is a critical, important, and non-trivial task 4

Considering the Library problem, which class should know which items have been borrowed by a user? Which should compute late fees? 5 5

Responsibilities Responsibilities are related to the obligations of an object in terms of its behavior. Two types of responsibilities: knowing doing Doing responsibilities of an object include: doing something itself, such as creating an object or doing a calculation initiating action in other objects controlling and coordinating activities in other objects Knowing responsibilities of an object include: knowing about private encapsulated data knowing about related objects knowing about things it can derive or calculate 6

Design Goals, Principles, and Patterns Design Goals Design for change, understanding, reuse, division of labor, Design Principle Low coupling, high cohesion Low representational gap Law of demeter Design Heuristics (GRASP) Information expert Creator Controller 7 7

Goals, Principles, Guidelines Goals X Design Goals Desired quality attributes of software Driven by cost/benefit economics Examples: design for change, understanding, reuse, Design Principles Guidelines for designing software Support one or more design goals Examples: Information hiding, low repr. gap, low coupling, high cohesion, Design Heuristics Rules of thumb for low-level design decisions Promote design principles, and ultimately design goals Example: Creator, Expert, Controller Design Patterns General solutions to recurring design problems Promote design goals, but may add complexity or involve tradeoffs Examples: Decorator, Strategy, Template Method Goals, principles, heuristics, patterns may conflict Use high-level goals of project to resolve Principles Heuristics Patterns 8

GRASP Patterns GRASP = General Responsibility Assignment Software Patterns Patterns of assigning responsibilities reason about design trade-offs when assigning methods and fields to classes The GRASP patterns are a learning aid to help one understand essential object design apply design reasoning in a methodical, rational, explainable way lower level and more local reasoning than most design patterns 9

DESIGN PRINCIPLE: LOW REPRESENTATIONAL GAP 10 10

Problem Space Domain Model inspires objects and names PineTree age size harvest() n 1 Forest Solution Space RangerAgent sanitation(forest) salvage(forest) Object Model 11 11

Designs with Low Representational Gap Create software class for each domain class, create corresponding relationships Design goal: Design for change This is only a starting point! Not all domain classes need software correspondence; pure fabrications might be needed Other principles often more important 12 12

DESIGN PRINCIPLE: LOW COUPLING 13 13

Design Principle: Low Coupling A module should depend on as few other modules as possible Enhances understandability (design for underst.) Limited understanding of context, easier to understand in isolation Reduces the cost of change (design for change) Little context necessary to make changes When a module interface changes, few modules are affected (reduced rippling effects) Enhances reuse (design for reuse) Fewer dependencies, easier to adapt to a new context 14

Topologies with different coupling 15

High Coupling is undesirable Element with low coupling depends on only few other elements (classes, subsystems, ) few" is context-dependent A class with high coupling relies on many other classes Changes in related classes force local changes; changes in local class forces changes in related classes (brittle, rippling effects) Harder to understand in isolation. Harder to reuse because requires additional presence of other dependent classes Difficult to extend changes in many places 16

Which classes are coupled? How can coupling be improved? class Shipment { private List<Box> boxes; int getweight() { int w=0; for (Box box: boxes) for (Item item: box.getitems()) w += item.weight; return w; } class Box { private List<Item> items; Iterable<Item> getitems() { return items;} } class Item { Box containedin; int weight; } 17 17

A different design. How can coupling be improved? class Box { private List<Item> items; private Map<Item,Integer> weights; Iterable<Item> getitems() { return items;} int getweight(item item) { return weights.get(item);} } class Item { private Box containedin; int getweight() { return containedin.getweight(this);} } 18 18

Coupling Example Create a Tree and infest it with beetles Simulation Beetle Tree 19

Coupling Example 20

Coupling Example 21

Coupling Example Second solution has less coupling Simulation does not know about Beetle class 22

Common Forms of Coupling in OO Languages Type X has a field of type Y Method m in type X refers to type Y e.g. a method argument, return value, local variable, or static method call Type X is a direct or indirect subclass of Type Y Type Y is an interface, and Type X implements that interface 23

Low Coupling: Discussion Low Coupling is a principle to keep in mind during all design decisions It is an underlying goal to continually consider. It is an evaluative principle that a designer applies while evaluating all design decisions. Low Coupling supports design of more independent classes; reduces the impact of change. Context-dependent; should be considered together with cohesion and other principles and patterns Prefer coupling to interfaces over coupling to implementations 24

Law of Demeter Each module should have only limited knowledge about other units: only units "closely" related to the current unit In particular: Don t talk to strangers! For instance, no a.getb().getc().foo() for (Item i: shipment.getbox().getitems()) i.getweight() 25

Coupling: Discussion Subclass/superclass coupling is particularly strong protected fields and methods are visible subclass is fragile to many superclass changes, e.g. change in method signatures, added abstract methods Guideline: prefer composition to inheritance, to reduce coupling High coupling to very stable elements is usually not problematic A stable interface is unlikely to change, and likely wellunderstood Prefer coupling to interfaces over coupling to implementations Coupling is one principle among many Consider cohesion, low repr. gap, and other principles 26

Coupling to non-standards Libraries or platforms may include nonstandard features or extensions Example: JavaScript support across Browsers <div id= e1 >old content</div> In JavaScript MSIE: e1.innertext = new content W3Ccompliant DOM standard Firefox: e1.textcontent = new content 27

Design Goals Explain how low coupling supports design for change design for understandability design for division of labor design for reuse 28 28

Design Goals design for change changes easier because fewer dependencies on fewer other objects changes are less likely to have rippling effects design for understandability fewer dependencies to understand (e.g., a.getb().getc().foo()) design for division of labor smaller interfaces, easier to divide design for reuse easier to reuse without complicated dependencies 29 29

GRASP PATTERN: CONTROLLER DESIGN PATTERN: FAÇADE 30 30

Controller (GRASP) Problem: What object receives and coordinates a system operation (event)? Solution: Assign the responsibility to an object representing the overall system, device, or subsystem (façade controller), or a use case scenario within which the system event occurs (use case controller) 31

: Student : System login(id) checkout(bookid) due date logout() receipt 32 32

: Student : System login(id) checkout(bookid) due date logout() CheckoutController login(id: Int) checkout(bid: Int) logout() receipt 33 33

: Student : System login(id) checkout(bookid) due date logout() receipt 34 34

Controller: Discussion A Controller is a coordinator does not do much work itself delegates to other objects Façade controllers suitable when not "too many" system events -> one overall controller for the system Use case controller suitable when façade controller "bloated" with excessive responsibilities (low cohesion, high coupling) -> several smaller controllers for specific tasks Closely related to Façade design pattern (future lecture) 35

Controller: Discussion of Design Goals/Strategies Decrease coupling User interface and domain logic are decoupled from each other Understandability: can understand these in isolation, leading to: Evolvability: both the UI and domain logic are easier to change Both are coupled to the controller, which serves as a mediator, but this coupling is less harmful The controller is a smaller and more stable interface Changes to the domain logic affect the controller, not the UI The UI can be changed without knowing the domain logic design Support reuse Controller serves as an interface to the domain logic Smaller, explicit interfaces support evolvability But, bloated controllers increase coupling and decrease cohesion; split if applicable 36

DESIGN PRINCIPLE: HIGH COHESION (OR SINGLE RESPONSIBILITY PRINCIPLE) 37 37

Design Principle: Cohesion A module should have a small set of related responsibilities Enhances understandability (design for understandability) A small set of responsibilities is easier to understand Enhances reuse (design for reuse) A cohesive set of responsibilities is more likely to recur in another application 38

39

Cohesion in Coupling Example Simulation responsibilities Trigger simulation step based on environment stimulus Coordinate creation of domain objects 40

class DatabaseApplication public void authorizeorder(data data, User currentuser,...){ // check authorization // lock objects for synchronization // validate buffer // log start of operation // perform operation // log end of operation // release lock on objects } public void startshipping(otherdata data, User currentuser,...){ // check authorization // lock objects for synchronization // validate buffer // log start of operation // perform operation // log end of operation // release lock on objects } } 41 41

Anti-Pattern: God Object class Chat { List<String> channels; Map<String, List<Msg>> messages; Map<String, String> accounts; Set<String> bannedusers; File logfile; File bannedwords; URL serveraddress; Map<String, Int> globalsettings; Map<String, Int> usersettings; Map<String, Graphic> smileys; CryptStrategy encryption; Widget sendbutton, messagelist; } 42 42

Anti-Pattern: God Object class Chat { List<String> channels; Map<String, List<Msg>> messages; Map<String, String> accounts; Set<String> bannedusers; File logfile; File bannedwords; URL serveraddress; Map<String, Int> globalsettings; Map<String, Int> usersettings; Map<String, Graphic> smileys; CryptStrategy encryption; Widget sendbutton, messagelist; } class Chat { Content content; AccountMgr accounts; File logfile; ConnectionMgr conns; } class ChatUI { Chat chat; Widget sendbutton, ; } class AccountMgr { acounts, bannedusr } 43 43

Façade vs God Object? 44 44

Cohesion in Graph Implementations class Graph { Node[] nodes; boolean[] isvisited; } class Algorithm { } Graph is tasked with not just data, but also algorithmic responsibilities int shortestpath(graph g, Node n, Node m) { for (int i; ) if (!g.isvisited[i]) { g.isvisited[i] = true; } } return v; } 45

Monopoly Example class Player { Board board; /* in code somewhere */ getsquare(n); Square getsquare(string name) { for (Square s: board.getsquares()) if (s.getname().equals(name)) return s; return null; }} class Player { Board board; /* in code somewhere */ board.getsquare(n); } class Board{ List<Square> squares; Square getsquare(string name) { for (Square s: squares) if (s.getname().equals(name)) return s; return null; }} Which design has higher cohesion? 46

Hints for Identifying Cohesion Use one color per concept Highlight all code of that concept with the color => Classes/ methods should have few colors 47 47

Hints for Identifying Cohesion There is no clear definition of what is a concept Concepts can be split into smaller concepts Graph with search vs. Basic Graph + Search Algorithm vs. Basic Graph + Search Framework + Concrete Search Algorithm etc Requires engineering judgment 48 48

Cohesion: Discussion Very Low Cohesion: A Class is solely responsible for many things in very different functional areas Low Cohesion: A class has sole responsibility for a complex task in one functional area High Cohesion: A class has moderate responsibilities in one functional area and collaborates with classes to fulfil tasks Advantages of high cohesion Classes are easier to maintain Easier to understand Often support low coupling Supports reuse because of fine grained responsibility Rule of thumb: a class with high cohesion has relatively few methods of highly related functionality; does not do too much work 49

Coupling vs Cohesion (Extreme cases) Think about extreme cases: Very low coupling? Very high cohesion? class Graph { Node[] nodes; boolean[] isvisited; } class Algorithm { int shortestpath(graph g, Node n, Node m) { for (int i; ) if (!g.isvisited[i]) { g.isvisited[i] = true; } } return v; 50 } 50

Coupling vs Cohesion (Extreme cases) All code in one class/method very low coupling, but very low cohesion Every statement separated very high cohesion, but very high coupling Find good tradeoff; consider also other principles, e.g., low representational gap 51 51

GRASP PATTERN: INFORMATION EXPERT 52 52

Information Expert (GRASP Pattern/Design Heuristic) Heuristic: Assign a responsibility to the class that has the information necessary to fulfill the responsibility Start assigning responsibilities by clearly stating responsibilities! Typically follows common intuition Software classes instead of Domain Model classes If software classes do not yet exist, look in Domain Model for fitting abstractions (-> correspondence) 53

Which class has all the information to compute the shipment s weight? class Shipment { private List<Box> boxes; int getweight() { int w=0; for (Box box: boxes) for (Item item: box.getitems()) w += item.weight; return w; } class Box { private List<Item> items; Iterable<Item> getitems() { return items;} } class Item { Box containedin; int weight; } 54 54

Who should be responsible for knowing the grand total of a sale? gettotal( )??? Register Sale LineItem Product Decr. 55

Who should be responsible for knowing the grand total of a sale? Sale Captured-on Register time 1 Sales LineItem quantity Contains 1..* * Paid by id Described-by Customer name 1 Product Description description price itemid 56

Who should be responsible for knowing the grand total of a sale? Sale Captured-on Register time 1 Sales LineItem quantity Contains 1..* * Paid by id Described-by Customer name 1 Product Description description price itemid 57

S a le tim e... t = g e tt o ta l 1 * : s t = g e ts u b to ta l lin e Ite m s [ i ] : : S a le S a le s L in e Ite m g e tt o ta l() 1.1 : p := g e tp r ic e () S a le s L in e Ite m q u a n tity :P r o d u c t D e s c r ip tio n g e ts u b to ta l() P r o d u c t D e s c r ip tio n d e s c r ip tio n p r ic e ite m ID N e w m e th o d g e tp r ic e () 58

Information Expert -> "Do It Myself Strategy" Expert usually leads to designs where a software object does those operations that are normally done to the inanimate real-world thing it represents a sale does not tell you its total; it is an inanimate thing In OO design, all software objects are "alive" or "animated," and they can take on responsibilities and do things. They do things related to the information they know. 59

GRASP PATTERN: CREATOR 60 60

Creator (GRASP Pattern/Design Heuristic) Problem: Who creates an A? Solution: Assign class responsibility of creating instance of class A to B if B aggregates A objects B contains A objects B records instances of A objects B closely uses A objects B has the initializing data for creating A objects the more the better; where there is a choice, prefer B aggregates or contains A objects Key idea: Creator needs to keep reference anyway and will frequently use the created object 61

Creator (GRASP) Who is responsible for creating Beetle objects? Tree objects? 62

Creator : Example Who is responsible for creating Beetle objects? Creator pattern suggests Tree Interaction diagram: 63

Creator (GRASP) Problem: Assigning responsibilities for creating objects Who creates Nodes in a Graph? Who creates instances of SalesItem? Who creates Children in a simulation? Who creates Tiles in a Monopoly game? AI? Player? Main class? Board? Meeple (Dog)? 64

Creator: Discussion of Design Goals/Principles Promotes low coupling, high cohesion class responsible for creating objects it needs to reference creating the objects themselves avoids depending on another class to create the object Promotes evolvability (design for change) Object creation is hidden, can be replaced locally Contra: sometimes objects must be created in special ways complex initialization instantiate different classes in different circumstances then cohesion suggests putting creation in a different object see design patterns such as builder, factory method 65

Which design is better? Argue with design goals, principles, heuristics, and patterns that you know * old midterm question 66

Considering the Library problem, which class should know which items have been borrowed by a user? Which should compute late fees? 67 67

Take-Home Messages Design is driven by quality attributes Evolvability, separate development, reuse, performance, Design principles provide guidance on achieving qualities Low coupling, high cohesion, high correspondence, GRASP design heuristics promote these principles Creator, Expert, Controller, 68