🧘

Tell, Don't Ask(求めるな命じよ)を深堀する

2023/01/31に公開

Tell, Don't Askとは

オブジェクトに対してはAsk(求める事)はせずに、Tell(命令)だけするべきという原則

もう少しわかりやすく各単語を噛み砕くとこんな感じです。

Tell = オブジェクトに対してロジックの結果を聞く
Ask = オブジェクトに対してあれこれ聞いて手元でロジックを組み立てること

Tell, Don't Askを守れていない例

userにtypeプロパティを聞いて、それを元にif文を組み立てていますね。

if (user.type === 'admin') {
  user.getAdminWelcomeMessage()
} else {
  cuser.getUserWelcomeMessage()
}

Tell, Don't Askを守れている例

userに何も聞いてません。ただ命令しているだけです。

user.getWelcomeMessage()

メリット

  1. 一箇所に情報や関心をまとめることができる
  2. コードの重複を防ぐことができる
    Tell, Don't Askに従えば、自然とDRYが守られます
    先ほどの例で言うと、色々な場所にif (user.type === 'admin')が書かれる恐れがありましたが、Tell, Don't Askを守れていればその危険性はありませんね。
  3. ユニットテストがシンプルになる

デメリット (WIP)

Tell, Don't Askを厳格に守るがゆえに、肥大化し過ぎるクラスがでてくる可能性があります

まとめ

あるオブジェクトに対してあれこれ聞いたりプロパティを取得せずに、オブジェクトには命令するだけにしましょう。
変更容易性が高まり、低結合と高凝集の実現がぐっと近づくはずです。

参照

https://medium.com/vattenfall-tech/tell-dont-ask-learn-to-talk-to-your-objects-45d7c4aa61fe

https://www.javacodegeeks.com/2015/11/tell-dont-ask.html

https://thoughtbot.com/blog/tell-dont-ask

Discussion