段階的リファクタリング戦略
目的
既存の動作するコードを壊さずに、ドメインオブジェクト設計へ段階的に移行する。
手順
Step 1: プリミティブを値オブジェクトに置き換える(低リスク)
- Stringのフィールドを値オブジェクトに置き換える(型の変更のみ)
- コンストラクタでバリデーションを集約
Step 2: 散らばったロジックをドメインオブジェクトに移す
- サービス層の条件分岐・計算をドメインオブジェクトのメソッドとして移動
- テストを先に書いてから移動する
Step 3: コレクションをファーストクラスコレクションに置き換える
List<X>を渡している場所を特定し、コレクションオブジェクトに包む
Step 4: サービス層を薄くする
- ドメインオブジェクトが業務ロジックを持つようになったら、サービス層のコードを整理
チェックリスト
- 各ステップの前後でテストが通ることを確認した
- 1コミットで複数ステップを混在させていないか
- 新しいドメインオブジェクトにテストを書いたか
出典
現場で役立つシステム設計の原則(増田亨)第9章 / Refactoring(Fowler)