ポリモーフィズムによる条件記述の置き換え【リファクタリング】
状況
- オブジェクトのタイプによって異なる振る舞いを選択する条件記述がある
- タイプコードに対して必要な継承構造が用意されていることが前提。つまり「サブクラスによるタイプコードの置き換え」もしくは「Stateによるタイプコードの置き換え」が適用されていること。複数のcase文がある場合でも、継承構造は1つで良い
対処
- 条件記述の各アクション部をサブクラスでオーバーライドするメソッドに移動する。元のメソッドは抽象化する
メリット
case文などの条件記述が削減され、コードが見やすくなる
新しいタイプを追加する修正作業が、サブクラスの追加と適切なメソッドの用意、という簡単なものになる
- 特に同じ条件分岐の組み合わせがプログラムの多くの場所に現れるような時に、メリットは大きくなる
手順
その条件文が大きなメソッドの一部ならば、その条件文を分離して「メソッドの抽出」を行う
条件文を継承構造の最上位におけるように、必要に応じて「メソッドの移動」を行う
- 例えば、従業員クラスにある従業員タイプによる分岐ならば、従業員タイプ(状態オブジェクト)のクラスに移動する
サブクラスの1つを取り上げて、その条件文メソッドをオーバーライドするようなサブクラスのメソッドを作成し、条件文のアクション部をコピーして適合するよう修正する
- メソッド名は条件文全体のメソッド名と同じになり、中身の処理は対象分岐内の一つの処理になる
コンパイルしてテストする
コピー元である、条件文のアクション部を削除する
コンパイルしてテストする
条件文の他のアクション部についても同じ作業を繰り返す
スーパークラス(状態オブジェクト)のメソッドを抽象化する
楽天ブックス: リファクタリング新装版 - 既存のコードを安全に改善する - マーチン・ファウラー - 9784274050190 : 本