web-dev-qa-db-ja.com

IF条件でNOT演算子を使用する

コードを読みやすくするために、IF条件でNOT演算子を使用しないことは本当に良い習慣ですか? if (doSomething())if (!doSomething()).よりも良いと聞きました

26
Eugene

それは本当にあなたが何を達成しようとしているかに依存します。 else句がない場合、if(!doSomething())は問題ないようです。ただし、持っている場合

if(!doSomething()) {
    ...
}
else {
    // do something else
}

おそらくそのロジックを逆にして、!演算子を削除し、if句をもう少し明確にします。

41
Bill the Lizard

一般的なステートメントとして、if条件文をできるだけ読みやすくするのは良いことです。たとえば、!大丈夫です。問題は物事がどのように見えるかです

if ((a.b && c.d.e) || !f)

あなたは次のようなことをしたいかもしれません

bool isOk = a.b;
bool isStillOk = c.d.e
bool alternateOk = !f

ifステートメントは次のように簡略化されます

if ( (isOk && isStillOk) || alternateOk)

コードを読みやすくするだけです。また、デバッグする必要がある場合は、スコープ内の変数を調べなくても、変数のisOkセットをデバッグできます。また、NPEの処理にも役立ちます。コードをより単純なチャンクに分割することは常に適切です。

19
hvgotcodes

いいえ、!ステートメントでif..then..else演算子を使用してもまったく問題はありません。

変数の命名、そしてあなたの例では、メソッドが重要です。使用している場合:

if(!isPerson()) { ... } // Nothing wrong with this

しかしながら:

if(!balloons()) { ... } // method is named badly

それはすべて読みやすさにかかっています。常に最も読みやすいものを目指してください。そうすれば間違いはありません。また、常にコードを継続するようにしてください。たとえば、Bill the Lizards answer を見てください。

11
Kyle Rozendo

一般に、 !完璧で読みやすいブール論理演算子です。ダブルネガティブを削除するか、モーガンの法則を適用することで単純化しない限り、使用しない理由はありません。

!(!A) = A

または

!(!A | !B) = A & B

経験則として、ブール戻りメソッドの署名はニーモニックで、慣例に従ってください。 @hvgotcodesが提案するシナリオの問題は、もちろんa.bとc.d.eが最初からあまりフレンドリーな例ではないということです。フライト予約アプリケーション用のFlightクラスとSeatクラスがあるとします。その場合、フライトを予約する条件は次のようになります。

if(flight.isActive() && !seat.isTaken())
{
    //book the seat
}

この完全に読み取り可能で理解可能なコード。ただし、Seatクラスのブールロジックを再定義し、条件をこれに言い換えることもできます。

if(flight.isActive() && seat.isVacant())
{
    //book the seat
}

したがって、!演算子が本当に煩わしい場合は、演算子を使用しますが、すべてがブールメソッドの意味に依存していることがわかります。

4
Mig82

このようにしてみて

if (!(a | b)) {
    //blahblah
}

と同じです

if (a | b) {}
else {
    // blahblah
}
1
Jae Lee

選択肢がある場合は、!-演算子を避けることは一般的に悪い考えではありません。単純な理由の1つは、見落とす可能性があるため、エラーの原因になる可能性があることです。より読みやすいのは、場合によってはif(conditionA == false)です。 elseの部分をスキップする場合、これは主に役割を果たします。とにかくelseブロックがある場合は、if条件で否定を使用しないでください。

このような構成条件を除く:

if(!isA() && isB() && !isNotC())

ここで、ある種の否定を使用して、目的のロジックを取得する必要があります。この場合、実際に考慮する価値があるのは、関数または変数の命名です。多くの場合、単純な条件で否定せずに使用できるように名前を付けてください。

この場合、isNotC()のロジックについて、また理にかなっている場合はメソッドisC()で置き換えることができるかどうかを検討する必要があります。

最後に、否定性を使用するかどうかの質問よりも深刻な読みやすさに関して、あなたの例には別の問題があります。それが間違っていた場合、とにかく行われましたか?これは非常に一般的な問題であり、読者が関数の戻り値が実際に何を意味するのかを見つけようとすることに終わります。

1
FabianB

これは聞いたことがない。

お元気ですか

if (doSomething()) {
} else {
   // blah
}

より良い

if (!doSomething()) {
   // blah
}

後者はより明確で簡潔です。

に加えて!演算子は、(!a || b)などの複雑な条件で使用できます。それではどうやって回避しますか?

使用 !必要なときに演算子。

0
Alexandru