[Ruby]delegateメソッドの使い方
概要
Module#delegate このメソッドを使うことで癒着を弱めてデメテルの法則に沿えるようになる
デメテルの法則 任意のオブジェクトが自分以外の構造やプロパティに対して持っている仮定を最小限にすべきであるという考え方。 以下のように、objAから他のオブジェクトを経由してメソッドやオブジェクトなどを呼び出してはいけない。 objA.objB.Method() →オブジェクト間のやりとりを最小限に抑え、必要であれば直接やりとりをする メリット: メンテナンスしやすくなる
メソッドの使用方法
モデルで以下のように指定
class Company < ApplicationRecord belongs_to :owner_user delegate :email, to: :owner_user end 呼び出し方 company.email # company.owner_user.emailと同等
ちなみに以下の形で書くのと同等になるが、delegate を使った方がより簡潔に書ける
def name profile.name end オプション ・allow_nilオプションをつけるとowner_userがnilだった場合に例外ではなくnilを返すようにできる delegate :email, to: :owner_user, allow_nil: true
上記は以下と同義
def name profile&.name end ・prefixオプションでプレフィックスをつけることができる delegate :email, to: :owner_user, prefix: true
呼び出し company.owner_user_email
参考
Active Support コア拡張機能 - Railsガイド デメテルの法則 - Wikipedia Rails Best Practices - the Law of Demeter
This post is licensed under CC BY 4.0 by the author.