オブジェクト指向シリーズ。今回はインターフェイスについて。
インターフェイスといっても、implementsを使った実装だけではなく、要はあるクラスが外部の窓口となるときに使うメソッドってことだと思う。
柔軟なインターフェイス
メモ
- インターフェイス(正確にはパブリックインターフェイス)により内部構造を隠蔽する(p90の厨房の例はわかりやすすぎ)のが基本。
- パブリックインターフェイスはクラスの責任を明確に述べる契約書
- シーケンス図を書いて、「どのように」を伝えるのではなく「何を」頼むか。
- 内部のクラスにはあえてタッチせず(これに関しては「どのように」に属する)、あくまでインとアウトだけを考える(これが「何を」に当たる)
- 内部のクラスが保持しているクラスのさらにメソッド・・みたいな書き方をしない
- なるべく内部を公開しない。インターフェイスが契約書であり、
実際のコーディング上のコツ
- 引数に関しては不変なものを変数でとり、オプションの引数としてハッシュをとる。
- チェーン的なドットは1つまで(Aに依存しているBに依存しているCというものを使ってはダメ)にしてなるべく依存度を下げる。3~4つのようなチェーンメソッドは依存度を上げ、変更が難しくなる。デルメルの法則(P114)
感想
この章はコードがない分抽象的な例が多くてなかなか難しかった・・。
ポイントとしては内部構造にできるだけ、公開しない=依存しないようにするってことだと思う。入口(インターフェイス)のところで主要となる引数と戻り値を決めたら内部構造はなるべく隠蔽するスタイルをとるようにする。ドットは1つまでというのはチェーン的なメソッドを前提とするとクラスの関連性が深くなってしまい、密結合になってしまうため。
自分自身、このスタイルのコーディングを練習しているけど、1クラスを単一責任にするとpublicなクラス(外部から呼ばれる)は非常に少なくなり、あとは内部の中だけで呼ばれるものが非常に多くなる。このスタイルを目指すべし。また内部で外部のクラスを使うときは依存度が高くならないように(クラスのクラスなど)注意。