我应该避免使用“!”在Java中的if语句?

时间:2015-08-21 02:48:31

标签: java

我们团队的Java编码指南说:

  

避免使用“!”在if语句中尽可能多。

我问过其他同事,但没有人给我清楚的想法,因为该指南是很久以前创作的,作者可能已经离开了我们公司。

你有什么想法吗?

7 个答案:

答案 0 :(得分:9)

根据所提供的信息,这需要一些推测。一个可能的原因是,意图本身不是if语句,而是if-else语句。在这种情况下,我可以看到你可能会说你应该反转案件,以便你没有额外的否定操作。而不是

if (! boolVar) {
  // Something
} else {
  // Something else
}

您可能更喜欢

if (boolVar) {
  // Something else
} else {
  // Something
}

这是否值得,可能更多的是品味和标准化问题。

答案 1 :(得分:4)

该规则很可能是罗伯特·马丁的清洁代码,第302页的改编:

  

负面消息比正面消息更难理解。因此,在可能的情况下,条件应表示为正数。例如:

if(buffer.shouldCompact())
     

优于

if(!buffer.shouldNotCompact())

例如,假设您正在创建一个验证程序,该验证程序要求两个内容为假,以使该实体有效:

  • 实体不得在过去12小时内创建,
  • 实体的银行帐户总金额不得超过50,000美元。

自然,我们的想法是为此编写两种方法:

boolean isCreatedWithinLastTwelveHours(BankAccount account)
boolean hasMoreThanTotalSumCap(BankAccount account)

...然后,您将这些调用为:

boolean newAccount = isCreatedWithinTheLastTwelveHours(account);
boolean highEndAccount = hasMoreThanTotalSumCap(account);

if(!newAccount && !highEndAccount) { // ... other logic

// The more astute would use DeMorgan's law in an effort to make this more readable

if(!(newAccount || highEndAccount)) { // other logic

嗯......如果你只是说他们不是那么它会不会更好?

boolean isNotCreatedWithinLastTwelveHours(BankAccount account)
boolean hasLessThanTotalSumCap(BankAccount account)

这使表达更简洁:

if(notNewAccount && notHighEndAccount) { // .. carry on!

答案 2 :(得分:1)

当然“!”可以在你喜欢的时候使用。 java中没有“除非”,在某些情况下你没有其他选择。

答案 3 :(得分:1)

看起来还是另一个无用的规则。一般来说,在这种情况下没有绝对术语,如果你在if-else子句中,那么可能最好写一下

if(myCondition) {
    doThis()
} else {
    doSomethingElse()
}

而不是

if(!myCondition) {
   doSomethingElse()
} else {
   doThis()
}

然而,那说,在某些情况下实际上可以使用否定运算符,特别是如果没有提供else子句,例如

if (!tokenDoesCompute()) {
   throw InvalidTockenException("Whatever")
}

实际上在那种情况下,使用"!"对我来说很有意义。

最后,如果没有人可以真正解释为什么规则存在,也许是时候删除它,我能找到的唯一理由是提供有关代码风格的一致性。

答案 4 :(得分:1)

好的,我回答了我自己的问题。 正如其他人所说,也许这是为了可读性而编写的。

The Art of Readable Code(第72页)中说:

  

首先处理积极案例而不是消极案例,if(debug)代替if(!debug)

我也在帖子下面找到了:

  • Readable Code - Remove Checking null

    bool func(String name)
    {
        if ( (name != null) && (name.equals("true") ) {
            //...
        } else {
            //...
        }
    }
    

    bool func(String name)
    {
        if ( "true".equals(name) ) {
           //...
        } else {
            //...
        }
    }
    

答案 5 :(得分:0)

当然,你可以随时使用否定运算符!

但是,如果您遇到必须在ifelse块中编写某些操作的情况,则以下内容更具可读性:

if(status){
//do something
}
else{
//do something else
}

大于

if(!status){
//do something
}
else{
//do something else
}

但是如果你有这样的情况,你只需要根据一个条件执行某些操作,即如果你只有一个if块&没有else阻止,那么在!

中使用if是相当不错的

答案 6 :(得分:0)

我还没有看到其他人提出这个问题,这可能是因为他们和我一样讨厌它,但我是为了完整而展示它。

// Using not operator (preferred)
if (! someTest) { ... }

// Using compact not operator (kind of hides it)
if (!someTest) { ... }

// Comparing to false (ok, explicitly states what you want)
if (someTest == false) { ... }

// Comparing to true (a bit obscure)
if (someTest != true) { ... }

他们都这样做,但请继续使用!,只需确保在其后添加空格,这样就更容易看到。