Java 在IF条件下使用NOT运算符
避免在IF条件中使用NOT运算符以提高代码的可读性,这真的是一种好做法吗?我听说if(doSomething())比if(!doSomething())好。不,使用Java 在IF条件下使用NOT运算符,java,if-statement,boolean-operations,Java,If Statement,Boolean Operations,避免在IF条件中使用NOT运算符以提高代码的可读性,这真的是一种好做法吗?我听说if(doSomething())比if(!doSomething())好。不,使用绝对没有问题运算符 变量的命名,在您的示例中,方法是最重要的。如果您正在使用: if(!isPerson()) { ... } // Nothing wrong with this 然而: if(!balloons()) { ... } // method is named badly 这一切都归结于可读性。始终以最具可读性的内容
绝对没有问题if..then..else
语句中的code>运算符
变量的命名,在您的示例中,方法是最重要的。如果您正在使用:
if(!isPerson()) { ... } // Nothing wrong with this
然而:
if(!balloons()) { ... } // method is named badly
这一切都归结于可读性。始终以最具可读性的内容为目标,这样你就不会出错。始终保持代码的连续性,例如,看看Bill the Lizards。我以前从未听说过这个
怎么样
if (doSomething()) {
} else {
// blah
}
胜过
if (!doSomething()) {
// blah
}
后者更为清晰和简洁
除此之外!运算符可以出现在复杂条件下,例如(!a | | b)。那你怎么避免呢
用这个!操作员在您需要时进行操作。这实际上取决于您要完成的任务。如果没有else子句,则如果(!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(flight.isActive() && !seat.isTaken())
{
//book the seat
}
然后将if语句简化为
if ( (isOk && isStillOk) || alternateOk)
它只是让代码更具可读性。如果必须进行调试,则可以调试isOk变量集,而不必在作用域中挖掘变量。这对处理NPE也很有帮助——将代码分解成更简单的块总是好的。一般来说,避免错误是个不错的主意-接线员,如果你有选择的话。一个简单的原因是,它可能是错误的来源,因为它有可能被忽略。在某些情况下,更具可读性的是:if(conditionA==false)。如果您跳过else部分,这主要起作用。
如果有else块,则不应在If条件中使用否定
除了这样的情况:
if(!isA() && isB() && !isNotC())
在这里,你必须使用某种否定来获得所需的逻辑。
在这种情况下,真正值得考虑的是函数或变量的命名。
试着给它们命名,这样你就可以经常在简单的条件下使用它们,而不会产生否定
在这种情况下,您应该考虑isNotC()的逻辑,如果它有意义,是否可以用isC()方法替换它
最后,在可读性方面,您的示例还有另一个问题,这个问题甚至比是否使用否定更严重:代码的读者真的知道doSomething()何时返回true,何时返回false吗?
如果它是假的,它到底是怎么做的?这是一个非常常见的问题,最终读者会试图找出函数返回值的真正含义。一般来说!是一个非常好且可读的布尔逻辑运算符。没有理由不使用它,除非你通过消除双重否定或应用摩根定律来简化
!(!A) = A
或
根据经验,保持布尔返回方法的签名助记符并符合约定。@hvgotcodes提出的场景的问题是,当然,a.b和c.d.e从一开始就不是很友好的例子。假设您有一个航班和一个机票预订应用程序的座位类别。那么预订航班的条件完全可以是
bool isOk = a.b;
bool isStillOk = c.d.e
bool alternateOk = !f
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
}
“如果(…)
比如果(!…)
更好”-等等,wat?问题稍微扩展了一下,让它更清楚。对我来说,不是一个比另一个更好的事实,只是你必须在每种情况下使用合适的,条件世界是非常广泛和多样的。我(几乎)始终构造if-else,以使最常见的执行分支首先出现。有PMD规则可以检查这一点:您没有在某个条件下执行某些操作