ravelll の日記

よしなに

オブジェクト指向設計実践ガイド 第3章

読み進めるうちにしばしば「あのプロダクトのあの実装はこういう意図だったのでは!」と気づいて、その瞬間が気持ち良い。

第3章では特に「他クラスへのあるメッセージ送信についての依存を、そのメッセージに応答できるダックタイプへの依存に変えるとき、それはインタフェースを定義している」という趣旨の文に唸らされた。

3章 依存関係を管理する

  • オブジェクトが現実世界の問題の特徴を反映し、オブジェクト間の相互作用が解決策を用意する

3.1 依存関係を理解する

  • テストはコードを参照するがゆえに、コードに依存する
    • テストに慣れないうちはコードと過度に依存したテストを書きがち

3.2 疎結合なコードを書く

  • 依存オブジェクトの注入によるコード整形は、クラス名やそのクラスに送るメソッド名を知っておく責任が他のクラスにあるのでは、と疑える能力に左右される
  • コントロールできない外部のクラス名に対する依存をどのように管理するかはアプリケーションに多大な影響を及ぼす
  • 複雑なメソッドはそうでないメソッドよりも変更が必要になる可能性が高い
  • 引数が必要なメッセージを送るとき、送り手は引数についての知識を持たざるをえない
  • 真偽値を引数にとったり引数の false と nil を区別したいときは || でなく fetch を使うのが良い
  • 自身のアプリケーション内のクラスは自身のアプリケーションが所有するコードのみに依存するべき
  • 他クラスのインスタンス作成のみを目的とするクラスをオブジェクト指向設計ではファクトリーと呼ぶ

3.3 依存方向の管理

  • 各クラスの依存は自分より変更されないクラスへの依存となるように管理する
  • 依存する他クラスへのメッセージに応答できるダックタイプを定義する ≒ インタフェースの定義
  • 抽象化されたものへの依存は具象的なものへの依存よりも常に安全

3.4 まとめ

  • 依存関係の管理において鍵となるのはその方向を制御すること