技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Stateによるタイプコードの置き換え【リファクタリング】

状況

  • クラスの振る舞いに影響するタイプコードがあるが、サブクラス化はできない

if文やcase文を削減する「ポリモーフィズムによる条件記述の置き換え」を適用するための土台づくりに使われます。

土台づくりには他に「サブクラスによるタイプコードの置き換え」がありますが、
オブジェクトが生成された後に、タイプコードが変化する場合と、
すでに別の理由で、タイプコードを持つクラスがサブクラス化されている場合に
このリファクタリングを適用します。

例えば従業員クラスの中に、従業員の種別に応じて異なる値を返すように
case文が組み込まれた給与計算メソッドなどが、このリファクタリングの対象となります。


対処

  • 新しいクラスである状態オブジェクトを作成、サブクラス化し、タイプコードを置き換える


メリット

  • ポリモーフィズムによる条件記述の置き換え」を容易に実行できるようになる
    • 新たなタイプを追加するときの改修が、サブクラスとメソッドを追加する、といった簡単なものにできる


手順

  • タイプコードに「自己カプセル化フィールド」を適用する

  • 新しいクラス(状態オブジェクト)を作成し、タイプコードの目的に沿った名称をつける

  • 各タイプコードに対して状態オブジェクトのサブクラスを追加する。

  • 状態オブジェクトの中に抽象の問い合わせメソッドを作成し、タイプコードを返すようにする

  • 状態オブジェクトのサブクラスごとに問い合わせメソッドをオーバーライドし、適切なタイプコードを返すようにする

  • コンパイルする

  • 元のクラスの中に、新しい状態オブジェクトを参照するフィールドを作成する

  • 元のクラスにあるタイプコードの問い合わせメソッドを、状態オブジェクトに委譲するように修正する

  • 元のクラスにあるタイプコードのsetメソッドを、適当な状態オブジェクトのサブクラスのインスタンスを割り当てるように修正する

    • setメソッドは「自己カプセル化フィールド」手順によって作成されるメソッド
    • 状態オブジェクト内に、タイプコードによる条件分岐を持ったサブクラスのインスタンス作成メソッドを作成する
    • 元のクラスのsetメソッドを状態オブジェクトのインスタンス作成メソッドへの参照に置き換える


楽天ブックス: リファクタリング新装版 - 既存のコードを安全に改善する - マーチン・ファウラー - 9784274050190 : 本