ジャバ・ザ・ハットリ
Published on

Rubyのリファクタリング:「聞くな、言え」の法則

Authors
  • avatar
    ジャバ・ザ・ハットリ

元ネタはこちら。
Tell, Don't Ask

キャッチフレーズから非常に分かりやすい。

Tell, Don't Ask 言え!、聞くな

理想的なオブジェクト指向設計においてはオブジェクトに対してただやって欲しいことを「言う」だけ。
こちらでどうればいいのか聞いたり、判断したりしないこと。
サンプルで見るとそれは明快。

悪い例

<% if current_user.admin? %>
  <%= current_user.admin_welcome_message %>
<% else %>
  <%= current_user.user_welcome_message %>
<% end %>

これはいちいち current_user が Admin かどうか、聞いて(判断して)からメッセージを送っているので、そこがダメ。

ただしくはただ言うだけにするべき。
良い例

<%= current_user.welcome_message %>

welcome_message をただ呼んで(言って)るだけ。

また別の例がこちら。
悪い例

def check_for_overheating(system_monitor)
  if system_monitor.temperature > 100
    system_monitor.sound_alarms
  end
end

上記の例が悪いのは temperature の値が100以上か判断してから sound_alarms を起こしている。こんな実装をしてしまうと全ての sound_alarms の前に100以上かの判断が必要になってしまう。

良い例

system_monitor.check_for_overheating

class SystemMonitor
  def check_for_overheating
    if temperature > 100
      sound_alarms
    end
  end
end

呼び出し元はただ check_for_overheating を呼ぶだけ。100以上か?などの判断を意識する必要はない。それらの判断は SystemMonitor で行うべき。

Ruby のリファクタリングをしていると「なぜそのように変更した方がいいのか?」「他のコードにもその変更基準を適用すべきか?」などの質問が多くある。そこで「Tell, Don't Ask(聞くな、言え!)の法則だよ」と分かりやすいキャッチフレーズと共に伝えることで理解が容易になり、かつその後も継続して受け入れられやすくなる。

ただこの様な枝葉のテクニックを使って、コード品質を上げるよりも本質的にオブジェクト指向設計とは何か?を理解した後でテクニックを磨いた方が遠回りに見えて実は最短コースではある。
オブジェクト指向設計の理解にはこちらの書籍が絶賛オススメ中。いつもこのブログでこの本とオススメしてしまっているが、これ以上にいい本が見当たらないからだ。それぐらいに良書であることを保証する。

Ruby のリファクタリングについて詳しく解説した記事