Chapter4: The Seam Model 継ぎ目モデル

Working Effectively with Legacy Code 読書メモ

  • Chapter4: The Seam Model 継ぎ目モデル
    • 既存のコードにテストを書こうとすると、そのコードがテストのことをほとんど考えてない事に気づく
    • テストしやすさを考慮した設計("design for testability")でコードが書いてあればテストしやすい
    • しかし、既存のコードをすべて"design for testability"にするアプローチは、コードが多い場合には難しい。
      • 別の方法を考えてみたい。
      • すべてのプログラミング言語をこの本で網羅することはできないが、ここで概要を書いとく
  • A Huge Sheet of Text
    • 汎用機のころには一行一行書いては、印刷したり、テストしていた。
      • 一行書いただけで、全体が変わる場合はどうやってテストする?
      • モジュールは互いに独立しているようでも、実は依存していたりする
      • 再利用するの大変
  • Seams: 継ぎ目
    • 各クラスをテストしようとすると、どれだけ"良く"デザインされていても、多くの労力がかかる
      • 既存のプロジェクトにテストを注入するには"良さ"について再考しなければならない
      • その結果、ソフトウェアに対する認識が変わる
    • Seam(継ぎ目): 現在編集中のソースコードをいじくらなくても、動作を変えることのできる部分
      • C++コードの例。オーバライドを使って、グローバルなPostReceiveError呼び出しを、ローカルにすげ替える。
  • Seam Types
    • Preprocessing Seams
    • Link Seams
      • Java の import 文を利用する。JVMclasspath環境変数をみてロードするライブラリ実体を探すので、同じ名前のクラスを自分で作ってクラスパスの高いディレクトリにおく。
      • C/C++ではスタティックにリンクされるので、ビルドスクリプトを使って、テスト用とプロダクション用を切り替える。
      • テスト用はスタブのコード。
    • Object Seams
      • オブジェクト指向言語で使える方法。メソッドコールしている場合に、そのメソッドを持つクラス/オブジェクトを挿げ替える
      • あと、private static メソッドをprotectedに変えるだけで、それを継承するテストクラスを作ってオーバーライドで挿げ替える方法もある。元のソース改変になるが、最小限の変更で依存性を断ち切れる。
    • 3つのタイプのSeamをうまく選ぶことが重要。