得墨忒耳定律

Noa*_*ark 2 oop ruby-on-rails law-of-demeter ruby-on-rails-3

我最近在stackoverflow上发布了一个问题,我做了一些事情

@period_registration.period.event

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

def event
  period.event
end

@period_registration.event
Run Code Online (Sandbox Code Playgroud)

我的一般意义是,这看起来有点严厉.查看此前发布的内容如何将Demeter法应用于此?显示如果你为每个协会做这件事,这会变得多么重.

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

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

Ver*_*cus 5

说实话,对得墨忒耳法的严格遵守是非常罕见的.不过,对于协会来说,这是一种常见的模式,它有一条捷径可以消除你的大部分辛勤工作:

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

PeriodRegistration.new.event # calls PeriodRegistration.new.period.event
Run Code Online (Sandbox Code Playgroud)

您可以在Module#delegate文档中阅读更多相关信息.

冒着过度自我推销的风险,我有一篇博客文章讨论了这个以及其他方法来尝试尊重得墨忒耳法则,如果这是你的事情.如果您想要了解更多信息,请查看它.