25. Dependency-Breaking Techniques - Extract and Override Getterなど - WORKING EFFECTIVELY WITH LEGACY CODE (WEwLC)

Working Effectively With Legacy Codeの 25章 Dependency-Breaking Techniques からテクニック9つ。

マインドマップから再構成したまとめ

9.Extract and Override Getter
問題

  • コンストラクタの中でインスタンス生成している
    • その部分の動作を外から変えられない

手順

  1. Getter を空で作る
  2. Getter で NULL ならば initialize して返す
  3. Getter を override して動作を変える

欠点

  • initialize まえに別の関数から直接変数を参照されるとまずい


10.Extract Implementator
よく使うので重要
問題

  • クラスのふるまいを変えたい

手順

  1. Class宣言コピー
  2. 元クラスからインターフェースを作る
    • non-public なものは消す
  3. public なメソッドを abstract にしてインターフェースを作り上げる
  4. 不要な include ヘッダを消す
  5. 元のクラスでインターフェースを実装する
  6. コンパイルする


11.Extract Interface
とても安全なテクニック
問題

  • Fake object 作りたい

手順

  1. インターフェース作り名前をつける。
  2. 元のクラスでインターフェースを実装したことにする。コンパイルして動かす。
  3. 呼び出し元をインターフェースに書き換え。
  4. コンパイルしエラーになった呼び出しのインターフェースを追加する


12.Introduce Instance Delegator
問題

  • static call の呼び出し部分のふるまいを変えたい

手順

  1. テストに邪魔な static call 特定
  2. 同じ signature のインスタンスメソッド作り delegate
  3. 呼び出し元で必要なインスタンスを引数で与える
  4. call 部分を入れ替える


13.Introduce Static Setter
問題

  • テストでsingleton のふるまいかえたい

手順

  1. コンストラクタを protected に
  2. static setter 追加


14.Link Substitution
問題

  • 手続き型では実装を入れ替えるのが面倒

手順

  1. 関数を特定
  2. 別の実装用意
  3. ビルドやクラスパスなどで調整


15.Parameterize Constructor
問題

手順

  1. コンストラクタを copy
  2. 引数追加してパラメータ化
  3. 古いコンストラクタとの重複を消す


16.Parameterize Method
同上。



17.Primitive Parameter
問題

  • クラス全体が大きすぎてインスタンス化できない。特定メソッドのテスト書けない

手順

  1. クラス内の中間表現を free function の中から使ってしまう
  2. free function をテストする
  3. 統合する

所感

  • こういうテクニック集はどのマインドマップも同じような形になってしまうのはしょうがないのかな。

リンク

一人読書会 - WORKING EFFECTIVELY WITH LEGACY CODE (WEwLC)


Working Effectively With Legacy Code
Michael C. Feathers
Prentice Hall
売り上げランキング: 4738
おすすめ度の平均: 5.0
5 設計が悪いシステムの保守でお悩みの方へ