電子書籍の厳選無料作品が豊富!

指導教官からプログラム自体には問題はないが長すぎるのでメソッドを分割したほうがよいといわれました。以下に書きます(一部改変)
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 + "例外が発生しました");}
}}
メソッドの分割のコツはあるのでしょうか?お勧めの本はございますか?
長くてすいません。

A 回答 (5件)

正直言って、ソースを読んではいませんが、


最後の方、

>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以外は繰り返す部分を含めて)
別メソッドにする方法もあるでしょう。
その方がわかりやすいかな…。

メソッドを「分割」するというと、「途中で切る」
ような感じがしますが、そうではありません。
だいたいの場合は、「メソッドの中でやっている処理を、
下請けに出す」ような感じで分割します。
自分のところでできることを下請けに出すのは
「作業が増えるだけではないか」と違和感を感じるかもしれませんが、
そのかわりに、可読性がよく、デバッグがしやすくなります。
    • good
    • 0
この回答へのお礼

liar_adan 様ありがとうございます。

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

お礼日時:2005/06/27 13:01

まずはMVCに従って分割してみるといいのではないでしょうか。

MVCについてはWebで検索してみるとたくさん出てきます。

今回の場合は、入力、処理、出力とはっきりと区別されているので、それぞれを分割すればいいと思います。
もっといえば、入力、処理、出力をインターフェース化して実装することで、もっと柔軟なプログラムができあがります。

この回答への補足

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

補足日時:2005/07/12 08:42
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/27 22:29

この話はセンスの問題も多分にあるので一概にはいえませんが、



メソッドの処理内容の説明をするときに、「~をして、~をして~をしています」という説明をすると思いますが、その単位に分割して、エディターの1画面に収まりきる程度の長さになればいいと思います。

重要なのは、分割したときに外に出したメソッドの説明をきちんとコメントに書いておくことです。

構造化プログラミングでは、もっと細かく分割する事が推奨されていましたが、オブジェクト指向ではそこまでは必要がないと思います。

それと、#1さんに反するようですが、私は外に出したメソッドをたいていはprotectedで定義しています。
というのは、このように外に出したメソッドは、サブクラスで使うことがしばしばあるためです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/27 17:51

No2.のkazsharpです。


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

参考URL:http://direct.idg.co.jp/item_detail.command?item …
    • good
    • 0

細かくメソッドが分割されているプログラムは非常に美しいです。

(私が最も心がけていることのひとつです)

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

参考URL:http://sports.yahoo.co.jp/hl?c=sports&d=20050627 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/27 13:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!