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

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

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

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

Q&A

解決済

4回答

2649閲覧

コーディングについて

katoti09

総合スコア7

Java

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

0グッド

0クリップ

投稿2015/08/20 13:45

独学でJavaを勉強しています。
まだ基本知識があるくらいです。

抜粋してありますが、

numが1ならmethodA()、methodB()を2回おこなう。
それ以外なら1回。ただしmethodB()でNGならそこで処理終了。
methodA()にはnumが1のときは1、それ以外のときは9を渡す。

といったとき、以下のようなコーディングを行ったのですが、
methodAとmethodBの呼び方がわかりにくいコードになってしまっている気がします。

①以下をみやすいコードに修正するにはどのように記述すべきでしょうか。
②みやすいコーディング術を身につけるのに
・おすすめの本
・勉強方法
・考え方
などありましたら教えていただけると助かります。

java

1public class sample1 { 2 3 public static void main(String[] args) { 4 int num = 0; 5 //numに何か値を入力 6 boolean b = method(num); 7 8 // bの値判定処理・・・ 9 } 10 11 private static boolean method(int num){ 12 String flag = ""; 13 if(num == 1){ 14 methodA(1); 15 flag = methodB(); 16 17 if(flag == "OK") 18 { 19 methodA(1); 20 flag = methodB(); 21 if(flag == "OK"){ 22 return true; 23 }else{ 24 return false; 25 } 26 }else{ 27 return false; 28 } 29 }else{ 30 methodA(9); 31 flag = methodB(); 32 if(flag == "OK"){ 33 return true; 34 }else{ 35 return false; 36 } 37 } 38 } 39 40 private static void methodA(int n){ 41 //何か処理 42 } 43 44 private static String methodB(){ 45 String s = "OK"; 46 //条件判定でOKかNGを返す 47 return s; 48 } 49} 50コード

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

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

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

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

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

guest

回答4

0

methodA, methodB の呼び出し部分を actionSub() としてくくりだし、
actionSub() の呼び出しを条件分岐させるというようにしてみました。

java

1 ... 2 private static boolean method(int num) { 3 if (num == 1) { 4 return actionSub(1) ? actionSub(1) : false; 5 } 6 return actionSub(9); 7 } 8 private static boolean actionSub(int n) { 9 methodA(n); 10 return "OK".equals(methodB()); 11 } 12 ...

短くするため3項演算をつかっていますが、その部分は素直に次のように書いてもよいかもしれません。

java

1 if (actionSub(1)) { 2 return actionSub(1); 3 } 4 return false;

投稿2015/08/22 22:22

編集2015/08/23 02:02
katoy

総合スコア22324

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

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

katoti09

2015/08/23 00:22

ご回答ありがとうございます。 なるほど、くくりだすだけでも凄くわかりやすいコードになっています…! また別の考え方を教えて頂き、とても身になります。 本当にありがとうございました…!
guest

0

読みやすい、読みにくい以前に、何のためのコードなんでしょうか?

numが1ならmethodA()、methodB()を2回おこなう。

という辺りがどういう処理をしているのかが伝わらないのです。

例えば、ATMのシステムを考えてみると、

  1. 預入の時は0、引き出しの時は1を入れる
  2. 引き出しの時は1なので、暗証番号の入力を行う
  3. 暗証番号の入力がOKだったら引き出し額を入れる

という感じで処理の流れがありますよね。
これをコードに落としてみるとこんな感じになるのではないでしょうか?

java

1public class ATM { 2 3 public static int MODE_OF_DEPOSIT = 0; 4 public static int MODE_OF_WITHDRAWAL = 1; 5 6 public void static main(String... args){ 7 int mode = getATMMode(); // 具体的な処理はgetATMMode()に実装する 8 if(mode == MODE_OF_WITHDRAWAL) { 9 int identificationNumber = getIdentificationNumber(); 10 if(isCorrect(identificationNumber)) { 11 int money = getMoney(); 12 ... 13 } 14 } 15 } 16}

こんな感じです。

  • メソッド名は具体的に「何を意味する処理なのか」を明示した名前にしましょう
  • クラス名は「そのオブジェクトが何者なのか」を明示した名前にしましょう

そういう話がわかりやすく書かれていてわりかし薄い本に「リーダブルコード」という本があります。目を通してみるといろいろ見えてきますよ。

投稿2015/08/20 14:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

katoti09

2015/08/20 14:56

本物はもう少し複雑で、抜粋してしまったため、なんの処理かわかりにくかったこと申し訳ありません。 ですが、ご回答くださりありがとうございます。 ご指摘内容は、とりいれ おすすめいただいた本も読んでみようとおもいます!
guest

0

①以下をみやすいコードに修正するにはどのように記述すべきでしょうか。

swordoneさんの解答素晴らしいです。

② みやすいコーディング術を身につけるのに
・おすすめの本
・勉強方法
・考え方

クラス単位、メソッド単位での考え方はあまり実践的ではないです。
Java言語で学ぶリファクタリング入門が入門としては最適かと思います。これを読んだ後、自分のコードを見るとどこがまずいかが理解できると思います。まずはそこまでが目標だと思います。

投稿2015/08/20 14:24

編集2015/08/20 14:26
yona

総合スコア18155

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

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

katoti09

2015/08/20 15:00

ご回答の通り、おすすめの本を読んでみて、自身のコードを再度見直してみようと思います。 このような質問にお時間さいていただき誠にありがとうございました!
guest

0

ベストアンサー

numが1とそれ以外の場合で違うのは「methodAの引数」と「各メソッドを行う回数」なので,
共通する部分「methodAとmethodBの実行」はまとめます.
基本的には「同じことをする部分はまとめる」ということを考えるべきかと.
本題から外れますが,methodBはStringで返す必要がありますか?
このコードを見る限り直接booleanで返したほうがわかりやすいかと思うのですが.

だいぶ手を加えましたが,こんな感じでいかがでしょう.

java

1public class sample1 { 2 3 public static void main(String[] args) { 4 int num = 0; 5 //numに何か値を入力 6 boolean b = method(num); 7 8 // bの値判定処理・・・ 9 } 10 11 private static boolean method(int num){ 12 int n = num == 1 ? 1 : 9; //numによってmethodAに渡す引数を分岐 13 int count = num == 1 ? 2 : 1; //次のループの回数を設定 14 for(int i = 0; i < count; i++){ 15 methodA(n); 16 if(!methodB()) return false; //methodB()がfalseを返せばその時点でfalseを返して終了 17 } 18 return true; 19 } 20 21 private static void methodA(int n){ 22 //何か処理 23 } 24 25 private static boolean methodB(){ 26 boolean b = true; 27 //条件判定でtrueかfalseを返す 28 return b; 29 } 30}

あるいは,methodAとmethodBをまとめたメソッドsubMethodを作れれば,

java

1 private static boolean method(int num){ 2 return subMethod(num) && (num != 1 || subMethod(num)); 3 } 4 5 private static boolean subMethod(int num){ 6 methodA(num == 1 ? 1 : 9); 7 return methodB(); 8 }

これでも行けると思います(ただしこの書き方は繰り返しがせいぜい2回程度の時).

投稿2015/08/20 14:03

編集2015/08/23 02:12
swordone

総合スコア20649

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

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

katoti09

2015/08/20 14:52

ご回答、誠にありがとうございます。 確かにおっしゃる通りStringで返す必要はありませんでした… とても分かり易いコードに直していただき、勉強が足りないなと身にしみました。 共通部分はまとめるということをコーディングする際にとりいれていきます。 本当にありがとうございました。
swordone

2015/08/20 15:36

このコードで解決したならもう関係ないかもしれませんが, Stringを"=="で比較するのは必ずしも望む結果が得られないので注意してください. 文字列の比較をしたければequalsメソッドを使ってください.
katoti09

2015/08/23 00:14

習ったのにそのことを失念していました…追記ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問