Responsibility
Object Oriented Design done right.
José Mota
Ruby and Javascript instructor at Tuts+ for 1.5 years
Code Retreats em Portugal
Objectives
- How OOD is used
- How it should be used
- How it helps define responsibilities
Typical case for objects
class User
def buy(product)
# code that makes the user buy a product
end
end
What's wrong in the picture?
Title
class User
def buy(product)
# code that makes the user buy a product
end
end
What does buy do?
- Updates the stock of the product
- Deals with a money charge from the user
- Emails a receipt
- Engages a whole process of shipping
Solution
Create a new class with the specific
responsibility of handling a purchase.
class User
def buy(product)
Purchase.new(user, product).execute
end
end
class Purchase
def initialize user, product
@user = user
@product = product
end
def execute
update_stock
charge_user
deliver_receipt
engage_shipping
end
end
Feature change
Buy multiple products
What to do?
It breaks the code.
Solution
Create a class that handles multiple products.
class PurchaseMany
def initialize user, products
@user = user
@product = products
end
def execute
@products.each do |product|
Purchase.new(user, product).execute
end
end
end