![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
指導教官からプログラム自体には問題はないが長すぎるのでメソッドを分割したほうがよいといわれました。以下に書きます(一部改変)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# このプログラミング誰か教えてください 9 2022/04/22 18:50
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日本の教育って時間が無い中で...
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
javaの質問です 次の機能を有す...
-
【sendkeysメソッドが動かずに...
-
final修飾子を使っているのに、...
-
エクセルVBAにおけるON TIMEメ...
-
「初心者です」-Xlint: depreca...
-
エクセルのマクロでプリンタを...
-
ExcelVBAのプログラムをJavaへ変換
-
onClickで関数呼出し後に、結果...
-
PDFファイルから別ウィンドウで...
-
VB.netで、シリアル通信のタイ...
-
3つの倍精度浮動小数点値の平均...
-
java 飾子を付けること(public...
-
URI Too Long エラーログについて
-
ジェネリックスに関して
-
C#で右からnカラム目に文字を挿...
-
Strutsで「setterメソッドが見...
-
VB.NET イベントハンドラの意識...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
final修飾子を使っているのに、...
-
JSPで<SELECT>の中にDBから持っ...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
VBPをダブルクリックするとたま...
-
onClickで関数呼出し後に、結果...
-
コマンドプロンプト実行後に画...
-
配列のメソッド
-
日本の教育って時間が無い中で...
-
Refreshメソッドの使い方
-
mainメソッドのthrows節で設定...
-
【sendkeysメソッドが動かずに...
-
C# 演算 最大値 最小値 表現の仕方
-
VBA コピーが出来ません…!
-
Application.Wait の参照設定
-
for文(拡張)内の変数(ローカ...
-
ウィンドウを最前面にできません
おすすめ情報