2012-09-02 68 views
2

的法律我最近張貼在計算器的一個問題,我做了一件影響德米特

@period_registration.period.event

然而,有人建議我做類似如下:

def event 
    period.event 
end 

@period_registration.event 

我的一般意義是,這似乎有點蠻橫。查看此前的發帖How do I apply the Law of Demeter to this?顯示,如果您爲每個協會都這樣做,可能會變得多麼沉重。

如何實踐的常見的軌道,這是?我的想法是,即使這在技術上是正確的做法,如果它不是鐵路文化的一部分,那麼似乎這樣做會讓人們失望。而且,更重要的是,實際上讓代碼更容易維護,因爲其他開發人員認爲您正在使用所有這些幫助器方法浪費時間。

比方說,我想這impliment,將@ period_registration.event.city,其中城市是事件的屬性,而不是一個單獨的對象也違反毀滅之王或者我需要寫ANOTHER方法,所以我可以做的: @ period_registration.city

+0

爲什麼要通過period_registration訪問城市? –

+0

爲什麼要通過period_registration訪問城市?如果你爲每個協會都配置了這種訪問器,那就不是好設計。對於一些協會來說沒關係,但是對於所有這些都是不好的想法。 –

+0

這是比其他任何事情都更好的例子。假設您已在控制器中擁有@period_registration,並且您希望將event.city放入您的視圖中。你會怎麼做? –

回答

5

說實話,俯首聽命於迪米特法則是非常罕見的。不過,對於聯想,這是這樣一個共同的模式,它有一個快捷方式,去除大部分的辛勤工作,從您:

class PeriodRegistration < ActiveRecord::Base 
    belongs_to :period 
    delegate :event, :to => :period 
end 

PeriodRegistration.new.event # calls PeriodRegistration.new.period.event 

你可以在Module#delegate文檔閱讀更多關於這一點。

雖然聽起來過於自我推銷的風險,我有一個博客帖子討論這件事等方式來儘量尊重迪米特法則,如果那是你的事。 Check it out如果您想了解更多信息。

+0

+1。關於您的博客文章,您有另一種解決方案:從method_missing實時定義方法。那麼method_missing只會針對特定方法命中一次。 – apneadiving