質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

266閲覧

メソッドを使いよりすっきりとまとめたい。

shou_hitotose

総合スコア66

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/11/01 03:47

編集2018/11/01 04:15

Java初心者です。現在格子状に値を配置してそれぞれの値を増加させるというプログラムをかなり雑になってしまいましたがこのプログラム自身は書きました。しかし、あまり見た目がよくありません。

 なのでメソッドを使いもう少し整理したいのですがメソッドの使い方に不慣れでうまくまとめることができませんでした。そもそもこれ以上まとめることができるのか。意見をいただけると幸いです。

Java

1class STAR23 { 2 public static void main(String args[]){ 3 final int REGION_SIZE = 20; 4 5 int n,i,j; 6 int n_in_region[][] = new int[REGION_SIZE][REGION_SIZE]; 7 8 for( i = 0; i < REGION_SIZE; i++ ) { 9 for( j = 0; j < REGION_SIZE; j++ ) { 10 n_in_region[i][j] = 0; 11 } 12 } 13 14 for( n = 0; n < 1000; n++ ){ 15 for( i = 0; i < REGION_SIZE; i++ ) { 16 for( j = 0; j < REGION_SIZE; j++ ) { 17 n_in_region[i][j] = one_percent_increase(n_in_region[i][j]); 18 if( i > 0 ) { 19 n_in_region[i][j] += 20 one_percent_increase(n_in_region[i-1][j]) 21 - n_in_region[i-1][j]; 22 } 23 if( i < REGION_SIZE-1 ) { 24 n_in_region[i][j] += 25 one_percent_increase(n_in_region[i+1][j]) 26 - n_in_region[i+1][j]; 27 } 28 } 29 } 30 System.out.print("day " + n + ":\n"); 31 for( i = 0; i < REGION_SIZE; i++ ) { 32 for( j = 0; j < REGION_SIZE; j++ ) { 33 System.out.printf("%3d ",n_in_region[i][j]); 34 } 35 System.out.print("\n"); 36 } 37 } 38 39 return; 40 } 41 42 static int one_percent_increase(int num) { 43 int r; 44 45 r = num; 46 r *= 1.01; 47 if( r < 100 && (int)(Math.random() * 100) < 1 ) { 48 r += 1; 49 } 50 return r; 51 } 52 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2018/11/01 03:54

まずコードをコードブロック(```)で囲んでください。
shou_hitotose

2018/11/01 03:55

すみません。質問に不慣れなもので。ご指摘ありがとうございます
y_waiwai

2018/11/01 04:03

質問文は編集できますんで、ソースコードは<code>ボタンを押して、’’’の枠の中に貼り付けましょう
dice142

2018/11/01 04:03

できてないです。「`」3つをコードの前後に入れてください。あるいはヘルプ参照してください。
shou_hitotose

2018/11/01 04:05

すみません。ちょっとお待ちください。
shou_hitotose

2018/11/01 04:07

こういった形でよろしいでしょうか
dice142

2018/11/01 04:08

大丈夫です。ありがとうございます。
dice142

2018/11/01 04:10

「上手く実行できませんでした」とありますが、質問は「理想の動作をしない原因を知りたい」のか「コードをすっきりさせたい」のかどちらでしょう?
退会済みユーザー

退会済みユーザー

2018/11/01 04:15 編集

プログラミング関係なしに、どういったことを行っているかメタいレベルでのコメントを入れましょう。回答者(レビュアー)に対して、「何をやっているかはコードから読み解いて下さい」という姿勢はちょっとどうかと。 例えば、「// 二次元配列を0で初期化します」など(ここは見れば一目瞭然ではありますが)。また、そうすることで質問者さん自身も見えてくるものがあるかと。(反論、ご指摘があれば歓迎!!)
shou_hitotose

2018/11/01 04:15

コードをすっきりさせたいの方です。
shou_hitotose

2018/11/01 04:17

ppnさん、dice142さん、y_waiwaiさんいろいろとご指導いただきありがとうございます。あらためてお礼申し上げます。
swordone

2018/11/01 05:16

one_percent_increase内のrがdoubleになるとかじゃないとコンパイルエラーでは?
guest

回答4

0

何をしているかまで見てないので、大まかに列挙します。

全体的に

  • Javaの命名規則になるべく従う。

定数以外はキャメルケースを使うなど。

  • for文のカウンタ変数の不要な宣言はしない。

for文の初期化の際に変数宣言も同時にできます。

  • ネストが深くなるようであればcontinueのためのif文に変える

Java

1if (i == 0) continue; 2n_in_region[i][j] += .... 3 - n_in_region[i-1][j];
  • 適宜コメントを入れる
  • 適宜空行を挟む

メソッドを使うなら

  • 処理ごとにまとめる

初期化、計算処理部、表示部など

投稿2018/11/01 04:27

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2018/11/01 04:30

いろいろと面倒なところが多いにもかかわらず回答までしていただきありがとうございます。とりあえずやってみようと思います!
shou_hitotose

2018/11/01 07:52

回答ありがとうございました。また機会があればよろしくおねがいします。
guest

0

ベストアンサー

元のソースコードを残すようにしてリファクタリングしてみました。
ロジック部分をプライベートメソッドに切り出しているだけですが。
まずはここからでどうでしょうか?

package moby.go.test; public class STAR24 { private static int REGION_SIZE = 20; public static void main(String args[]){ int n_in_region[][] = new int[REGION_SIZE][REGION_SIZE]; initializeRegion(n_in_region); for(int n = 0; n < 1000; n++ ){ calcurateRegion(n_in_region); display(n_in_region, n); } return; } static int one_percent_increase(int num) { int r; r = num; r *= 1.01; if( r < 100 && (int)(Math.random() * 100) < 1 ) { r += 1; } return r; } private static void initializeRegion(int[][] n_in_region) { for(int i = 0; i < REGION_SIZE; i++ ) { for(int j = 0; j < REGION_SIZE; j++ ) { n_in_region[i][j] = 0; } } } private static void calcurateRegion(int[][] n_in_region) { for(int i = 0; i < REGION_SIZE; i++ ) { for(int j = 0; j < REGION_SIZE; j++ ) { n_in_region[i][j] = one_percent_increase(n_in_region[i][j]); if( i > 0 ) { n_in_region[i][j] += one_percent_increase(n_in_region[i-1][j]) - n_in_region[i-1][j]; } if( i < REGION_SIZE-1 ) { n_in_region[i][j] += one_percent_increase(n_in_region[i+1][j]) - n_in_region[i+1][j]; } } } } private static void display(int[][] n_in_region, int day) { System.out.print("day " + day + ":\n"); for(int i = 0; i < REGION_SIZE; i++ ) { for(int j = 0; j < REGION_SIZE; j++ ) { System.out.printf("%3d ",n_in_region[i][j]); } System.out.print("\n"); } } }

投稿2018/11/01 04:55

MAKOTO_MOBY

総合スコア193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

名前の付け方とかクラス作るとかは考えず、
元コードはあまり変えずメソッドの切り分けだけやってみました。

Java

1class Main { 2 3 final static int REGION_SIZE = 20; 4 5 public static void main(String args[]){ 6 7 int n_in_region[][] = new int[REGION_SIZE][REGION_SIZE]; 8 9 init_regions(n_in_region); 10 11 for(int day = 0; day < 1000; day++){ 12 increase_regions(n_in_region); 13 14 print_day_header(day); 15 dump_regions(n_in_region); 16 } 17 18 } 19 20 static void init_regions(int region[][]) { 21 for (int i = 0; i < REGION_SIZE; i++) { 22 for (int j = 0; j < REGION_SIZE; j++) { 23 region[i][j] = 0; 24 } 25 } 26 } 27 28 static void print_day_header(int day) { 29 System.out.print("day " + day + ":\n"); 30 } 31 32 static void dump_regions(int region[][]) { 33 for (int i = 0; i < REGION_SIZE; i++) { 34 for (int j = 0; j < REGION_SIZE; j++) { 35 System.out.printf("%3d ", region[i][j]); 36 } 37 System.out.print("\n"); 38 } 39 } 40 41 static void increase_regions(int region[][]) { 42 for (int i = 0; i < REGION_SIZE; i++) { 43 for (int j = 0; j < REGION_SIZE; j++) { 44 region[i][j] = one_percent_increase(region[i][j]); 45 if (i > 0) { 46 region[i][j] += one_percent_increase(region[i-1][j]) - region[i-1][j]; 47 } 48 if (i < REGION_SIZE-1) { 49 region[i][j] += one_percent_increase(region[i+1][j]) - region[i+1][j]; 50 } 51 } 52 } 53 } 54 55 static int one_percent_increase(int num) { 56 int r; 57 58 r = num; 59 r *= 1.01; 60 if( r < 100 && (int)(Math.random() * 100) < 1 ) { 61 r += 1; 62 } 63 return r; 64 } 65} 66

paiza.io で試してます。(1000回ループするとtimeoutしちゃいますが)

投稿2018/11/01 07:35

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2018/11/01 07:36

ご回答いただきありがとうございます!!
shou_hitotose

2018/11/01 07:42

無事問題をかいけつすることが出来ました!
guest

0

もう少し、分けてみました。

package moby.go.test; import java.util.Arrays; public class STAR25 { private static int REGION_SIZE = 20; public static void main(String[] args){ int[][] region = new int[REGION_SIZE][REGION_SIZE]; initializeRegion(region); for (int n = 0; n < 1000; ++n) { calcurateRegion(region); display(region, n); } System.exit(0); } private static void initializeRegion(int[][] region) { for (int elementNumber = 0; elementNumber < REGION_SIZE; ++elementNumber) Arrays.fill(region[elementNumber], 0); } private static void calcurateRegion(final int[][] region) { for (int i = 0; i < REGION_SIZE; ++i) { for(int j = 0; j < REGION_SIZE; ++j) { region[i][j] = increaseOnePercent(region[i][j]); if (i > 0 && (i < (REGION_SIZE - 1))) { region[i][j] = reCalcurateRegion(region[i][j], region[i-1][j]); region[i][j] = reCalcurateRegion(region[i][j], region[i+1][j]); } } } } private static void display(final int[][] region, final int day) { System.out.print("day " + day + ":\n"); for (int i = 0; i < REGION_SIZE; ++i) { for (int j = 0; j < REGION_SIZE; ++j) { System.out.printf("%3d ", region[i][j]); } System.out.print("\n"); } } private static int increaseOnePercent(final int number) { return correct((int)(number * 1.01)); } private static int correct(final int number) { int result = number; return (result < 100 && (Math.random() * 100) < 1)? result+=1 : result; } private static int reCalcurateRegion(final int source, final int number) { return source + increaseOnePercent(number) - number; } }

投稿2018/11/01 06:23

MAKOTO_MOBY

総合スコア193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

madoka9393

2018/11/01 06:33

回答内容には全く関係ありませんが、新たに回答を投稿するのではなく元の回答を編集または追記すればよかったのでは…。
MAKOTO_MOBY

2018/11/01 06:36

おっしゃるとおりです。 申し訳ございません。 以後からそのように致します。
退会済みユーザー

退会済みユーザー

2018/11/01 06:39

私の場合、細かく分けてくか、コメント入れるか、悩むときがちょこちょこあるんですが、判断基準って何がよいのでしょうね。。。分けたメソッドに定義が散らばるの嫌なときは、分けなかったりするんですが、その判断基準ってどうなんだろうなぁ。と。(何が言いたいかよくわからないコメント)
shou_hitotose

2018/11/01 07:37

再度回答いただきありがとうございます!大変助かりました!
shou_hitotose

2018/11/01 07:42

ベストアンサーにしていただきました!また機会があればよろしくおねがいします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問