在IF条件下使用NOT运算符

在IF条件下避免使用NOT运算符以使代码更易读,这是一个很好的做法吗? 我听说if (doSomething())if (!doSomething()).更好if (!doSomething()).

这实际上取决于你想要完成的事情。 如果你没有else子句,那么if(!doSomething())似乎没问题。 但是,如果你有

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

我可能会颠倒那个逻辑去除! 运算符并使if子句更加清晰。

作为一般性陈述,最好使if条件尽可能可读。 对于你的例子,使用! 没关系。 问题出在事情的样子

 if ((ab && cde) || !f) 

你可能想做点什么

 bool isOk = ab; bool isStillOk = cde 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 

这一切都归结为可读性。 始终瞄准最可读的东西,你不会出错。 总是尽量保持你的代码连续,例如,看看比尔蜥蜴的回答 。

一般来说, ! 是一个非常好的和可读的布尔逻辑运算符。 没有理由不使用它,除非你通过删除双重否定或应用摩根定律进行简化。

 !(!A) = A 

要么

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

根据经验,保持布尔返回方法的签名符合惯例并符合约定。 @hvgotcodes提出的场景的问题当然是ab和cde不是非常友好的例子。 假设您有航class预订申请的航class和座位等级。 那么预订航class的条件就完全可以了

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

这个完全可读且易于理解的代码。 您可以重新定义Seat类的布尔逻辑,并将条件重新定义为此类。

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

从而删除! 运算符,如果它真的困扰你,但你会发现这一切都取决于你的布尔方法的意思。

如果你有选择的话,避免使用!-operator通常不是一个坏主意。 一个简单的原因是它可能是错误的来源,因为它可能会忽略它。 更具可读性:if(conditionA == false)在某些情况下。 如果你跳过else部分,这主要起作用。 如果你有一个else-block,你不应该在if条件中使用否定。

除了像这样的组合条件:

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

在这里你必须使用某种否定来获得所需的逻辑。 在这种情况下,真正值得思考的是函数或变量的命名。 尝试命名它们,这样你就可以在简单的条件下使用它们而不会出现否定。

在这种情况下,您应该考虑isNotC()的逻辑,如果它有意义,它可以被方法isC()替换。

最后你的例子在可读性方面还有另一个问题,这个问题比是否使用否定更严重:代码的读者是否真的知道doSomething()何时返回true和false? 如果它是假的,它还是做了吗? 这是一个非常常见的问题,最终在读者试图找出函数的返回值真正意味着什么。

试试这样

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

它也一样

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

我以前从未听说过这个。

怎么

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

比…更好

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

后者更清晰简洁。

除了! 运算符可以出现在复杂的条件中,例如(!a || b)。 你怎么避免呢?

使用 ! 操作员在您需要时。

Interesting Posts