- ベストアンサー
メソッドの分割(リファクタリング?)
指導教官からプログラム自体には問題はないが長すぎるのでメソッドを分割したほうがよいといわれました。以下に書きます(一部改変) 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 + "例外が発生しました");} }} メソッドの分割のコツはあるのでしょうか?お勧めの本はございますか? 長くてすいません。
- norinorimi
- お礼率88% (148/167)
- Java
- 回答数5
- ありがとう数6
- みんなの回答 (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以外は繰り返す部分を含めて) 別メソッドにする方法もあるでしょう。 その方がわかりやすいかな…。 メソッドを「分割」するというと、「途中で切る」 ような感じがしますが、そうではありません。 だいたいの場合は、「メソッドの中でやっている処理を、 下請けに出す」ような感じで分割します。 自分のところでできることを下請けに出すのは 「作業が増えるだけではないか」と違和感を感じるかもしれませんが、 そのかわりに、可読性がよく、デバッグがしやすくなります。
その他の回答 (4)
- Bonjin
- ベストアンサー率43% (418/971)
まずはMVCに従って分割してみるといいのではないでしょうか。MVCについてはWebで検索してみるとたくさん出てきます。 今回の場合は、入力、処理、出力とはっきりと区別されているので、それぞれを分割すればいいと思います。 もっといえば、入力、処理、出力をインターフェース化して実装することで、もっと柔軟なプログラムができあがります。
お礼
Bonjin 様ありがとうございます。MVCモデルは先ほど調べていて知りました。今勉強中です。 <<インターフェース化して実装 インターフェースは苦手です。同時に勉強せねば。。
補足
諸事情で返事が遅れてすいませんでした。 おかげさまで解決いたしました。 皆様のおかげでよい勉強ができました。 この場をお借りして皆様にお礼申し上げます。
- ngsvx
- ベストアンサー率49% (157/315)
この話はセンスの問題も多分にあるので一概にはいえませんが、 メソッドの処理内容の説明をするときに、「~をして、~をして~をしています」という説明をすると思いますが、その単位に分割して、エディターの1画面に収まりきる程度の長さになればいいと思います。 重要なのは、分割したときに外に出したメソッドの説明をきちんとコメントに書いておくことです。 構造化プログラミングでは、もっと細かく分割する事が推奨されていましたが、オブジェクト指向ではそこまでは必要がないと思います。 それと、#1さんに反するようですが、私は外に出したメソッドをたいていはprotectedで定義しています。 というのは、このように外に出したメソッドは、サブクラスで使うことがしばしばあるためです。
お礼
ngsvx様 ありがとうございます。単位ごとに分割してみます。参考にさせていただきます。オブジェクト指向は難しいですね・・
- kazsharp
- ベストアンサー率37% (16/43)
No2.のkazsharpです。 すいません、URLを張り間違えました。 人によっては不快に感じるかもしれない記事でしたので、本当に申し訳ありませんでした。
- kazsharp
- ベストアンサー率37% (16/43)
細かくメソッドが分割されているプログラムは非常に美しいです。(私が最も心がけていることのひとつです) メソッド分割について詳しく説明されている本はあまりないと思いますが月刊誌の「JavaWorld 2004年2月号」(バックナンバーで買うこともできます)の「オブジェクト指向プログラミングの“ツボ”」で「リファクタリングの実践――メソッドの分割/メソッド・オブジェクト」という記事があります。
お礼
kazsharp様 ありがとうございます。 スポーツ記事にびっくりしました(笑) さっそく月刊誌をチェックしてみます。
関連するQ&A
- 構文がエラーになる
Exception in thread"main"java.lang.NoClassDefFoundError という文章でエラーになります。 import java.io.*; class Sample34 { public static void main (String args[])throws IOException { System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if(res == 1){ System.out.println("1が入力されました。"); } else if(res == 2){ System.out.println("2が入力されました。"); } else{ System.out.println("1か2を入力してください。"); } } }
- 締切済み
- Java
- 今勉強中のjavaで。わからないことがあります。
import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?
- ベストアンサー
- Java
- java ファイル操作
現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。
- 締切済み
- Java
- プログラムの組み合わせ方
java初心者です。 2つのプログラムを組み合わせて1つのプログラムにしたいんですが、イマイチ分かりません。 このプログラムと、 import java.io.*; class Hello2 { public static void main(String[] args) throws IOException { System.out.println("名前を入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str + "さん、こんにちは!"); } } このプログラムを、 import java.io.*; class Sanbai{ public static void main(String[] args) throws IOException { System.out.println("好きな数を入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int x; x = Integer.parseInt(str); System.out.println("あなたの入力した数:" + x); System.out.println("その3倍の数:" + (x*3)); } } 組み合わせて1つのプログラムにするにはどうしたらいいですか?(>_<)
- ベストアンサー
- Java
- 画面出力の際の繰り返しと入力文字チェック
いつもお世話になっております。 System.out.println("数字を入力してください"); InputStreamReader reader = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(reader); String str = br.readLine(); int res = Integer.parseInt(str); と記述して画面に出力させた場合、数字以外を入力するとエラーになりますが、入力文字のチェックが可能な方法をご存知の方お願いします。 もうひとつ、作業が終わった後も"数字を入力してください"と繰り返すプログラムについてもご教授ください。 いつも簡単な質問で申し訳ありません・・。一応逆引き辞典で調べてはいるのですが。。
- ベストアンサー
- Java
- javaでファイル操作し検索するものを作ってます
目的はテキストファイル内の文字列に検索をかけヒットしたものを表示する というものです import java.io.*; class kensakuTest{ public static void main(String[] args)throws IOException{ System.out.println("検索方法を選択してください。\n0:学籍番号で検索\n1:名前で検索\n2:出身地で検索"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //0が選択された場合 if(res == '0'){ System.out.println("学籍番号を入力してください。"); BufferedReader bn = new BufferedReader(new InputStreamReader(System.in)); String str0 = fn.readLine(); char num = str0.charAt(0); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //1が選択された場合 if(res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); char name = str1.charAt(0); try{ FileReader freader = new FileReader("data.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 //部分一致 while((tmp=breader.readLine())!=null){ if(tmp.indexOf(str1) > -1){ System.out.println("結果は:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2'){ System.out.println("出身地を入力してください。"); BufferedReader bl = new BufferedReader(new InputStreamReader(System.in)); String belong = bl.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } } } 現状はここまでできましたが完全一致の検索のやり方がわかりません。 あと問題点があるのですが 読み取るファイルがこのような場合 2000,田中 太郎,福島県 2001,福島 太郎,東京都 名前で福島 と検索をかけたとします この場合答えが 2000,田中 太郎,福島県 2001,福島 太郎,東京都 と表示されてしまいます このカンマで区切られている学籍番号、名前、出身地をうまく分け それぞれ判別する方法はないのでしょうか? よろしくおねがいします。
- ベストアンサー
- Java
- コマンドプロンプトでひらがなの入力が出来ません。
普段グーグル日本語入力を使っています。 OS XPsp2 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは"; String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です"); break; } else if(str2.length() > str.length()){ System.out.println("長すぎます。"); } else if(str2.length() == str.length()){ System.out.println("長さはあっています。"); } else{ System.out.println("短すぎます。"); } } System.out.println("終了"); } }
- ベストアンサー
- Java
- Ctrl+Zが入力されると終了するプログラム
入力された文字をそのまま表示し、[Ctrl]+Zが入力されると終了するプログラムを組んでいるんですがどのように記述すればよいか困っています。アドバイスお願いします。 public static void main(String args[])throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; do{ str = br.readLine(); System.out.println(str); }while(str == null); }
- ベストアンサー
- Java
- charAt(0)について
import java.io.*; class Sample3 { public static void main(String[] args) throws IOException { System.out.println("文字列を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("検索文字を入力してください。"); String str2 = br.readLine(); char ch = str2.charAt(0); int num = str1.indexOf(ch); if(num != -1) System.out.println(str1 + "の" + (num+1) + "番目に「" + ch + "」が見つかりました。"); else System.out.println(str1 + "に「" + ch + "」はありません。"); } char ch = str2.charAt(0);の部分ですが、 charAt(0)というのは ( )に書かれている番号「のみ」を参照するんですよね? だからもし「こ」んちにはと入力しても0番目の「こ」しか出さないはずなのに、 「に」 を入れたらちゃんと「3番目に に が見つかりました」と出るのはなぜですか?
- ベストアンサー
- Java
- Java int sum = 0は必要ですか?
やさしいJavaという本を買ったのですが、良くわからない箇所がありました。 --------------省略----------------- class Sample6 { public static void main(String[] args) throws IOException { System.out.println("整数を3つ入力してください。") ; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; String str1 = br.readLine() ; String str2 = br.readLine() ; String str3 = br.readLine() ; int sum = 0 ; sum += Integer.parseInt(str1) ; -------------------略----------------- int sum = 0 ; とありますが、0と設定しておく必要はありますか? 無いとまずいですか? いきなりこのコードが出てきたと思うのですが どこかに書いてましたっけ?
- ベストアンサー
- Java
お礼
liar_adan 様ありがとうございます。 「省略」に関しては同様ではなく似た感じになるだけです。長すぎて投稿できませんでした(汗) 未だに雰囲気がつかめませんがアドバイスいただいた部分だけでも試してみます。ありがとうございました。