メソッドの抽出の目的
-
メソッドの抽出し、メソッド名を正しく命名することで、そのメソッドの目的を明確にする
-
メソッドの粒度を短くすることでメソッドの再利用性を高める
-
メソッドの粒度を短くすることでオーバーライドのしやすさを高める
特に1番が重要です。長すぎるルーチンは理解するのにとても時間を要します。
一方、メソッドの抽出を行い、適切なメソッド名を命名することで、 内部の実装を見なくとも読み進めていくことが可能 となります。
メソッドの抽出を行うべきコードとは?
同一メソッド内に下記のような箇所が複数存在する場合はメソッドの抽出を検討するべきです。
- コメントが無いと何をしているのか理解できない処理
- 条件分岐やループによってネストが深くなっている処理
抽出するべき処理を探す場合には、メソッドの物理的な長さに着目するのではなく、メソッド名とメソッド本体の意味的な距離の長さに着目するべきです。
メソッドの抽出の手順
実際にメソッドを抽出すべき処理を見つけた場合、どのような手順で行えばよいでしょうか。
下記に手順を記します。
-
新たなメソッドを作成し、メソッドの目的に合わせて適切なメソッド名を命名する。
(※適切なメソッド名のつけ方については『[リーダブルコード](リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) Dustin Boswell https://www.amazon.co.jp/dp/4873115655/ref=cm_sw_r_tw_dp_U_x_OaYSCbX5PDZZJ)』を読むことをお勧めします!) -
抽出対象の処理を手順1で作成した抽出先のメソッドにコピーする。
-
抽出対象のコード内で一時変数が存在する場合、抽出対象のコード内だけで使用されているかを確認する。そうでなければ抽出先の一時変数として定義する。
-
抽出対象のコードが抽出元メソッドのローカルスコープ変数を変更するかを調べる。変更する変数が1つだけ存在する場合はそれを抽出先の戻り値とする。変更する変数が複数ある場合は、このままの状態でメソッドを抽出することはできない。(一時変数の分離を適用する)
-
抽出対象のコードがが抽出元のローカルスコープ変数を使用してるかを調べる。使用している場合それらを抽出先メソッドの引数とする。
-
上記手順でメソッドの抽出が完了。一度コンパイルしてエラーが発生しないことを確認する。
-
抽出対象のコードを抽出したメソッドで置き換える。
※これらの手順はIDEを使用している場合は簡単に行うことができます。
eclipseの場合は抽出対象のコードをドラッグで選択して「Ctrl + Shift + M」
ただし期待通りに抽出が行えたかを目視で確認してください。