上記のデメテルの法則に反している箇所の解決策として、全てのモデルにdelegateメソッドを加えるというものがある。しかし、その解決策だとすぐに退屈してしまうので、Luke氏はhas_manyや has_and_belongs_to_many関連に対しデメテルの法則を満たしたメソッドのコレクションを生成してくれるDemeter's Revengeプラグイン(サイト・英語)を紹介してくれた。class WidgetsControllerCreateActionTest < Test::Unit::TestCase
def setup
# 通常Railsのコントローラのテストのsetupをここに書きます。
@user = mock('user')
User.stubs(:find).returns(@user)
end
def test_should_create_new_widget_for_parent_user_using_posted_widget_params
widgets_proxy = mock('association proxy')
@user.stubs(:widgets).returns(widgets_proxy)
# Userオブジェクト経由でwidget_proxyを使用している、この箇所がデメテルの法則に反しています。
widgets_proxy.expects(:create).with(:name => 'my funky widget')
post :create, :widget => {:name=> 'my funky widget'}
end
# Userが自身が持っている、利用することが出来るたくさんのウィジェットを適用します。
user.build_widget(params) # => user.widgets.build(params)
user.create_widget(params) # => user.widgets.create(params)
# ...
これでは法則を破ることは出来ないですよね?そして、プラグインがいわゆる”法則”に沿った記述を自動化出来るという事実は、それ(デメテルの法則)を無意味なものにしていませんか?原文はこちらです:http://www.infoq.com/news/2007/10/demeters-law-revenge