リファクタリングの種類とそれぞれの適用方法

ソースコードの保守性・再利用性を高めるために、プログラムの外部的な振る舞いを変えずにソースコードを修正することをリファクタリングと呼びます。ここではそのリファクタリングの種類と、それぞれの方法について解説します。

基本方針

  • 外部的な振る舞いは変えない
  • 内部構造を洗練していく
  • 作業は一歩ずつ進める
  • 安全に変更を行う
UMLモデリングの本質 4章1「リファクタリングの概要」

リファクタリングを行うべき兆候は、コードの臭いにあります。

リファクタリングの種類

メソッドの抽出

  • メソッドの抽出/メソッドのインライン化
  • 一時変数のインライン化
  • 問い合わせによる一時変数の置き換え
  • 説明用変数の導入
  • 一時変数の分離
  • パラメータへの代入の除去
  • メソッドオブジェクトによるメソッドの置き換え
  • アルゴリズムの取り替え

オブジェクト間での特性の移動

  • メソッドの移動
  • フィールドの移動
  • クラスの抽出/クラスのインライン化
  • 委譲の隠蔽/仲介人の除去
  • 外部メソッドの導入
  • 局所的拡張の導入

データの再編成

  • 自己カプセル化フィールド
  • オブジェクトによるデータ値の置き換え
  • 値から参照への変更/参照から値への変更
  • オブジェクトによる配列の置き換え
  • 観察されるデータの複製 (同期)
  • 単方向関連の双方向への変更/双方向関連の単方向への変更
  • シンボリック定数によるマジックナンバーの置き換え
  • フィールドのカプセル化
  • コレクションのカプセル化
  • データクラスによるレコードの置き換え
  • クラスによるタイプコードの置き換え
  • サブクラスによるタイプコードの置き換え
  • State/Strategyによるタイプコードの置き換え
  • フィールドによるサブクラスの置き換え

条件記述の単純化

  • 条件記述の分解
  • 条件記述の統合
  • 重複した条件記述の断片の統合
  • 制御フラグの削除
  • ガード節による入れ子条件記述の置き換え
  • ポリモーフィズムによる条件記述の置き換え
  • ヌルオブジェクトの導入
  • 表明の導入

メソッド呼び出しの単純化

  • メソッド名の変更
  • 引数の追加/引数の削除
  • 問い合わせと更新の分離
  • メソッドのパラメータ化
  • 明示的なメソッド群による引数の置き換え
  • オブジェクトそのものの受け渡し
  • メソッドによる引数の置き換え
  • 引数オブジェクトの導入
  • setメソッドの削除
  • メソッドの隠蔽
  • Factory Methodによるコンストラクタの置き換え
  • ダウンキャストのカプセル化
  • 例外によるエラーコードの置き換え
  • 条件判定による例外の置き換え

継承の取り扱い

  • フィールドの引き上げ/フィールドの引き下げ
  • メソッドの引き上げ/メソッドの引き下げ
  • コンストラクタ本体の引き上げ
  • サブクラスの抽出
  • スーパークラスの抽出
  • インターフェイスの抽出
  • 階層の平坦化
  • Template Methodの形成
  • 委譲による継承の置き換え/継承による委譲の置き換え

大きなリファクタリング

  • 継承の分割
  • 手続き的な設計からオブジェクトへの変換
  • プレゼンテーションとドメインの分離
  • 階層の抽出

参考

参考書