woshidan's loose leaf

ぼんやり勉強しています

オブジェクト指向設計実践ガイド ~Rubyでわかる進化し続ける柔軟アプリケーションの育て方の2~3章を読んで

上記の本の2~3章を読んで印象に残った部分をまとめました。

2章

  • 変更が簡単であることの定義
    • 変更は副作用をもたらさない
    • 要件の変更が小さければ、コードの変更も相応して小さい
    • 既存のコードは簡単に再利用できる
    • 最も簡単な変更方法はコードの追加である。ただし追加するコードはそれ自体変更が容易なものとする
  • 2つ以上の責任を持つクラスは簡単には再利用できない。どう見つけるか
    • あたかもそれに知覚があるかのように仮定して問いただす
    • 1文でクラスを説明してみること(「それと」と「または」に要注意)
  • クラス内の全てがそのクラスの中心的な目的に関連していればそのクラスは凝縮度が高い、もしくは単一責任である
  • 変更を受け入れられるようにコードを構成するテクニック
    • インスタンス変数をアクセサメソッドで包み隠す(変数はそれらを定義しているクラスからでさえも隠蔽する)
    • Structクラスを使って配列のインデックスというデータ構造を隠蔽しよう(配列のインデックスへの参照がオブジェクトへの具体的なメッセージの送信に形を変える)
    • メソッドを単一責任にする(繰り返しとその中身を別のメソッドに分ける)とクラスがやっていることもはっきりする

3章

  • オブジェクトに依存関係があるとき
    • 他のクラスの名前を知っているとき
    • self以外のどこかのオブジェクトに送るメッセージの名前を知っているとき
      • いくつものメッセージをチェーンのように繋いで遠くのオブジェクトに存在する振る舞いを実行しようとする場合
    • そのメッセージが要求する引数を知っているとき
    • それら引数の順番を知っているとき
  • 依存を減らすための具体的なコーディング技法
    • 依存オブジェクトの注入
      • ほかのクラスに、クラス名そのもので参照しているところは、結合を生みだす主要な場所の1つ
      • クラス名でなく重要なのはクラスが応答しているメッセージ
      • 依存をメッセージのみにするため、クラスのインスタンスを作る部分を外部に押しやって、外部で生成したインスタンスを引数に受け取るようにする
      • 「クラス名を知っておく責任や、そのクラスに送るメソッドの名前を知っておく責任が、どこかほかのクラスに属するものなのではないか」
    • 依存の隔離
      • 外部のクラスに依存している部分を一つのメソッド内に隔離してしまう
      • self以外に送られるメッセージをメソッドに隔離する(そのメッセージが変わりやすそうなら)
    • インスタンス変数の作成を分離
      • 外部のクラスのインスタンス変数を生成する部分をメソッドに分離して外部のクラスに依存していることをはっきりさせる
    • 引数の順番への依存を取り除く
  • 依存の方向は自分より変更されないものに依存するようにする