我们团队的Java编码指南说:
避免使用“!”在if语句中尽可能多。
我问过其他同事,但没有人给我清楚的想法,因为该指南是很久以前创作的,作者可能已经离开了我们公司。
你有什么想法吗?
答案 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())
例如,假设您正在创建一个验证程序,该验证程序要求两个内容为假,以使该实体有效:
自然,我们的想法是为此编写两种方法:
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)
当然,你可以随时使用否定运算符!
。
但是,如果您遇到必须在if
和else
块中编写某些操作的情况,则以下内容更具可读性:
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) { ... }
他们都这样做,但请继续使用!
,只需确保在其后添加空格,这样就更容易看到。