得墨忒耳定律

时间:2012-09-02 15:57:47

标签: ruby-on-rails ruby-on-rails-3 oop law-of-demeter

我最近发布了一个关于stackoverflow的问题,其中我做了一些有效的事情

@period_registration.period.event

但是,有人建议我做以下事情:

def event
  period.event
end

@period_registration.event

我的一般意义是,这看起来有点严厉。看看之前发布的帖子How do I apply the Law of Demeter to this?,可以看出,如果你为每个协会做了这件事,这会有多么重要。

在铁轨中这种做法有多常见?我的想法是,即使这在技术上是正确的,但如果它不是铁杆文化的一部分,那么这样做似乎会让人们失望。而且,更重要的是,实际上使代码不易维护,因为其他开发人员认为你在浪费时间使用所有这些辅助方法。

假设我想表达这一点,请@ period_registration.event.city,其中city是事件的属性,而不是单独的对象也违反了LoD,或者我是否需要编写 ANOTHER 方法我可以这样做:@ period_registration.city

1 个答案:

答案 0 :(得分: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如果您想要了解更多信息,请{。}}