March Ron McFadyen1 Ch 17: Use Case Realizations with GRASP Patterns Assigning responsibilities to objects to achieve user goals Section 17.4 makeNewSale Section 17.5 enterItem Section 17.6 endSale Section 17.7 makePayment Section 17.8 Start Up You should review these sections
March Ron McFadyen2 Ch 17: Use Case Realizations with GRASP Patterns Who/What is going to be responsible for : Handling the system operation makeNewSale? Creating a Sale? Who/What should create the container of SalesLineItems? Handling the System operation enterItem? Creating a Saleslineitem? Finding a match for a product specification? For doing a lookup? Handling the system operation endSale? Setting the isComplete attribute of Sale to true? Calculating the sale total? Calculating the SalesLineItem subtotal? Providing the ProductSpecification price? Handling the system operation makePayment? Creating a Payment instance? ………. Which GRASP pattern justified the decision?
March Ron McFadyen3 Ch 17: Use Case Realizations with GRASP Patterns Section 17.4 makeNewSale 1 st concern: who/what is going to be responsible for handling the system operation makeNewSale? Decision: Using the Controller Pattern … since there aren’t very many system operations and since Register (in our domain) represents the overall system, we choose Register as a “façade” controller.
March Ron McFadyen4 Ch 17: Use Case Realizations with GRASP Patterns By “Controller”, Register is our “façade” controller. makeNewSale() :Register
March Ron McFadyen5 Ch 17: Use Case Realizations with GRASP Patterns Page 314 public class Register {… public makeNewSale() { … } We have just decided that Register must have a method makeNewSale
March Ron McFadyen6 Ch 17: Use Case Realizations with GRASP Patterns 2 nd concern: who/what is going to be responsible for creating a Sale? Should Register delegate the responsibility or …? Since Register (in the domain) actually records a Sale then, by “Creator”, we decide that Register will do this. Register has the data and it needs to keep track of a Sale, so …
March Ron McFadyen7 Ch 17: Use Case Realizations with GRASP Patterns By “Creator”, Register creates a Sale. makeNewSale() :Register create() :Sale
March Ron McFadyen8 Ch 17: Use Case Realizations with GRASP Patterns Page 314 public class Register {… Private Sale sale; … public makeNewSale() { sale = new Sale(); } The method makeNewSale creates the sale object
March Ron McFadyen9 Ch 17: Use Case Realizations with GRASP Patterns 3 rd concern: Sale needs to know of its SalesLineItems. A container for these is required. Who/What should create this? Since Sale will contain the lines, by “Creator”, we decide that Sale will do this…
March Ron McFadyen10 Ch 17: Use Case Realizations with GRASP Patterns By “Creator”, Register creates a Sale. makeNewSale() :Register create() :Sale create() : :SalesLineItem
March Ron McFadyen11 Ch 17: Use Case Realizations with GRASP Patterns Page 315 public class Sale {private List lineItems = new ArrayList(); private Date date = new Date(); private boolean isComplete = false; private Payment payment; … The constructor for Sale creates the container for the line items
March Ron McFadyen12 Ch 17: Use Case Realizations with GRASP Patterns Section 17.5 enterItem 1 st concern: who/what is going to be responsible for handling the system operation enterItem? We continue using the Controller Pattern … Register is responsible for handling enterItem.
March Ron McFadyen13 Ch 17: Use Case Realizations with GRASP Patterns Contract for enteritem specifies Preconditions: A Sale is underway Postconditions: salesLineItem is created It is associated with the current Sale Its quantity is set It is associated with a ProductSpecification By Creator, Sale can do this Sale stores the new sales line item in its collection The product specification will need to be found
March Ron McFadyen14 Ch 17: Use Case Realizations with GRASP Patterns enterItem() :Register:Sale : :SalesLineItem 2:makeLineItem() 2.1:create() 2.2:add() Message 2 … see later slide
March Ron McFadyen15 Ch 17: Use Case Realizations with GRASP Patterns Page 315 public class Sale {… public void makeLineItem (…, …) { lineItems.add ( new SalesLineItem (…, …) ) ; } The “add” message sent to the multiobject The “create” message for a new sales line item
March Ron McFadyen16 Ch 17: Use Case Realizations with GRASP Patterns Page 316 public class SalesLineItem {private int quantity; private ProductSpecification productSpec; public void SalesLineItem (…spec, …quantity) { this.productSpec = spec ; this.quantity = quantity } The constructor for a sales line item arranges that the sales line item knows its product specification and its quantity
March Ron McFadyen17 Ch 17: Use Case Realizations with GRASP Patterns Section 17.5 enterItem 2 nd concern: who/what is going to be responsible for finding a match for a product specification? For doing a lookup? Who has knowledge of product specifications? Who is capable of doing a lookup? Expert suggests the product catalogue is the best candidate. The product catalogue contains the product specifications … the product catalogue has the information, it is the expert.
March Ron McFadyen18 Ch 17: Use Case Realizations with GRASP Patterns enterItem() :Register : :ProductSpecification :ProductCatalog 1:getSpecification() 1.1:find()
March Ron McFadyen19 Ch 17: Use Case Realizations with GRASP Patterns Page 316 public class ProductCatalog { private Map productSpecifications = new HashMap(); … public ProductSpecification getSpecification (ItemID id) { Return( …. productSpecifications.get ( id ); } Collection of product specifications Method to find a specific item Handles the “find” message
March Ron McFadyen20 Ch 17: Use Case Realizations with GRASP Patterns enterItem() :Register:Sale : :ProductSpecification :ProductCatalog : :SalesLineItem 1:getSpecification() 1.1:find() 2:makeLineItem() 2.1:create() 2.2:add()
March Ron McFadyen21 Ch 17: Use Case Realizations with GRASP Patterns Given the previous collaboration, what methods/responsibilities have been assigned to the various classes? RegisterSale ProductCatalog SalesLineItem