Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在IF条件下使用NOT运算符_Java_If Statement_Boolean Operations - Fatal编程技术网

Java 在IF条件下使用NOT运算符

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条件中使用NOT运算符以提高代码的可读性,这真的是一种好做法吗?我听说if(doSomething())比if(!doSomething())好。

不,使用
绝对没有问题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规则可以检查这一点:您没有在某个条件下执行某些操作