コードを読みやすくするために、IF 条件で NOT 演算子を使用しないようにすることは本当に良い習慣ですか? if (doSomething())
そのほうがいいと聞きましたif (!doSomething()).
7 に答える
それは本当にあなたが達成しようとしていることに依存します。else 句がない場合は問題ないif(!doSomething())
ようです。ただし、
if(!doSomething()) {
...
}
else {
// do something else
}
おそらくそのロジックを逆にして、!
演算子を削除し、if
句をもう少し明確にするでしょう。
一般的なステートメントとして、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 の処理にも役立ちます。コードをより単純なチャンクに分割することは常に有効です。
いいえ、ステートメントで!
演算子を使用してもまったく問題はありません。if..then..else
変数の命名、およびあなたの例ではメソッドが重要です。使用している場合:
if(!isPerson()) { ... } // Nothing wrong with this
でも:
if(!balloons()) { ... } // method is named badly
それはすべて読みやすさに帰着します。常に最も読みやすいものを目指してください。間違いはありません。たとえば、Bill the Lizards answerを見てください。
一般に、 !完全に優れた読みやすいブール論理演算子です。二重否定を削除するか、モーガンの法則を適用して単純化する場合を除き、使用しない理由はありません。
!(!A) = A
また
!(!A | !B) = A & B
経験則として、boolean 戻りメソッドの署名をニーモニックに保ち、規則に従ってください。@hvgotcodes が提案するシナリオの問題は、もちろん ab と cde がそもそもあまり友好的な例ではないことです。フライト予約アプリケーション用の Flight クラスと Seat クラスがあるとします。次に、フライトを予約するための条件は、完全に次のようなものになる可能性があります
if(flight.isActive() && !seat.isTaken())
{
//book the seat
}
この完全に読みやすく、理解しやすいコードです。ただし、Seat クラスのブール論理を再定義して、条件をこれに言い換えることはできます。
if(flight.isActive() && seat.isVacant())
{
//book the seat
}
したがって、!本当に気になる場合は演算子ですが、ブール値メソッドの意味にすべて依存していることがわかります。
このようにしてみてください
if (!(a | b)) {
//blahblah
}
と同じです
if (a | b) {}
else {
// blahblah
}
選択肢があれば、!-演算子を避けることは一般的に悪い考えではありません。単純な理由の1つは、見落とす可能性があるため、エラーの原因となる可能性があることです。場合によっては、if(conditionA == false)の方が読みやすくなります。これは主に、elseの部分をスキップした場合に役割を果たします。とにかくelse-blockがある場合は、if条件で否定を使用しないでください。
このような構成条件を除いて:
if(!isA() && isB() && !isNotC())
ここでは、目的のロジックを取得するために、ある種の否定を使用する必要があります。この場合、本当に考える価値があるのは、関数または変数の命名です。否定せずに単純な条件で頻繁に使用できるように、名前を付けてください。
この場合、isNotC()のロジックについて考え、意味がある場合はメソッドisC()に置き換えることができるかどうかを検討する必要があります。
最後に、あなたの例には、否定を使用するかどうかという質問よりもさらに深刻な可読性に関する別の問題があります。コードのリーダーは、doSomething()がtrueを返すときとfalseを返すときを本当に知っていますか?それが間違っていた場合、それはとにかく行われたのですか?これは非常に一般的な問題であり、読者が関数の戻り値が実際に何を意味するのかを調べようとすることになります。
私は前にこれについて聞いたことがありません。
どうですか
if (doSomething()) {
} else {
// blah
}
より良い
if (!doSomething()) {
// blah
}
後者はより明確で簡潔です。
のほかに!演算子は、(!a || b) などの複雑な条件で使用できます。そんな時どうやって回避するの?
使用 !必要なときにオペレーター。