Skip to content

@Jacobkg /gist:3037786
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Trying to respect the law of demeter
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
@Jacobkg
Owner

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.