web-dev-qa-db-ja.com

Java if / else ifの規則

場合によっては何もしないif/else if構造があります。私のキャリアで見たコードから、「空」のケースは通常省略されます。しかし、私がコードを書いたとき、このケースを省くのは適切ではないと感じていますが、単に何もしない実際のケースとしてそれを示すことです。たとえば、数値が5未満で10を超えるときに何かが行われ、その間に何も行われない場合:

int a = 4
if(a < 5) {
  do something
} else if(a >=5 && a <= 10) {
  // do nothing
} else if(a > 10) {
  do something else
}

これがより良いオプションだと私が思った理由は次のとおりです。

  1. それが私の心の問題です。
  2. これは、私がすべての可能性を考え、誤って1つ忘れていないコードの読者を示しています。

そのため、この規約がプログラミングコミュニティに受け入れられるのか、それとも避けられるのかと考えていました。

6
vainolo

aの値をチェックするだけではありません。それはおそらく何かを意味します。

したがって、私は見たいと思います:

Boolean sell = a < 5;
Boolean buy = a > 10;
Boolean error = a >= 5 & a <= 10;
// or even: 
Boolean error = !sell & !buy;
/* ^ (that's single source principle: if 5 changes to 6 one day, 
 * you don't have to remember to change it in two places) */

その後:

if (sell) {

} else if (buy) {

} else if (error) {

}

はっきりしていませんか?

さらに、aboth未満である可能性があります5以上10 ??

そうではなく、これらのelsesは明らかに冗長です。 (なしaのいずれかのブロック内でifの値を変更します。ただし、aは1回です-私の例のように-心配する必要はありません)。

したがって:

Boolean sell = a < 5;
Boolean buy = a > 10;
Boolean error = !sell & !buy;

if (sell) {

} 
if (buy) {

} 
if (error) {
    // handle error
}

これは、私の意見ではより明確で柔軟性があります。ある条件が相互に排他的でなくなった場合、それが発生する可能性があるため、リファクタリングを行う必要はまったくありません。

10
Konrad Morawski

インターバルを与えることで何もしないのケースを明示的に定義することは避けます。 else- branchを使用します

int a = 4
if(a < 5) {
  do something
} else if(a > 10) {
  do something else
} else {
     //This should mean: (a >=5 && a <= 10)
     // do nothing

     // Maybe log something here 
     // or even add an assertion while development to ensure that the 
     // branch is only reached in expected cases:
     assert (a >=5 && a <= 10) : "I expected 'a' to be 5<=a<=10, but a is:"+a;
}
11
MrSmith42