
指導教官からプログラム自体には問題はないが長すぎるのでメソッドを分割したほうがよいといわれました。以下に書きます(一部改変)
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 + "例外が発生しました");}
}}
メソッドの分割のコツはあるのでしょうか?お勧めの本はございますか?
長くてすいません。
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以外は繰り返す部分を含めて)
別メソッドにする方法もあるでしょう。
その方がわかりやすいかな…。
メソッドを「分割」するというと、「途中で切る」
ような感じがしますが、そうではありません。
だいたいの場合は、「メソッドの中でやっている処理を、
下請けに出す」ような感じで分割します。
自分のところでできることを下請けに出すのは
「作業が増えるだけではないか」と違和感を感じるかもしれませんが、
そのかわりに、可読性がよく、デバッグがしやすくなります。
liar_adan 様ありがとうございます。
「省略」に関しては同様ではなく似た感じになるだけです。長すぎて投稿できませんでした(汗)
未だに雰囲気がつかめませんがアドバイスいただいた部分だけでも試してみます。ありがとうございました。
No.5
- 回答日時:
まずはMVCに従って分割してみるといいのではないでしょうか。
MVCについてはWebで検索してみるとたくさん出てきます。今回の場合は、入力、処理、出力とはっきりと区別されているので、それぞれを分割すればいいと思います。
もっといえば、入力、処理、出力をインターフェース化して実装することで、もっと柔軟なプログラムができあがります。
この回答への補足
諸事情で返事が遅れてすいませんでした。
おかげさまで解決いたしました。
皆様のおかげでよい勉強ができました。
この場をお借りして皆様にお礼申し上げます。
Bonjin 様ありがとうございます。MVCモデルは先ほど調べていて知りました。今勉強中です。
<<インターフェース化して実装
インターフェースは苦手です。同時に勉強せねば。。
No.4
- 回答日時:
この話はセンスの問題も多分にあるので一概にはいえませんが、
メソッドの処理内容の説明をするときに、「~をして、~をして~をしています」という説明をすると思いますが、その単位に分割して、エディターの1画面に収まりきる程度の長さになればいいと思います。
重要なのは、分割したときに外に出したメソッドの説明をきちんとコメントに書いておくことです。
構造化プログラミングでは、もっと細かく分割する事が推奨されていましたが、オブジェクト指向ではそこまでは必要がないと思います。
それと、#1さんに反するようですが、私は外に出したメソッドをたいていはprotectedで定義しています。
というのは、このように外に出したメソッドは、サブクラスで使うことがしばしばあるためです。
No.3
- 回答日時:
No2.のkazsharpです。
すいません、URLを張り間違えました。
人によっては不快に感じるかもしれない記事でしたので、本当に申し訳ありませんでした。
参考URL:http://direct.idg.co.jp/item_detail.command?item …
No.2
- 回答日時:
細かくメソッドが分割されているプログラムは非常に美しいです。
(私が最も心がけていることのひとつです)メソッド分割について詳しく説明されている本はあまりないと思いますが月刊誌の「JavaWorld 2004年2月号」(バックナンバーで買うこともできます)の「オブジェクト指向プログラミングの“ツボ”」で「リファクタリングの実践――メソッドの分割/メソッド・オブジェクト」という記事があります。
参考URL:http://sports.yahoo.co.jp/hl?c=sports&d=20050627 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
JSPで<SELECT>の中にDBから持っ...
-
0歳児の指しゃぶりに関して
-
DAOのExcelVBAにてAccessのデー...
-
エクセルVBAにおけるON TIMEメ...
-
worksheets & rows メソッドは...
-
VBPをダブルクリックするとたま...
-
boolean型のフィールドとゲッタ...
-
C#でtrimができません
-
mainメソッドのthrows節で設定...
-
Range クラスのAutoFitプロパテ...
-
execute()
-
final修飾子を使っているのに、...
-
lightboxやfancyboxなどのモー...
-
printStackTrace()メソッドに関...
-
Lightboxのグループをループさ...
-
PDFファイルから別ウィンドウで...
-
処理内容がほぼ同じメソッドの...
-
ディレクトリの階層構造をツリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
0歳児の指しゃぶりに関して
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
boolean型のフィールドとゲッタ...
-
Labelコントロールに数字を代入...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
eclipse-Tomcatでのデバッグに...
-
CALLされていないメソッドを見...
-
FEM解析の読み方は?
-
エクセルVBAにおけるON TIMEメ...
-
コマンドプロンプト実行後に画...
-
Application.Wait の参照設定
-
VBA コピーが出来ません…!
-
drawStringで文字間隔の調整
おすすめ情報