###概要
とある街に駆け出しのエンジニアのY君がいました
彼にとってプログラミングは難しいものでした
しかし彼はつよつよエンジニアになりたいと願い、数ヶ月前から毎日プログラミングの勉強をしてました
そんなある日、彼はより実践的な経験値を得るため共同開発チームに入るのでした
与えられたミッション(タスク)をこなし報告(プルリク)を出した時、それは起こりました、、、
###デメテルの怒り
Y君はこんなコードを書いていました
<%= "#{message.user.name}さん : " %>
<!-- messageの中身はこんな感じ{"user_id"=>1, "content"=>"やっほー"} -->
、、、これがデメテルの怒りに触れてしまったのです。
デメテル「知りすぎじゃーーーーーー!!」
デメテル曰く、プログラミングの世界では「知りすぎている」のは罪なのです
この場合message
はuser_id
は知っていて紐づいている。だけどuser
自体の事は知らないし、そのname
なんて事は知らないはずなのです
ギャングがボスの存在は知っていても本当の名前を知ってはならないように、、、(ディア○ロ思考)
これをデメテルの法則と言います
Y君は絶望の淵に立たされました
###賢者の救援
どうすれば良いのかわからず途方にくれていたY君
そこへ仲間の賢者(つよつよエンジニア)がやってきてこう言いました(レビュー)
賢者「delegate使えばええんやで、スッ」
Y君「!!」
###必殺delegate
delegateマクロを使うとメソッドを簡単に委譲できる
Y君は上記記事を参考に下記のようにコードを書き加えました
class User < ApplicationRecord
has_many :messages
def user_name
"#{name}さん : "
end
end
class Message < ApplicationRecord
belongs_to :user
delegate :user_name, to: :user
end
すると先ほどのデメテルぷんぷんコードはこうなりました、、、
<%= message.user_name %>
これを見たデメテルは「まぁよかろう」とだけ言って去って行きました
罪の晴れたY君は、デメテルの法則を肝に命じて、新たな開発を進めていくのでした。
この物語は半フィクションです、あと本当にこれでデメテルの法則を守れてるのか微妙かもです、この方がいいよというやり方あったら是非教えてください!