[[パターン指向リファクタリング入門/Factoryによるクラス群の隠蔽]] * メソッドの移動 [#f1bd1e0f] ** 兆候 [#h2f298d3] あるクラスでメソッドが定義されているが、現在または将来にわたって、そのクラスの特性よりも他のクラスの特性の方が、そのメソッドを扱うかそのメソッドに使われることが多い ** 処置 [#vced2156] 同様の本体を持つ新たなメソッドを、それをもっとも多用するクラスに作成する。元のメソッドは、単純な委譲とするか、またはごっそり取り除く。 ** 動機 [#p8be0048] メソッドの移動は、リファクタリングにかかせないものであり、 - クラスの振る舞いが多すぎる場合 - 結合度が高すぎる場合 にメソッドを移動する。 メソッドを移動することで、クラスを単純にし、結果として責任の集合をすっきりした実装に納めることができる。 ** 手順 [#kc9d3c66] + 元のメソッドが使う、または定義されたすべての特性を調べる。これらも移動すべきかどうか考える + 元のクラスのサブクラスおよびスーパークラスにおいて、このメソッドを宣言していないかをチェックする。 -- メソッドが両方のクラスで宣言されている場合、多様性を異動先で表現できない限り、このメソッドを移動してはいけない。 + 移動先のクラスでメソッドを宣言する。 + 元のメソッドから異動先にコードをコピーする。 -- メソッドが移動元のオブジェクトを使っている場合、異動先のメソッドからそれを参照する方法を決める必要がある。 移動先のクラスにその方法がなければ、新たなメソッドに元のオブジェクトへの参照をパラメータとして渡す。 -- メソッドに例外処理が含まれる場合、論理的に例外を処理すべきクラスを決める。 元のクラスにその責任がある場合、例外処理は元のクラスに残しておく。 + 移動先のクラスをコンパイルする + 元のオブジェクトから正しい異動先のオブジェクトを参照する方法を決める -- 移動先のオブジェクトが既存のフィール8度やメソッドから入手可能 -- 元のオブジェクトに異動先のオブジェクトを保持する新たなフィールを作成する + 元のメソッドを委譲メソッドにする。 + コンパイル・テスト + 元のメソッドを削除するか、委譲メソッドとして残すかを決める。 -- 元のメソッドへの参照が多い場合、委譲メソッドとして残す。 -- 元のメソッド削除する場合、このメソッドへのすべての参照を異動先のメソッドへの参照で置き換える。 + コンパイル・テスト ** コメント [#gd12e3dc] #comment