サブクラスの抽出【リファクタリング】
状況
- あるクラスの特定のインスタンスだけに必要な特性がある
対処
- その一部の特性を持つサブクラスを作成する
メリット
- クラス内の記述量が減り、可読性が上がる
「クラスの抽出」と比較して容易ではありますが、制約があります。
オブジェクトが生成された後は、クラスに基づく振る舞いを変更することができません。
また、1種類のバリエーションしか表現することができません。
手順
元のクラスに新しいサブクラスを定義する
新しいサブクラスにコンストラクタを用意する
スーパークラスのコンストラクタへの呼び出しを全て見つける。もしそれらがサブクラスを必要とするなら、新しいコンストラクタへの呼び出しに置き換える
「メソッドの引き下げ」と「フィールドの引き下げ」を適用して、一つずつ特性をサブクラスに移動する
継承階層で表現できる情報を示すフィールドを探す(通常boolean型かタイプコード)。これを「自己カプセル化フィールド」を適用して削除する。さらに「ポリモーフィズムによる条件記述の置き換え」を適用して、定数を返すポリモーフィックなgetメソッド(定数を返す)に置き換える。
引き下げが終わるごとに、コンパイルしてテストする
楽天ブックス: リファクタリング新装版 - 既存のコードを安全に改善する - マーチン・ファウラー - 9784274050190 : 本