繁体   English   中英

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

[英]Should I avoid using “!” in if statement in Java?

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

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

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

你有什么主意吗?

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

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

你可能更喜欢

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

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

该规则很可能是罗伯特·马丁的清洁法典第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!

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

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

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

代替

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

但是,在某些情况下,实际上使用否定运算符是非常好的,特别是如果没有提供else子句,例如

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

实际上在这种情况下,使用“!” 对我来说有点意义。

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

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

“可读代码的艺术” (第72页)中说:

首先处理正面情况而不是负面情况 - 例如if(debug)而不是if(!debug)

我发现下面的帖子:

  • 可读代码 - 删除检查null

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

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

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

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

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

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

但是如果你有这样的情况你只需要根据一个条件执行某些操作,即如果你只有一个if块而没有else块,那么使用起来相当合理! if

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

// 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) { ... }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM