在Java中显式比较布尔常量(例如if(b==false))是否不好?
写这样的东西不好吗在Java中显式比较布尔常量(例如if(b==false))是否不好?,java,coding-style,boolean,Java,Coding Style,Boolean,写这样的东西不好吗 if (b == false) //... while (b != true) //... 是否总是最好改为写: if (!b) //... while (!b) //... 大概在性能上没有差别(或者是否有差别?),但你如何衡量两者之间的明确性、简洁性、清晰性、可读性等 更新 为了限制主观性,我还希望引用权威编码风格指南中的任何内容,哪一个总是更可取的,或者什么时候使用 注意:变量名b只是作为一个例子,alafoo和bar除了在初学者编写的代码中,我从未见过前者;
if (b == false) //...
while (b != true) //...
是否总是最好改为写:
if (!b) //...
while (!b) //...
大概在性能上没有差别(或者是否有差别?),但你如何衡量两者之间的明确性、简洁性、清晰性、可读性等
更新
为了限制主观性,我还希望引用权威编码风格指南中的任何内容,哪一个总是更可取的,或者什么时候使用
注意:变量名
b
只是作为一个例子,alafoo
和bar
除了在初学者编写的代码中,我从未见过前者;总是后者,我不认为有人真的被它弄糊涂了。另一方面,我认为
int x;
...
if(x) //...
vs
更值得商榷的是,在这种情况下,我更喜欢第二个,我认为这很烦人。但我不会为此引起骚动。这不一定是坏事,只是多余的。而且,实际变量名的权重很大。例如,我更喜欢
if(userIsAllowedToLogin)
上面的if(b)
或者更糟糕的if(flag)
至于性能问题,编译器会以任何方式对其进行优化
更新:至于权威来源,我在中找不到明确的信息,但至少有一个模块会对此发出警告。我更喜欢第一个,因为它更清晰。这台机器也可以读得同样好,但我试着编写代码让其他人阅读,而不仅仅是机器。你不应该使用第一种样式。我看到人们使用:
if(b==true)
if(b==false)
如果(b!=true)
如果(b!=false)
这需要读者付出更多的努力来确定作者的意图。就我个人而言,我发现包含对真或假的明确比较是多余的,因此更难阅读,但这就是我。不应该使用第一种样式的主要原因是因为这两种样式都是有效的:
if (b = false) //...
while (b = true) //...
也就是说,如果您不小心漏掉了一个字符,您将创建一个赋值而不是比较。赋值表达式求值为已赋值的值,因此上面的第一条语句将值
false
赋值为b
,并求值为false
。第二个将true
赋值给b
,因此它的计算结果总是true
,无论您在循环中使用b
做什么。IMHO,我认为如果您只在bool变量名前面加上“Is”
,它将是不言而喻的,并且更有意义,您可以删除与true
或false
示例:
isEdited // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names
etc这是一个强烈的品味问题 就我个人而言,我发现
if(!a){
比if(a==false){
可读性差很多(编辑:对我来说),因此在以后维护代码时更容易出错,我已转换为使用后一种形式
基本上,我不喜欢为逻辑运算选择符号而不是单词(C与Pascal),因为对我来说,a=10而不是b=20比a=10&&!(b=20)更容易阅读,但Java就是这样
任何使用“==false”方法来支持“!”的人显然从来没有长时间盯着代码看,也没有错过那个感叹号。是的,你可以盲代码。就我个人而言,我会重构代码,所以我不会使用否定测试。例如
if (b == false) {
// false
} else {
// true
}
或
依我看,在90%的情况下,代码可以重构,因此不需要负面测试。我认为这很糟糕
while (!b) {
// do something
}
读起来比读起来好多了
while (b != true) {
// do something
}
通常的指导原则是永远不要对布尔值进行测试。一些人认为额外的冗长会增加清晰度。添加的代码可能会帮助一些人,但每个读者都需要阅读更多的代码 今天早上,我花了半个小时才找到一个bug。代码是
if ( !strcmp(runway_in_use,"CLOSED") == IPAS_FALSE)
printf(" ACTIVE FALSE \n"); else
printf(" ACTIVE TRUE \n");
如果它是用常规编码的,我会更快地发现它是错的:
if (strcmp(runway_in_use, "CLOSED"))
printf(" ACTIVE FALSE \n"); else
printf(" ACTIVE TRUE \n");
我更喜欢长的方法,但我比较使用
=
而不是!=
99%的时间
我知道这个问题是关于Java的,但我经常在语言之间切换,例如,在C#
中,在处理可为空的bool类型时,比较(==false
)会有所帮助。因此我养成了这样的习惯,即比较true
或false
,但使用=
操作符
我这样做:
if(isSomething==false)
或if(isSomething==true)
但我讨厌这些:
if(isSomething!=false)
或if(isSomething!=true)
因为显而易见的可读性原因
只要代码保持可读性,这就无关紧要了。第一个选项(b==false)不受欢迎的原因之一是初学者通常没有意识到第二个选项(!b)这是完全可能的。因此,使用第一种形式可能会指向对布尔表达式和布尔变量的误解。这样,使用第二种形式就变成了一种sjiboleth:当有人写这篇文章时,他/她可能知道发生了什么
我相信这导致了人们认为这种差异比实际情况更重要。这是我关于StackOverflow的第一个答案,所以请小心。。。 最近在重构时,我注意到有两块代码几乎完全相同,但有一块使用了相同的代码
for (Alert alert : alerts) {
Long currentId = alert.getUserId();
if (vipList.contains(currentId)) {
customersToNotify.add(alert);
if (customersToNotify.size() == maxAlerts) {
break;
}
}
}
另一个有
for (Alert alert : alerts) {
Long currentId = alert.getUserId();
if (!vipList.contains(currentId)) {
customersToNotify.add(alert);
if (customersToNotify.size() == maxAlerts) {
break;
}
}
}
因此,在这种情况下,使用boo创建一个适用于这两种情况的方法是有意义的
for (Alert alert : alerts) {
Long currentId = alert.getUserId();
if (vipList.contains(currentId)) {
customersToNotify.add(alert);
if (customersToNotify.size() == maxAlerts) {
break;
}
}
}
for (Alert alert : alerts) {
Long currentId = alert.getUserId();
if (!vipList.contains(currentId)) {
customersToNotify.add(alert);
if (customersToNotify.size() == maxAlerts) {
break;
}
}
}
private void appendCustomersToNotify(List<Alert> alerts
List<Alert> customersToNotify, List<Long> vipList, boolean vip){
for (Alert alert : alerts) {
Long currentId = alertItem.getUserId();
if (vip == vipList.contains(currentId)) {
customersToNotify.add(alertItem);
if (customersToNotify.size() == maxAlerts) {
break;
}
}
}
}