クラスの抽出【リファクタリング】
状況
- クラスの責務が明確であるとは言い難く、複数のクラスに分けてなされるべき作業を一つのクラスで行なっている
例えば、Personというクラスに電話番号に関するフィールドやメソッドが存在する場合です。
対処
- クラスを新たに作成し、適切なフィールドとメソッドを元のクラスから移動する
先述の例で言えば、新たにTelophoneNumberというクラスを作成し、電話番号に関するフィールドやメソッドを移動します。
メリット
クラスの責務が明確になり、可読性が向上する
変更が容易になる
それぞれのクラスにロックをかければ、並行プログラムの実効性が向上する
手順
クラスの責務を明確化し、切り出す対象を決める
切り出された責務を記述する新たなクラスを作る
- 元のクラスの名称変更の余地も検討する
元のクラスから新たなクラスにリンクを貼る
移動しようとする各フィールドに「フィールドの移動」を適用する
移動が終わるごとにコンパイルしてテストする
「メソッドの移動」を適用して、元のクラスから新たなクラスにメソッドを移動する。まずは低レベルなメソッド(呼ぶよりも、呼ばれる方が多いメソッド)から移動を始める
移動が終わるごとにコンパイルしてテストする
各クラスのインターフェースを見直して、減らす
新たなクラスを公開するか決定する。公開する場合、どの利用者がフィールド等をいつ変更するかを念頭に置いて、以下の2種類から選択する
- どのオブジェクトからも新しいクラスのオブジェクトに対する変更を許可する。その結果、新しいクラスのオブジェクトは参照オブジェクトになる
- 元のクラスを介した場合にのみ、 新しいクラスのオブジェクトに対する変更を許可する
楽天ブックス: リファクタリング新装版 - 既存のコードを安全に改善する - マーチン・ファウラー - 9784274050190 : 本