2012-09-02 36 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