2

私は最近、stackoverflowに質問を投稿しました。

@period_registration.period.event

しかし、私は次のようなことをすることが提案されました:

def event
  period.event
end

@period_registration.event

私の一般的な感覚は、これは少し手間がかかるように見えるということです。この以前の投稿を見て、これにデメテルの法則を適用するにはどうすればよいですか?は、すべてのアソシエーションに対してこれを行った場合に、これがどれほど重くなり得るかを示しています。

Railsではこれはどのくらい一般的な方法ですか?私の考えでは、これが技術的に正しいことであったとしても、それが鉄道文化の一部でなければ、これを行うことは人々を失望させるように思われます。そして、さらに重要なことは、他の開発者がこれらすべてのヘルパーメソッドで時間を無駄にしていると考えているため、実際にコードの保守性を低下させることです。

これを暗示したいとしましょう。@period_registration.event.cityは、都市がイベントの属性であり、個別のオブジェクトもLoDに違反していないか、または別のメソッドを記述して、@period_registration.cityを実行できるようにする必要があります。

4

1 に答える 1

5

正直なところ、デメテルの法則を厳守することは非常にまれです。それでも、アソシエーションの場合、これは非常に一般的なパターンであるため、ハードワークのほとんどを削除するショートカットがあります。

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

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

これについて詳しくは、Module#delegateのドキュメントをご覧ください。

過度に自己宣伝しているように聞こえるリスクがありますが、デメテルの法則を尊重するためのこの方法やその他の方法について説明しているブログ投稿があります。詳細を知りたい場合は、チェックしてください。

于 2012-09-02T16:14:48.497 に答える