BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース デメテルの法則を守るRailsプラグイン

デメテルの法則を守るRailsプラグイン

デメテルの法則又は最小限の知識原則は、ソフトウェア開発における設計のガイドラインである。これら二つの法則の基本的な概念は、与えられたオブジェクトは、サブコンポーネントを含め、構造、プロパティ、他のオブジェクトの振舞いに関して出来るだけ責務を負うべきではないということである。Dan Manges氏(source)は、Rubyで、特にForwardable(サイト・英語)モジュールを用いることにより、二つの法則を適用する概念と方法を明確にするのに役立てた。Luke Redpath氏は、モックとスタブを使用してUnit Testsを書いているとき、デメテルの法則違反に出くわした。
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
上記のデメテルの法則に反している箇所の解決策として、全てのモデルにdelegateメソッドを加えるというものがある。しかし、その解決策だとすぐに退屈してしまうので、Luke氏はhas_manyや has_and_belongs_to_many関連に対しデメテルの法則を満たしたメソッドのコレクションを生成してくれるDemeter's Revengeプラグイン(サイト・英語)を紹介してくれた。
# 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

この記事に星をつける

おすすめ度
スタイル

BT