安易なgetter/setterを作らない

安易なgetter/setterを作らない

  • 明けましておめでとうございます
  • こういうコードを見るとモヤモヤします
if ($foo->getDate() > $today) {
     return false;
}

何が良くないのか?

  • $foo->getDate() を使って条件判定を行っている箇所が正しくカプセル化を行えていないと感じます
  • また、上記が何の日付を意味しているのか全くわからない点にも問題を感じます
  • Why getter and setter methods are evilで書かれていたことですね

どうすればよかったか?

  • 以前にQiitaでも書きましたが、モデルにデータを閉じ込めその振る舞いとしてカプセル化しましょう
  • そして、その条件自体に正しく本質的な名前を付けてあげましょう
  • 最初の例が仮にブログ記事の公開であるとします
  • であれば、インスタンス名は$articleとなるでしょう
  • そして、getDateisPublishedといった名前になるはずです
  • $todayをパラメータとして渡すべきかどうかは使っているDate系のライブラリによっても変わるでしょう
  • ここではDateインスタンスの生成にコストがかかるものを想定してパラメータとして渡しています
if ($article->isPublished($today)) {
    return false
}

伝えたいこと

  • getter/setterをとりあえずやなんとなくで用意しない
  • gettersetterを用いてすべきことを補完したメソッドを用意してそれらを使う様にする
  • 補完したメソッドが適切な名前を与えられていれば、自然言語に近づき何をするメソッドであるかもわかりやすくなります