我最近发布了一个关于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
答案 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如果您想要了解更多信息,请{。}}