• ベストアンサー

メソッドの分割(リファクタリング?)

指導教官からプログラム自体には問題はないが長すぎるのでメソッドを分割したほうがよいといわれました。以下に書きます(一部改変) try{ System.out.println("1. 2. どちらかを選択してください"); InputStreamReader reader = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(reader); String str = br.readLine(); int res = Integer.parseInt(str); if(!str.matches("[1-2]+")){ System.out.println("1、2から選択してください。"); continue;} if(res == 1){ System.out.println("キーワードを入力"); reader = new InputStreamReader(System.in); br = new BufferedReader(reader); str = br.readLine(); String sql = "SQL文"; ResultSet result = stmt.executeQuery(sql); //vectorにデータを格納 Vector vector1 = new Vector(); String[] array1 = new String[2]; while(result.next()){ array1[0] = result.getString("Res1"); array1[1] = result.getString("Res2"); vector1.addElement(array1); array1 = new String[2];} for(int i = 0;i < vector1.size();i++ ){ String Res1 = null;  String Res2 = null; String[] str1 = (String[])vector1.get(i); Res1 = str1[0]; Res2 = str1[1]; System.out.println("Res1,Res2は" + Res1 + "\t" + Res2);}} if(res == 2){1と同様なので省略・・}} catch(IOException e){ System.out.println(e + "例外が発生しました");} }} メソッドの分割のコツはあるのでしょうか?お勧めの本はございますか? 長くてすいません。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

正直言って、ソースを読んではいませんが、 最後の方、 >if(res == 2){1と同様なので省略・・}} 「省略」できる部分があるということがまずおかしい。 同様な処理ならば、そこを別メソッドにまとめるべきです。 そうすれば if(res == 1){ betuMethod(hituyou, na, hikisuu); }else if(res == 2){ betuMethod(hituyou, na, hikisuu); } のように書けてわかりやすくなります。 この場合の別メソッドはprivate属性でいいと思います。 適切なメソッドの長さについては、個人差がありますが、 「10行以内が望ましい」 という人もいます。 たとえば、前半の、ユーザーに入力を求める部分を 別のメソッド、たとえばgetNumberFromUser()とかいうメソッドにして、 int res; while(true){ res = getNumberFromUser(); if(res == 1 || res == 2)break; System.out.println("1、2から選択してください。"); } のようにもできます。 またこの部分ごと(1, 2以外は繰り返す部分を含めて) 別メソッドにする方法もあるでしょう。 その方がわかりやすいかな…。 メソッドを「分割」するというと、「途中で切る」 ような感じがしますが、そうではありません。 だいたいの場合は、「メソッドの中でやっている処理を、 下請けに出す」ような感じで分割します。 自分のところでできることを下請けに出すのは 「作業が増えるだけではないか」と違和感を感じるかもしれませんが、 そのかわりに、可読性がよく、デバッグがしやすくなります。

norinorimi
質問者

お礼

liar_adan 様ありがとうございます。 「省略」に関しては同様ではなく似た感じになるだけです。長すぎて投稿できませんでした(汗) 未だに雰囲気がつかめませんがアドバイスいただいた部分だけでも試してみます。ありがとうございました。

その他の回答 (4)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.5

まずはMVCに従って分割してみるといいのではないでしょうか。MVCについてはWebで検索してみるとたくさん出てきます。 今回の場合は、入力、処理、出力とはっきりと区別されているので、それぞれを分割すればいいと思います。 もっといえば、入力、処理、出力をインターフェース化して実装することで、もっと柔軟なプログラムができあがります。

norinorimi
質問者

お礼

Bonjin 様ありがとうございます。MVCモデルは先ほど調べていて知りました。今勉強中です。 <<インターフェース化して実装 インターフェースは苦手です。同時に勉強せねば。。

norinorimi
質問者

補足

諸事情で返事が遅れてすいませんでした。 おかげさまで解決いたしました。 皆様のおかげでよい勉強ができました。 この場をお借りして皆様にお礼申し上げます。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

この話はセンスの問題も多分にあるので一概にはいえませんが、 メソッドの処理内容の説明をするときに、「~をして、~をして~をしています」という説明をすると思いますが、その単位に分割して、エディターの1画面に収まりきる程度の長さになればいいと思います。 重要なのは、分割したときに外に出したメソッドの説明をきちんとコメントに書いておくことです。 構造化プログラミングでは、もっと細かく分割する事が推奨されていましたが、オブジェクト指向ではそこまでは必要がないと思います。 それと、#1さんに反するようですが、私は外に出したメソッドをたいていはprotectedで定義しています。 というのは、このように外に出したメソッドは、サブクラスで使うことがしばしばあるためです。

norinorimi
質問者

お礼

ngsvx様 ありがとうございます。単位ごとに分割してみます。参考にさせていただきます。オブジェクト指向は難しいですね・・

  • kazsharp
  • ベストアンサー率37% (16/43)
回答No.3

No2.のkazsharpです。 すいません、URLを張り間違えました。 人によっては不快に感じるかもしれない記事でしたので、本当に申し訳ありませんでした。

参考URL:
http://direct.idg.co.jp/item_detail.command?item_cd=JW_200402&category_cd=MAGAZINE_JW
  • kazsharp
  • ベストアンサー率37% (16/43)
回答No.2

細かくメソッドが分割されているプログラムは非常に美しいです。(私が最も心がけていることのひとつです) メソッド分割について詳しく説明されている本はあまりないと思いますが月刊誌の「JavaWorld 2004年2月号」(バックナンバーで買うこともできます)の「オブジェクト指向プログラミングの“ツボ”」で「リファクタリングの実践――メソッドの分割/メソッド・オブジェクト」という記事があります。

参考URL:
http://sports.yahoo.co.jp/hl?c=sports&d=20050627&a=20050627-00000034-nks-spo
norinorimi
質問者

お礼

kazsharp様 ありがとうございます。 スポーツ記事にびっくりしました(笑) さっそく月刊誌をチェックしてみます。

関連するQ&A