BT

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

| 作者: Sebastien Auvray フォローする 0 人のフォロワー , 翻訳者 長部 広太 フォローする 0 人のフォロワー 投稿日 2007年11月6日. 推定読書時間: 2 分 |
デメテルの法則又は最小限の知識原則は、ソフトウェア開発における設計のガイドラインである。これら二つの法則の基本的な概念は、与えられたオブジェクトは、サブコンポーネントを含め、構造、プロパティ、他のオブジェクトの振舞いに関して出来るだけ責務を負うべきではないということである。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

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT