レガシーコード改善ガイド
第一部 変更のメカニズム
第1章 ソフトウェアの変更
-
1.1ソフトウェア変更の四つの理由
- 1.1.1 要件の追加とバグの修正
- 1.1.2 設計の改善
- 1.1.3 リソース利用の最適化
- 1.1.4 四つの変更理由のまとめ
- 1.2 危険な変更
第2章 フィードバックを得ながらの作業
- 2.1 単体テストとは
- 2.2上位レベルのテスト
- 2.3 テストによる保護
- 2.4 レガシーコードの変更手順
- 2.4.1 変更点を洗い出す
- 2.4.2 テストを書く場所を見つける
- 2.4.3 依存関係を排除する
- 2.4.4 テストを書く
- 2.4.5 変更とリファクタリングを行う
- 2.4.6 この後の内容
第3章 検出と分離
- 3.1 協調クラスの擬装
- 3.1.1 擬装オプジェクト
- 3.1.2 擬装オブジェクトの2つの側面
- 3.1.3 擬装のエッセンス
- 3.1.4 モックオブジェクト
第4章 接合モデル
- 4.1 巨大な用紙の文字の羅列
- 4.2 接合部
- 4.3 接合部の種類
- 4.3.1 プリプロセッサ接合部
- 4.3.2 リンク接合部
- 4.3.3 オブジェクト接合部
第5章 ツール
- 5.1 自動リファクタリングツール
- 5.2 モックオブジェクト
- 5.3 単体テストハーネス
- 5.3.1 JUnit
- 5.3.2 CppUnitLite
- 5.3.3 NUnit
- 5.3.4 その他のxUnitフレームワーク
- 5.4 一般的なテストハーネス
- 5.4.1 FIT
- 5.4.2 Fitnesse
第2部 ソフトウェアの変更
第6章時間がないのに変更しなければなりません
- 6.1 スプラウトメソッド
- 6.1.1 長所と短所
- 6.2 スプラウトクラス
- 6.2.1 長所と短所
- 6.3 ラップメソッド
- 6.3.1 長所と短所
- 6.4 ラップクラス
- 6.5 まとめ
第7章 いつまで経っても変更作業が終わりません
- 7.1 理解すること
- 7.2 遅延時間…
- 7.3 依存関係の排除
- 7.3.1 ビルドの依存関係
- 7.4 まとめ
第8章 どうやって機能を追加すればよいのでしょうか?
- 8.1 テスト駆動開発(TDD)
- 8.1.1 失敗するテストケースを記述する
- 8.1.2 コンパイルする
- 8.1.3 テストを通過させる
- 8.1.4 重複を取り除く
- 8.1.5 失敗するテストケースを記述する
- 8.1.6 コンパイルする
- 8.1.7 テストを通過させる
- 8.1.8 重複を取り除く
- 8.1.9 失敗するテストケースを記述する
- 8.1.10 コンパイルする
- 8.1.11 テストを通過させる
- 8.1.12 重複を取り除く
- 8.2 差分プログラミング
- 8.3 まとめ
第9章 このクラスをテストハーネスに入れることができません
- 9.1 いらだたしいパラメータ
- 9.2 隠れた依存関係
- 9.3 複雑な生成
- 9.4 いらだたしいグローバルな依存関係
- 9.5 恐るべきインクルードの依存関係
- 9.6 玉ねぎパラメータ
- 9.7 別名のパラメータ
第10章 このメソッドをテストハーネスで動かすことができません
- 10.1 隠れたメソッド
- 10.2 言語の「便利な」機能
- 10.3 検出できない副作用
第11章 変更する必要がありますが、どのメソッドをテストすればよいのでしょうか?
- 11.1 影響の調査
- 11.2 前方向の調査
- 11.3 影響の伝播
- 11.4 影響調査のためのツール
- 11.5 影響の分析から学ぶこと
- 11.6 影響スケッチの単純化
第12章 1カ所にたくさんの変更が必要ですが、関係するすべてのクラスの依存関係を排除すべきでしょうか?
- 12.1 割り込み点
- 12.1.1 単純な場合
- 12.1.2 上位レベルの割り込み点
- 12.2 絞り込み点で設計を判断する
- 12.3 絞り込み点の落とし穴
第13章 変更する必要がありますが、どんなテストを書けばよいのかわかりません
- 13.1 仕様化テスト
- 13.2 クラスの仕様を明らかにする
- 13.3 狙いを定めたテスト
- 13.4 仕様化テストを書くための経験則
第14章 ライブラリへの依存で身動きが取れません
第15章 私のアプリケーションはAPI呼び出しだらけです
第16章 変更できるほど十分に私はコードを理解していません
- 16.1 メモを取る/スケッチを描く
- 16.2 印を付ける
- 16.2.1 貴務の分割
- 16.2.2 メソッドの構造の理解
- 16.2.3 メソッドの抽出
- 16.2.4 変更の影響の理解
- 16.3 試行リファクタリング
- 16.4 使用していないコードを削除する
第17章 私のアプリケーションには構造がありません
- 17.1 システムのストーリーを話す
- 17.2 白紙のCRC
- 17.3 会話の吟味
第18章
- 18.1 クラスの命名規約
- 18.2 テストコードの配置
第19章 自分のテストコードが邪魔になっています
第20章 私のプロジェクトはオブジェクト指向ではありませんが、どうすれば安全に変更できるでしょうか?
- 19.1 簡単なケース
- 19.2 困難なケース
- 19.3 新しい振る舞いの追加…
- 19.4 オブジェクト指向の長所の活用
- 19.5 すべてはオブジェクト指向
第20章このクラスは大きすぎて、もうこれ以上大きくしたくありません
- 20.1 責務の把握
- 20.2 その他の技法
- 20.3 先へ進む
- 20.3.1 戦略
- 20.3.2 戦術
- 20.4 クラスの抽出後
第21章 同じコードをいたるところで変更しています
- 21.1 最初のステップ
第22章 モンスターメソッドを変更する必要がありますが、テストを書くことができません
- 22.1 モンスターの変種
- 22.1.1 箇条書きメソッド
- 22.1.2 錯乱メソッド
- 22.2 自動リファクタリング機能でモンスターに立ち向かう
- 22.3 手作業によるリファクタリングに挑戦
- 22.3.1 検出用変数の導入
- 22.3.2 理解している部分の抽出
- 22.3.3 依存関係の落ち拾い
- 22.3.4 メソッドオブジェクトの取り出し
- 22.4 戦略
- 22.4.1 骨組みメソッド
- 22.4.2 処理シーケンスの発見
- 22.4.3 まず現在のクラス内で抽出する
- 22.4.4 小さい部分の抽出
- 22.4.5 抽出をやり直す覚悟
第23章 どうすれば何も壊していないことを確認できるでしょうか?
- 23.1 超集中編集
- 23.2 単一目的の編集
- 23.3 シグネチャの維持
- 23.4 コンパイラまかせ
- 23.5 ペアプログラミング
第24章 もうウンザリです。何も改善できません
第3部 依存関係を排除する手法
第25章 依存関係を排除する手法
- 25.1 パラメータの適合
- 25.2 メソッドオブジェクトの取り出し
- 25.3 定義の補完
- 25.4 グローバル参照のカプセル化
- 25.5 静的メソッドの公開
- 25.6 呼び出しの抽出とオーバーライド
- 25.7 Factory Methodの抽出とオーバーライド
- 25.8 getメソッドの抽出とオーバーライド
- 25.9 実装の抽出
- 25.10 インタフェースの抽出
- 25.11 インスタンス委譲の導入
- 25.12 静的setメソッドの導入
- 25.13 リンクによる置き換え
- 25.14 コンストラクタのパラメータ化
- 25.15 メソッドのパラメータ化
- 25.16 パラメータのプリミティブ化
- 25.17 メソッドと変数の引き上げ
- 25.18 依存関係の押し出し
- 25.19 関数ポインタによる関数の置き換え..
- 25.20 getメソッドによるグローバル参照の置き換え
- 25.21 サブクラス化とメソッドのオーバーライド
- 25.22 インスタンス変数の入れ替え
- 25.23 テンプレートによる再定義
- 25.24 テキストによる再定義
付録A リファクタリング
A.1 メソッドの抽出
付録B 用語集
訳者あとがき
索引
著者紹介
訳者紹介