プログラムを書いていくと、どんどんとメソッドの中身が長くなっていきがち。長くなりすぎてコードが読みにくくなってしまったら、処理がまとまっている部分を新たなメソッドとして抽出する。
メソッドを抽出する手順
- ・新しいメソッドに名前をつける
- 何をするか分かるような名前にする。
- ・元のメソッドからコードをコピー
- コピーしたメソッドはprivateにしておく。
- ・メソッド内のローカル変数を検討
- コピーしたコードの中でのみ使われている変数をローカル変数として宣言する。
- ・メソッドへのパラメータを検討
- 他から与えられる変数がある場合はメソッドのパラメータ(引数)にする。
- ・メソッドの戻り値を検討
- 値を変更している変数があったら、メソッドの戻り値にする。
ここまででいったんコンパイルしてチェック。新しいメソッドの作成と前のコードの削除は同時に行わない。何事もステップ・バイ・ステップ。
- ・元のコードを新しいメソッドの呼び出しに置き換える
- ・元のメソッドに使われないローカル変数があったら削除
コンパイルして確認。以上でメソッドの抽出が終了。
このメソッドを抽出するリファクタリングは普段から割りと行っている。そのとき問題になるのは名前の付け方。この分かりやすい名前をつけるというのが一番重要で難しい。基本的には「動詞+名詞」の順番にして、小文字から始めて2つ目以降の単語は大文字から始める。
参考:http://www.tcct.zaq.ne.jp/ayato/programming/java/codeconv_jp
さて、どのくらいのコードになったら「長い」と感じるのだろうか。参考にしている本(『Java言語で学ぶリファクタリング入門』)になるほどと思う判断方法が載っていた。
コメントを書きたくなる度合い
「何々を行う」とコメントが入る位置で処理のまとまりが見えるし、そのようなコメントが複数出てきたらメソッドの抽出をするべきだろう。
あとちょっと気になるのはメソッドを増やすことによって呼び出しのオーバーヘッドは問題にならないのかということ。まあそんなシビアな状況というはあまりないだろうし、今のコンパイラの最適化ならそうは問題にならないのかな。それよりも見やすくてメンテナンスしやすいコードにするほうが重要だろう。それによってもっとよいアルゴリズムを見つけられるかもしれないし。