October 200391.3913 R. McFadyen1 Polymorphism Indirection Pure Fabrication Protected Variations (Law of Demeter) Ch 22: More GRASP Patterns.

Slides:



Advertisements
Similar presentations
Object-Oriented Analysis and Design CHAPTER 17, 25: GRASP PATTERNS 1.
Advertisements

February R. McFadyen1 Polymorphism Indirection Pure Fabrication Protected Variations (Law of Demeter) More GRASP Patterns.
GRASP The other four What are the first five? What is the goal/purpose of using patterns?
March Ron McFadyen1 Ch 17: Use Case Realizations with GRASP Patterns Assigning responsibilities to objects to achieve user goals Section 17.4.
Oct R McFadyen1 Recall UML Class Diagram BusRoute BusStopList BusStop BusList BusPersonList Person passengers buses busStops waiting 0..*
Feb R. McFadyen1 From the Merriam-Webster’s online dictionary ( Main Entry: an·thro·po·mor·phism Pronunciation: -"fi-z&m Function:
Oct Ron McFadyen1 Ch 17: Use Case Realizations with GRASP Patterns P. 248: “The assignment of responsibilities and design of collaborations.
Object-Oriented Software Engineering Practical Software Development using UML and Java Design Patterns – Part 2 Sources: Chapter 6: Using Design Patterns,
Chapter 25 GRASP: More Objects with Responsibilities 1CS6359 Fall 2011 John Cole.
April 3, R McFadyen1 Recall UML Class Diagram BusRoute BusStopList BusStop BusList BusPersonList Person passengers buses busStops waiting 0..*
March R. McFadyen1 Principle of Least Knowledge – page 265 Principle: talk only to your immediate friends Also called Law of Demeter (LoD)
Fall 2009ACS-3913 R. McFadyen1 Problem: You have a responsibility to assign to a class, but assigning it to a class in the conceptual model causes low.
© 2005 Prentice Hall8-1 Stumpf and Teague Object-Oriented Systems Analysis and Design with UML.
Oct 21, R. McFadyen1 Pure Fabrication P Problem: You have a responsibility to assign to a class, but assigning it to a class in the conceptual.
NJIT More GRASP Patterns Chapter 22 Applying UML and Patterns Craig Larman Prepared By: Krishnendu Banerjee.
February Ron McFadyen1 From the Merriam-Webster’s online dictionary ( Main Entry: an·thro·po·mor·phism Pronunciation: -"fi-z&m.
Chapter 25 More Design Patterns. Polymorphism Issue: Conditional variation –If-then-else or switch statements –New variation or case: Conditional statements.
Fall 2009ACS-3913 R. McFadyen1 Polymorphism Indirection Pure Fabrication Protected Variations (Law of Demeter) More GRASP Patterns.
March R McFadyen1 GoF (Gang of Four): Gamma, Johnson, Helm & Vlissides Book: Design Patterns: Elements of Reusable Object-Oriented Software.
Low Coupling High Cohesion
Fall 2009ACS-3913 R. McFadyen1 Protected Variations Principle: How do you design so that variations in the future do not have an undesirable affect on.
March 6, R. McFadyen1 Pure Fabrication P Problem: You have a responsibility to assign to a class, but assigning it to a class in the.
March R. McFadyen1 Pure Fabrication P Problem: You have a responsibility to assign to a class, but assigning it to a class in the conceptual.
Fall 2009ACS-3913 Ron McFadyen1 From the Merriam-Webster’s online dictionary ( Main Entry: an·thro·po·mor·phism Date: 1753 an interpretation.
Feb 4, Ron McFadyen1 founded on principles of good OO design idea was first put forth by Christopher Alexander (1977) in their work concerning.
Chapter 25 More Design Patterns.
GRASP Principles. How to Design Objects The hard step: moving from analysis to design How to do it? –Design principles (Larman: “patterns”) – an attempt.
Chapter 18 Object Design Examples with GRASP. Objectives Design use case realizations –A use-case realization describes how a particular use case is realized.
Chapter 17. GRASP General Responsibility Assignment Software Patterns (Principles) OOD: after identifying requirements, create domain model, define responsiblities.
1 Chapter 17 GRASP Design Patterns: Designing Objects with Responsibilities.
1 SAD2 - UML 4 th Lecture Class Diagram in Construction Phase Patterns Case Study Lecturer: Dr Dimitrios Makris
SOEN 6011 Software Engineering Processes Section SS Fall 2007 Dr Greg Butler
Software Engineering 1 Object-oriented Analysis and Design Applying UML and Patterns An Introduction to Object-oriented Analysis and Design and Iterative.
Chapter 26 GoF Design Patterns. The Adapter Design Pattern.
SOEN 6011 Software Engineering Processes Section SS Fall 2007 Dr Greg Butler
Chapter 17. Initial Object Design Inputs: requirements meetings various Use Cases – 10% complete Key risks addressed with preliminary programming System.
GRASP: Designing Objects With Responsibilities Chapter 17 Applying UML and Patterns -Craig Larman.
GRASP: Designing Objects With Responsibilities
GoF Design Patterns (Ch. 26). GoF Design Patterns Adapter Factory Singleton Strategy Composite Façade Observer (Publish-Subscribe)
Design Patterns. Patterns “Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution.
COMP 6471 Software Design Methodologies Winter 2006 Dr Greg Butler
Next Gen POS Example GRASP again. Same Patterns Different Example!
CSSE 374: More GRASP’ing for Object Responsibilities
Not only mark-up languages! There are other many other grammar formalisms and tools than XML. Some of them standardized (ASN). Even XML does not always.
Chapter 38 Persistence Framework with Patterns 1CS6359 Fall 2011 John Cole.
IntellAgile Copyright © 2002 Craig Larman. All rights reserved. Object Design and Use- Case Realizations with GRASP Patterns.
OO Methodology Elaboration Iteration 2 - Design Patterns -
Elaboration Iteration 3 – Part 3 - Persistence Framework -
GRASP: Designing Objects With Responsibilities
References: Applying UML and patterns Craig Larman
OO Methodology Elaboration Phase Iteration 1- Part 3.
Design. 2 The Need for Software Blueprints Knowing an object-oriented language and having access to a library is necessary but not sufficient in order.
GRASP: More Patterns for Assigning Responsibilities Presented By Dr. Shazzad Hosain.
Object-Oriented Analysis and Design Week 12, 2009.
Oct 3, Ron McFadyen1 GRASP Patterns 1.Expert 2.Creator 3.Controller 4.Low Coupling 5.High Cohesion.
Elaboration: Iteration 2. Elaboration: Iteration 2 Basics Iteration 1 ends with : All the software has been tested: The idea in the UP is to do early,
Object Design Examples with GRASP
GoF Patterns (GoF) popo.
Conception OBJET GRASP Patterns
DESIGN MODEL: USE-CASE REALIZATIONS WITH GRASP PATTERNS
TK2023 Object-Oriented Software Engineering
Apply Expert, Creator, Controller, Low Coupling, High Cohesion
GoF Design Patterns (Ch. 26). GoF Design Patterns Adapter Factory Singleton Strategy Composite Façade Observer (Publish-Subscribe)
Lecture 21: Crosscutting Aspect-Oriented Programming Background
Chapter 25 GRASP The other four.
GoF Design Patterns (Ch. 26)
SOEN 343 Software Design Computer Science and Software Engineering Department Concordia University Fall 2004 Instructor: Patrice Chalin.
Chapter 25 GRASP The other four.
Next Gen POS Example GRASP again.
GoF Patterns Ch. 26.
Presentation transcript:

October R. McFadyen1 Polymorphism Indirection Pure Fabrication Protected Variations (Law of Demeter) Ch 22: More GRASP Patterns

October R. McFadyen2 Problem: How should we handle alternatives that are based on the class an object belongs to? We want to avoid the use of conditional If-then-Else logic Polymorphism Solution: Use polymorphic operations Methods in different classes are given the same name Different classes may be said to implement the same interface Subclasses in an inheritance hierarchy override method implementation of a superclass

October R. McFadyen3 Text page 326-7: Multiple tax calculators must be supported. Each tax calculator has its behaviour – behaviour varies by type of calculator Polymorphism > ITaxCalculatorAdaptor getTaxes(Sale) : list of TaxLineItems TaxMasterAdaptor getTaxes(Sale) : list of TaxLineItems GoodAsGoldTaxProAdaptor getTaxes(Sale) : list of TaxLineItems The names are the same; the implementations differ

October R. McFadyen4 ITaxCalculatorAdaptor is stereotyped as an interface. An interface is a set of operations – their names and parameters (signature) but no implementation. Implementation is done by the subclasses. Polymorphism > ITaxCalculatorAdaptor getTaxes(Sale) : list of TaxLineItems

October R. McFadyen5 When calculator receives the message getTaxes, the method defined in the class TaxMasterAdaptor is executed Polymorphism calculator:TaxMasterAdaptor getTaxes(aSale) The concept of polymorphism arises in GoF patterns: Adapter, Command, Composite, etc.

October R. McFadyen6 Recall from Composite Component Operation() Leaf Operation() Composite Operation() Other() * Client A leaf or a composite have common operations, but their own implementation

October R. McFadyen7 P Problem: You have a responsibility to assign to a class, but assigning it to a class in the conceptual model causes low coupling and/or high cohesion. Solution: Fabricate a class - create a class that is not found in your conceptual model, one that does not necessarily have a business meaning to the business person. Pure Fabrication The GoF pattern: Adapter uses the concept of pure fabrication.

October R. McFadyen8 Example: Suppose we need to save instances of Sale in a relational database. To which class in the model do you assign this responsibility? Since Sale has the information to be saved, Sale would be suggested by Information Expert. To manage data going to and from a relational database will require a large number of operations … insert, delete, update, select, rollback, commit, buffer management, … Pure Fabrication

October R. McFadyen9 Pure Fabrication The Expert pattern suggests that Sale is the expert, and so should be the class to do this. There’s a lot involved - save, retrieve, commit, rollback - what about LineItems? When you save a Sale do you save LineItems too? We would end up adding a lot to Sale that has nothing to do with Sale-ness … Sale becomes less cohesive and more highly coupled to more non-domain classes. Sale will become much more complex, and not so focused.

October R. McFadyen10 Pure Fabrication Pure Fabrication suggests to create a new class for these new responsibilities PersistentStorage insert() delete() update()... Sale remains well-designed - high cohesion, low coupling PersistentStorage class is relatively cohesive - sole purpose is to store/retrieve objects to/from a relational database PersistentStorage is a fabrication; it is made up from your imagination; it cannot be found in the Domain Model

October R. McFadyen11 Pure Fabrication Example: see pages of Patterns in Java, Volume 2; Mark Grand; John Wiley & Sons Fig 4.13 shows a conceptual model Fig 4.14 shows an initial assignment of responsibilities, where the ServiceManager does scheduling and invoicing. Fig 4.15 shows the fabrication of a new class, InvoiceGenerator, which results in higher cohesion/less coupling.

October R. McFadyen12 System manages a field service organization: Organization sends technicians who install and repair equipment on service calls to other organizations that use the equipment Some service calls are paid by the organization that uses the equipment; equipment vendors pay from some service calls; others are paid for jointly. Service manager is given field service projects for a user organization Service manager is schedules service technicians to perform the tasks Service manager sends invoices for completed tasks to the paying organizations

October R. McFadyen13 UserOrganization PayingOrganization ServiceTechnician ServiceManager FieldServiceProject Note: ServiceManager is highly coupled to other classes Organizes-work-for Install/repair-equipment schedules invoices compute-invoices-for performs pays-for 1..* 0..* * 0..* ServiceTask getPayor(): Patterns in Java, Volume 2 Fig 4.14

October R. McFadyen14 Consider the tasks assigned to the ServiceManager: scheduling tasks scheduling projects scheduling technicians generating invoices These are central to the function of the service manager no reasonable class in the domain to assign this to, so using Pure Fabrication, fabricate a new class for this purpose

October R. McFadyen15 UserOrganization Paying Organization ServiceTechnician ServiceManager FieldServiceProject Organizes-work-for Install/repair-equipment schedules invoices compute-invoices-for performs pays-for 1..* 0..* * 0..* ServiceTask getPayor(): Invoice Generator generateInvoices(): Note: Pure Fabrication preserves low coupling and high cohesion Patterns in Java, Volume 2 Fig 4.15

October R. McFadyen16 Object Design Discussion P Behavioural decomposition Pure Fabrication can support this Classes are determined by behavioural grouping: managing persistent storage generating invoices Representational decomposition Classes represent real things found in the problem domain - clerks use registers to create sales comprising line items … Reduces the representational gap Objects do things that, in the real- world, are done to them. Design of objects divided into two groups:

October R. McFadyen17 Indirection Problem: Classes are highly coupled. How can we assign responsibilities to classes in order to keep coupling low? Solution: Assign responsibilities to an intermediate class Later on, we discuss GoF patterns: Adapter, Façade, and Observer. These incorporate the concept of Indirection

October R. McFadyen18 Indirection Figure 22.3: Objects send messages to the real tax calculators through an intermediary object (an adapter object) s:Sale:TaxMasterAdapter > : TaxMaster taxes := getTaxes( s ) t := getTotal()

October R. McFadyen19 Protected Variations P Problem: How do we design systems so that changes in its elements do not have an unfavourable impact on other elements? Solution: Identify points of predicted variation/instability and assign responsibilities to create a stable interface around them Example: Law of Demeter (LoD) Special case of this pattern. (p ) If objects traverse long object structure paths and send messages to distant, indirect (stranger) objects, the system is fragile with respect to changes in the object structures - a common point of instability in systems. LoD helps us avoid creating such designs

October R. McFadyen20 Law of Demeter Also called Don’t Talk to Strangers Each class should only use a limited set of other classes: only units “closely” related to the current unit. “Each class should only talk (send messages) to its friends.” “Don’t talk to strangers.”

October R. McFadyen21 Law of Demeter Don’t Talk to Strangers places constraints on what objects you should send messages to within a method. Within a method, messages should only be sent to the following objects: the this object (or self) a parameter of the method an attribute of this an element of a collection which is an attribute of this an object created within the method

October R. McFadyen22 Law of Demeter FRIENDS

October R. McFadyen23 Don’t Talk to Strangers PaymentRegisterSale getTenderedAmount() paymentAmount() endSale() enterItem() makePayment()... becomeComplete() makeLineItem() makePayment() getTotal() getPayment... The class diagram shows that Register knows about Sale, and Sale knows about Payments that have been made towards it add a method to get a payment Suppose Register needs to find out the amount of the payment

October R. McFadyen24 Don’t Talk to Strangers Assume: Register has a paymentAmount method which returns the current amount tendered for the payment Sale has a method, getPayment, which returns the Payment instance associated with the Sale Consider: In order to return the payment amount, we could have a paymentAmount method in Register such as: public void paymentAmount() { Payment payment = sale.getPayment() Money amount = payment. getTenderedAmount () } A little different from the text’s example

October R. McFadyen25 Don’t Talk to Strangers :Payment :Register:Sale The previous has messages: Register will have a dependency on Payment This increases the coupling in our system getPayment() getTenderedAmount ()

October R. McFadyen26 Don’t Talk to Strangers :Payment :Register:Sale If getPayment() in Sale would invoke getTenderedAmount() in Payment, and return the payment amount, then we can de- couple Register from Payment make the solution more robust, less sensitive to changes, less coupling Register will get the payment amount it is after, but it won’t know how it was obtained - see Parnas’ concept of information hiding on page 339 Objects are only sending messages to their friends getTenderedAmount () getPayment()

October R. McFadyen27 Law of Demeter presentation: Karl J. Lieberherr; Northeastern University other resources Article on Information hiding

October R. McFadyen28 Example: Applying LoD as system changes BusRoute BusStopList BusStop BusList BusPersonList Person passengers buses busStops waiting 0..*

October R. McFadyen29 BusRoute BusStopList BusStop BusList BusPersonList Person passengers buses busStops waiting 0..* Find all persons waiting at any bus stop on a bus route Collaborating classes:

October R. McFadyen30 class BusRoute { BusStopList busstops; void printWaitingPassengers () { busstops->printWaitingPassengers (); } } class BusStopList { BusStop stops[]; void printWaitingPassengers () { for (int i = 0; i < stops.length; i++) stops[i].printWaitingPassengers (); } Applying Law of Demeter - Partial Java Solution

October R. McFadyen31 class BusStop { PersonList waiting; void printWaitingPassengers () { waiting.print (); } } class PersonList { Person people[]; void print () { for (int i = 0; i < people.length; i++) people[i].print (); } } class Person { String name; void print () { System.stdout.println (name); } } Applying Law of Demeter - Partial Java Solution

October R. McFadyen32 BusRoute BusStopList BusStop BusList BusPersonList Person passengers buses busStops waiting 0..* Suppose the class model is modified to incorporate Villages. VillageList Village villages 0..* What software changes are needed and still adhere to LoD?