リファクタリングの種類とそれぞれの適用方法
ソースコードの保守性・再利用性を高めるために、プログラムの外部的な振る舞いを変えずにソースコードを修正することをリファクタリングと呼びます。ここではそのリファクタリングの種類と、それぞれの方法について解説します。
基本方針
- 外部的な振る舞いは変えない
- 内部構造を洗練していく
- 作業は一歩ずつ進める
- 安全に変更を行う
UMLモデリングの本質 4章1「リファクタリングの概要」
リファクタリングを行うべき兆候は、コードの臭いにあります。
リファクタリングの種類
メソッドの抽出
- メソッドの抽出 / メソッドのインライン化
- 一時変数のインライン化
- 問い合わせによる一時変数の置き換え
- 説明用変数の導入
- 一時変数の分離
- パラメータへの代入の除去
- メソッドオブジェクトによるメソッドの置き換え
- アルゴリズムの取り替え
オブジェクト間での特性の移動
- メソッドの移動
- フィールドの移動
- クラスの抽出 / クラスのインライン化
- 委譲の隠蔽 / 仲介人の除去
- 外部メソッドの導入
- 局所的拡張の導入
データの再編成
- 自己カプセル化フィールド
- オブジェクトによるデータ値の置き換え
- 値から参照への変更 / 参照から値への変更
- オブジェクトによる配列の置き換え
- 観察されるデータの複製 (同期)
- 単方向関連の双方向への変更 / 双方向関連の単方向への変更
- シンボリック定数によるマジックナンバーの置き換え
- フィールドのカプセル化
- コレクションのカプセル化
- データクラスによるレコードの置き換え
- クラスによるタイプコードの置き換え
- サブクラスによるタイプコードの置き換え
- State / Strategyによるタイプコードの置き換え
- フィールドによるサブクラスの置き換え
条件記述の単純化
- 条件記述の分解
- 条件記述の統合
- 重複した条件記述の断片の統合
- 制御フラグの削除
- ガード節による入れ子条件記述の置き換え
- ポリモーフィズムによる条件記述の置き換え
- ヌルオブジェクトの導入
- 表明の導入
メソッド呼び出しの単純化
- メソッド名の変更
- 引数の追加 / 引数の削除
- 問い合わせと更新の分離
- メソッドのパラメータ化
- 明示的なメソッド群による引数の置き換え
- オブジェクトそのものの受け渡し
- メソッドによる引数の置き換え
- 引数オブジェクトの導入
- setメソッドの削除
- メソッドの隠蔽
- Factory Methodによるコンストラクタの置き換え
- ダウンキャストのカプセル化
- 例外によるエラーコードの置き換え
- 条件判定による例外の置き換え
継承の取り扱い
- フィールドの引き上げ / フィールドの引き下げ
- メソッドの引き上げ / メソッドの引き下げ
- コンストラクタ本体の引き上げ
- サブクラスの抽出
- スーパークラスの抽出
- インターフェイスの抽出
- 階層の平坦化
- Template Methodの形成
- 委譲による継承の置き換え / 継承による委譲の置き換え
大きなリファクタリング
- 継承の分割
- 手続き的な設計からオブジェクトへの変換
- プレゼンテーションとドメインの分離
- 階層の抽出