4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails物語】デメテルの法則〜知りすぎてはいけない〜

Last updated at Posted at 2020-10-16

###概要
とある街に駆け出しのエンジニアのY君がいました

彼にとってプログラミングは難しいものでした

しかし彼はつよつよエンジニアになりたいと願い、数ヶ月前から毎日プログラミングの勉強をしてました

そんなある日、彼はより実践的な経験値を得るため共同開発チームに入るのでした

与えられたミッション(タスク)をこなし報告(プルリク)を出した時、それは起こりました、、、

###デメテルの怒り

Y君はこんなコードを書いていました

<%= "#{message.user.name}さん : " %>
<!-- messageの中身はこんな感じ{"user_id"=>1, "content"=>"やっほー"} -->

、、、これがデメテルの怒りに触れてしまったのです。

デメテル「知りすぎじゃーーーーーー!!」

デメテル曰く、プログラミングの世界では「知りすぎている」のは罪なのです

この場合messageuser_idは知っていて紐づいている。だけどuser自体の事は知らないし、そのnameなんて事は知らないはずなのです

ギャングがボスの存在は知っていても本当の名前を知ってはならないように、、、(ディア○ロ思考)

これをデメテルの法則と言います

参考
https://qiita.com/br_branch/items/37cf71dd5865cae21401

Y君は絶望の淵に立たされました

###賢者の救援

どうすれば良いのかわからず途方にくれていたY君

そこへ仲間の賢者(つよつよエンジニア)がやってきてこう言いました(レビュー)

賢者「delegate使えばええんやで、スッ」

参考
https://qiita.com/TT-nasu/items/13fb0617435a960407ec

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君は、デメテルの法則を肝に命じて、新たな開発を進めていくのでした。

この物語は半フィクションです、あと本当にこれでデメテルの法則を守れてるのか微妙かもです、この方がいいよというやり方あったら是非教えてください!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?