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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

4回答

2628閲覧

見やすいif文の書き方について

teityann1225

総合スコア158

Java

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/02/01 07:27

編集2020/02/01 09:43

#実現したいこと
カラーセンサーからの値によって、現在何色なのかを判別するif文を書いているのですが、
条件が多くなってしまい、汚いif文になってしまいました。
きれいに書く方法はありますでしょうか?
colorOutputはenumです。
よろしくお願いします。

#現在のコード
####分岐部分

if(detectedColor.red>=0.2 &&detectedColor.red<0.4 &&detectedColor.green>=0.45 &&detectedColor.blue<0.2){ //yellow actions colorOutput = ColorThing.yellow; }else if(detectedColor.red>=0.3 &&detectedColor.green>=0.2 &&detectedColor.green<0.48 &&detectedColor.blue<0.3){ //red actions colorOutput = ColorThing.red; }else if(detectedColor.red<0.25 &&detectedColor.green>=0.4 &&detectedColor.blue>=0.2 &&detectedColor.blue<0.27){ //green actions colorOutput = ColorThing.green; }else if (detectedColor.red<0.25 &&detectedColor.green>=0.4 &&detectedColor.blue>=0.27){ //blue actions colorOutput = ColorThing.blue; }else { //actions when unreadable colorOutput = ColorThing.cantRead; }

####enum部分

public enum ColorThing { yellow, red, green, blue, cantRead, outOfRange }; ColorThing colorOutput = ColorTHing.cantRead;

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

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

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

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

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

m.ts10806

2020/02/01 08:37

なんでしょう「きれい」って。 個人の感覚によりすぎると得たいアドバイスは得られないと思います。 せめて方向性は指示してください
guest

回答4

0

メソッドにしてはいかがですか?
ColorThingのメソッドにしてみました。

java

1class Color { 2 double red, green, blue; 3 4 Color(double red, double green, double blue) { 5 this.red = red; 6 this.green = green; 7 this.blue = blue; 8 } 9} 10 11enum ColorThing { 12 yellow, red, green, blue, cantRead, outOfRange; 13 14 public static ColorThing from(Color color) { 15 if (inRange(color, 0.2, 0.4, 0.45, 1.01, 0.0, 0.2)) { 16 return yellow; 17 } else if (inRange(color, 0.3, 1.01, 0.2, 0.48, 0.0, 0.3)) { 18 return red; 19 } else if (inRange(color, 0.0, 0.25, 0.4, 1.01, 0.2, 0.27)) { 20 return green; 21 } else if (inRange(color, 0.0, 0.25, 0.4, 1.01, 0.27, 1.01)) { 22 return blue; 23 } else { 24 return cantRead; 25 } 26 } 27 28 private static boolean inRange(Color color, 29 double redMin, double redOver, 30 double greenMin, double greenOver, 31 double blueMin, double blueOver) { 32 return inRange(color.red, redMin, redOver) 33 && inRange(color.green, greenMin, greenOver) 34 && inRange(color.blue, blueMin, blueOver); 35 } 36 37 private static boolean inRange(double color, double min, double over) { 38 return min <= color && color < over; 39 } 40}; 41 42public class Main { 43 44 public static void main(String[] args) { 45 Color detectColor = new Color(0.2, 0.5, 0.7); 46 ColorThing colorThing = ColorThing.from(detectColor); 47 System.out.println(colorThing); 48 } 49}

投稿2020/02/01 08:00

編集2020/02/01 08:37
shiracamus

総合スコア5406

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

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

0

ベストアンサー

まずメソッドに切り出すだけでもかなり読み易くなるように思います。
後はこんな工夫ができそうです。

  • 早期returnの活用 (elseの排除)
  • 比較演算子の向きを揃える
  • 冗長でも意味が分かり易くなるならば括弧を使う

Java

1// どのクラスに置くと分かり良いかは設計に依ります。 2// 場合に依ってはColorThingに持たせても良いかも。 3private static ColorThing selectColorAction(double r, double g, double b) { 4 if((0.2 <= r && r < 0.4) && (0.45 <= g) && (b < 0.2)) { 5 return ColorThing.yellow; 6 } 7 if((0.3 <= r) && (0.2 <= g && g < 0.48) && (b < 0.3) { 8 return ColorThing.red; 9 } 10 ... 11 12 // 例外を投げるようにしても良いかもしれません。 13 return ColorThing.cantRead; 14}

Java

1colorOutput = selectColorAction( 2 detectedColor.red, detectedColor.green, detectedColor.blue 3);

投稿2020/02/01 07:40

編集2020/02/01 07:45
LouiS0616

総合スコア35660

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

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

teityann1225

2020/02/01 09:47 編集

修正してみました。 private static ColorCode selectColorAction(double r, double g, double b,int p){ if (p<80){ return ColorCode.outOfRange; } if ((0.2 <= r && r < 0.4) && (0.45 <= g) && (b < 0.2)){ return ColorCode.yellow; } if ((0.3 <= r) && (0.2 <= g && g < 0.48) && (b < 0.3)){ return ColorCode.red; } if ((r < 0.25) && (0.4 <= g) && (0.2 <=b && b < 0.27)){ return ColorCode.green; } if ((r < 0.25) && (0.4 <= g) && (0.27 <= b)){ return ColorCode.blue; } return ColorCode.inRange; }
LouiS0616

2020/02/01 10:03 編集

既出の回答(私のものも・私以外のものも)で問題無いのであればBAを選んで解決済みにして下さい。 そうでないのであれば具体的に何が都合に合わないのか書いて下さい。 あるいはもっと回答が出揃うまで様子を見たいのでしょうか。
guest

0

私はx軸が揃っているコードが見やすいです。

java

1static ColorThing getInstance( double r, double g, double b ) 2{ 3 if( 0.2 <= r && r < 0.4 && 0.45 <= g && b < 0.2 ) return yellow; 4 if( 0.3 <= r && 0.2 <= g && g < 0.48 && b < 0.3 ) return red; 5 if( r < 0.25 && 0.4 <= g && 0.2 <= b && b < 0.27 ) return green; 6 if( r < 0.25 && 0.4 <= g && 0.27 <= b) return blue; 7 8 return cantRead; 9}

投稿2020/02/01 10:00

t-_.

総合スコア55

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

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

0

条件の部分をどう書けば見易いのかは人それぞれかと思いますので, 私ならこれくらいで妥協(?)するかもしれません.

java

1enum ColorThing { 2 yellow, 3 red, 4 green, 5 blue, 6 cantRead, 7 outOfRange; 8 9 static ColorThing getInstance(double r, double g, double b) { 10 if(0.2 <= r && r < 0.4 && 0.45 <= g && b < 0.2) return yellow; 11 if(0.3 <= r && 0.2 <= g && g < 0.48 && b < 0.3) return red; 12 if(r < 0.25 && 0.4 <= g && 0.2 <= b && b < 0.27) return green; 13 if(r < 0.25 && 0.4 <= g && 0.27 <= b) return blue; 14 return cantRead; 15 } 16}; 17 18public class Main { 19 public static void main(String[] args) throws Exception { 20 class DetectedColor { 21 double red, green, blue; 22 DetectedColor(double r, double g, double b) { 23 red=r; green=g; blue=b; 24 } 25 } 26 DetectedColor detectedColor = new DetectedColor(0.1, 0.7, 0.2); 27 28 ColorThing colorOutput = ColorThing.getInstance(detectedColor.red, detectedColor.green, detectedColor.blue); 29 30 System.out.println("colorOutput="+colorOutput); 31 } 32}

投稿2020/02/01 09:18

jimbe

総合スコア12646

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問