メソッドの可視性の方針

Pragmatism over Theory: Protected vs Private

半年ほど前、 Symfony2 のコーディング規約で private を使うことが解禁され、protected の大半を private に変更したところ、Symfony2 のユーザーがコードを変更せざるをえなくなったが、結果として、彼らのコードがよりわかりやすいものになったとのこと。

ここで、ケントベックの実装パターンのメソッドの可視性のセクションを読み返す。

可視性を選ぶ際には、柔軟性とオブジェクト呼び出しのコストのバランスを考える必要がある。公開範囲を狭くすれば将来の変更が容易になる反面、コードの利用者の作業が増える。

ケントベックは可視性をできるだけ制限することを一般的な戦略としている。最小限の可視性からはじめ、必要に応じて公開範囲を広げる。

Java の4つのアクセス修飾子に対するそれぞれのコメントを抜粋。

  • public: パッケージの外側でも役に立つものにつける。メソッドの保守を引き受けることを意味する
  • package: パッケージの中にあるオブジェクトだけ利用できるようにする
  • protected: サブクラスの中で利用できるようにする
  • private: 外部の利用状況にかかわらず、自由に変更できる。柔軟性の点でもっともすぐれている。