28

避免在 IF 条件下使用 NOT 运算符以使您的代码更具可读性真的是一个好习惯吗?我听说那if (doSomething())更好if (!doSomething()).

4

7 回答 7

51

这实际上取决于您要完成的工作。如果您没有 else 子句,那么if(!doSomething())似乎很好。但是,如果你有

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

我可能会颠倒该逻辑以删除!运算符并使if子句更加清晰。

于 2011-01-23T18:01:28.097 回答
19

作为一般性陈述,让你的 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——将代码分解成更简单的块总是好的。

于 2011-01-23T18:03:45.570 回答
12

不,在语句中使用!运算符绝对没有错。if..then..else

变量的命名,在你的例子中,方法是重要的。如果您正在使用:

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

然而:

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

这一切都归结为可读性。始终以最易读的内容为目标,这样您就不会出错。始终尝试使您的代码保持连续性,例如,查看 Bill the Lizards 的答案

于 2011-01-23T17:58:42.157 回答
4

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

!(!A) = A

或者

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

根据经验,请保持布尔返回方法的签名助记符并符合约定。@hvgotcodes 提出的场景的问题是,当然 ab 和 cde 不是很友好的例子。假设您有一个航班预订应用程序的航班和座位类别。那么预订航班的条件可能完全是这样的

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

这个完全可读和可理解的代码。不过,您可以为 Seat 类重新定义布尔逻辑并将条件改写为。

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

从而删除 ! 运算符,如果它真的困扰您,但您会发现这完全取决于您的布尔方法的含义。

于 2015-01-19T15:26:26.283 回答
1

试试这样

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

if (a | b) {}
else {
    // blahblah
}
于 2016-10-11T02:51:11.487 回答
0

我以前从未听说过这个。

怎么

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

好于

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

后者更加清晰简洁。

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

使用 !需要时操作员。

于 2011-01-23T17:59:55.920 回答
0

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

除了这样的组合条件:

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

在这里,您必须使用某种否定来获得所需的逻辑。在这种情况下,真正值得考虑的是函数或变量的命名。尝试命名它们,以便您可以经常在简单的条件下使用它们而无需否定。

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

最后,您的示例在可读性方面还有另一个问题,这比是否使用否定的问题更严重:代码的读者是否真的知道 doSomething() 何时返回 true 何时返回 false?如果它是假的,它仍然完成了吗?这是一个非常常见的问题,最终读者会试图找出函数的返回值的真正含义。

于 2011-01-23T23:28:54.260 回答