関数群のクラスへの集約
動機
共通のデータに対して互いに関わりの深い処理を行う一群の関数があれば、クラスを定義するチャンスと考える。(共通データは通常は関数呼び出しの際に引数として渡さる。)クラスを使うことで、これらの関数が共有する環境がより明示的になり、関数の引数が大幅に減ることで、オブジェクト内の関数呼び出しを単純化できます。そうしたオブジェクトをシステムの他の部分に参照として渡すのも容易になる。
このリファクタリングは既存の関数群を体系化するだけではなく、他で断片的に計算を行っている箇所を特定し、新たなクラスのメソッドとしてリファクタリングする良い機会も与えてくれる。
手順
- 関数間で共有しているデータのレコードに「レコードのカプセル化」を施す。
関数間で共有しているデータが、レコード構造としてまとめられていない場合は、「パラメータオブジェクトの導入」を施し、それらをまとめるレコードを作る。 - 「関数の移動」を適用して、共通のレコードを扱う関数をそれぞれ、新たなクラスへと移す。
関数呼び出しの引数のうち、クラスのメンバになっているものは、引数のリストから取り除くことができる。 - データを操作するロジックの断片があればそれぞれ、「関数の抽出」で抽出してクラスに移す。