public
Created

Trying to respect the law of demeter

  • Download Gist
gistfile1.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
class User < ActiveRecord::Base
belongs_to :account
 
#A number of methods giving this class too many responsibilities already
end
 
class Account < ActiveRecord::Base
# t.integer credits
 
def add_credit(amount)
def available_credit
def deduct_credit(amount)
 
end
 
#The question is, is there any way to avoid writing code of the form "user.account.add_credit", and thus violating the law of demeter.
 
# For example:
 
def bill_user(user, amount)
if user.account.available_credits > amount
user.account.deduct_credits(amount)
else
#Charge user's credit card
end
end

Say that we have a user class (above) with the typical problem of having too many responsibilities. We are trying to introduce the concept of "prepaid credits" so that when we bill a user instead of charging their # card, we can deduct credits instead. We want to add some methods like "add_credit" and "available_credits". We want to avoid adding these methods to User.

One idea I had was to create an Account object (see above), and define the methods on that.

The question is, is there any way to avoid writing code of the form "user.account.add_credit", and thus violating the law of demeter.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.