写不好吗:
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
。
!
如果确实存在问题,那么足够好的IDE应该能够使您脱颖而出。
if (b == false == true == true) {
您要确定。
Answers:
不一定坏,只是多余的。同样,实际的变量名也很重要。例如if (userIsAllowedToLogin)
,我更希望以上if (b)
,甚至更差if (flag)
。
至于性能问题,编译器会以任何方式对其进行优化。
更新:关于权威资料,我在《Sun Coding Conventions》中找不到明确的内容,但是至少Checkstyle有一个SimplifyBooleanExpression
模块会对此发出警告。
!
吗?
if( canAuthenticate() )
还是if( isAuthorized() )
。我觉得userIsAllowedToLogin
模棱两可。这是否意味着用户可以查看登录页面(例如,未禁止IP地址),还是意味着用户已通过身份验证(例如,正确的名称和密码)?
isCurrentUserLoggedInAsRole
)有时是更大问题的征兆:方法放错了位置。(例如,User
班级应该知道其分配的角色:user.isAssigned( role )
。)
您不应该使用第一种样式。我见过人们使用:
if ( b == true )
if ( b == false )
我个人觉得很难阅读,但是可以通过。但是,这种风格的一个大问题是它导致了您所展示的令人难以置信的违反直觉的例子:
if ( b != true )
if ( b != false )
读者需要花更多的精力来确定作者的意图。就我个人而言,我发现将对真或假的显式比较包括在内是多余的,因此很难阅读,但这就是我。
这完全是一个品味问题。
就个人而言,我发现它的可读性比我if (!a) {
低(编辑:对我而言),因此在以后维护代码时更容易出错,并且我已经转换为使用后一种形式。if (a == false) {
基本上,我不喜欢为逻辑运算而不是单词(C与Pascal)选择符号,因为对我 a = 10 and not b = 20
而言a == 10 && !(b==20)
,它比容易阅读,但这就是Java中的用法。
任何赞成“ == false”的人都赞成“!” 显然,从来没有盯着代码太久而错过了感叹号。是的,您会遇到代码盲的情况。
您不应该使用第一种样式的主要原因是,这两种都是有效的:
if (b = false) //...
while (b = true) //...
也就是说,如果您不小心遗漏了一个字符,那么您将创建一个分配而不是一个比较。赋值表达式的计算结果为已分配的值,所以第一个语句的上方将值false
到b
和计算结果为false
。第二个值分配true
给b
,因此true
无论您b
在循环内进行什么操作,它始终求值为。
Assignment in conditional expression is always constant; did you mean to use == instead of = ?
while (true == loggedIn)
。这样,它将引发编译时错误而不是运行时错误。
除了初学者编写的代码外,我从未见过。总是后者,而且我认为没有人对此感到困惑。另一方面,我认为
int x;
...
if(x) //...
与
if(x != 0) //...
更值得商bat,在那种情况下,我确实更喜欢第二种
true
or进行比较false
,而当我在大学攻读助教时,我总是会从新手身上看到它,而他们根本没有意识到这是多余的。这并不意味着如果您做的不好,那是不常见的。从五年前开始,您就冒犯了很多言论,没有针对任何人。根据您的喜好编写代码
恕我直言,我认为,如果仅使bool变量名称带有"Is"
,这是不言而喻的,更有意义,然后,您可以删除带有true
或的显式比较false
例:
isEdited // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names
等等
isEdited
,不IsEdited
(后者将是一个类)
就个人而言,我将重构代码,以便不使用负面测试。例如。
if (b == false) {
// false
} else {
// true
}
要么
boolean b = false;
while(b == false) {
if (condition)
b = true;
}
恕我直言,在90%的情况下,代码可以重构,因此不需要否定测试。
通常的准则是永远不要测试布尔值。有人认为,额外的冗长性增加了清晰度。添加的代码可能会对某些人有所帮助,但是每个读者都需要阅读更多的代码。
今天早上,我花了1/2个小时才找到一个错误。该代码是
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");
这是我对StackOverflow的第一个答案,所以很好。...最近在重构时,我注意到2个代码块几乎具有完全相同的代码,但其中一个使用了
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;
}
}
}
因此在这种情况下,有必要创建一种方法来处理这样的两种情况,并使用boolean == condition
翻转含义
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;
}
}
}
}