明确地与布尔常量进行比较是不好的,例如在Java中是否(b == false)?

pol*_*nts 72 java boolean coding-style

写不好

if (b == false) //...

while (b != true) //...
Run Code Online (Sandbox Code Playgroud)

是不是总是更好,而不是写:

if (!b) //...

while (!b) //...
Run Code Online (Sandbox Code Playgroud)

据推测,性能没有差异(或者存在?),但是如何衡量两者之间的显性,简洁性,清晰度,可读性等?

更新

为了限制主观性,我还要感谢来自权威编码风格指南的任何引用,这些引用始终是优选的,或者在何时使用.


注意:变量名称b仅用作示例,ala foobar.

Bal*_*usC 66

它不一定是坏的,它只是多余的.此外,实际的变量名称权重很多.我更喜欢if (userIsAllowedToLogin)上面的例子,if (b)甚至更糟if (flag).

至于性能问题,编译器会以任何方式优化它.

更新:至于权威来源,我在" 太阳编码约定"中找不到明确的内容,但至少Checkstyle有一个SimplifyBooleanExpression模块会对此发出警告.

  • 真正多余的代码*必然是坏的. (9认同)
  • +1用于推荐长的描述性变量名称.但是,我认为"if(userIsAllowedToLogin())"优于"if(userIsAllowedToLogin()== true)",因为前者更具可读性. (7认同)
  • @BalusC:我知道; 这是一个小小的烦恼.长方法名称 - 比如`isCurrentUserLoggedInAsRole` - 有时是一个更大问题的症状:错位的方法.(例如,`User`类应该知道它的指定角色:`user.isAssigned(role)`.) (4认同)
  • @Dave:这只是一个有点夸张的例子。只要变量名足够不言自明即可。 (2认同)

Tho*_*mas 47

你不应该使用第一种风格.我见过人们使用:

  • if ( b == true )
  • if ( b == false )

我个人觉得很难阅读,但它是可以接受的.但是,我对这种风格的一个大问题是,它会导致你展示的令人难以置信的反直觉的例子:

  • if ( b != true )
  • if ( b != false )

为了确定作者的意图,读者需要付出更多努力.就个人而言,我发现包括对真或假的明确比较是多余的,因此更难阅读,但那就是我.

  • +1这是本主题中的另一个最佳答案.他们确实(有点)难以快速解释*.至少,对我而言. (8认同)

Tho*_*sen 34

这很有趣.

亲自我发现if (!a) {是少了很多可读(编辑:我)比if (a == false) {,并因此更容易出错以后维护代码时,我已经转换为使用后者的形式.

基本上我不喜欢逻辑运算的符号选择而不是单词(C对Pascal),因为对我来说 a = 10 and not b = 20读取比a == 10 && !(b==20)这更容易,但这就是它在Java中的方式.

任何将"== false"方法置于"!"状态的人 显然从来没有长时间盯着代码而错过了感叹号.是的,你可以得到代码盲.

  • 我同意,从可读性的角度来看,我更倾向于使用== false而不是(!) - 当维护其他人的代码时,正如你所说,代码失明是一件事并且确实发生了.if(K){}或if(!K){}有时您可以花费多年时间来解决为什么某些东西不起作用然后发现!在这种情况下. (3认同)

Ala*_*ore 25

你不应该使用第一种风格的首要原因是因为这两种风格都是有效的:

if (b = false) //...

while (b = true) //...
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您不小心遗漏了一个字符,则创建一个赋值而不是比较.赋值表达式的计算结果为已分配的值,所以上述的第一条语句分配值falseb和计算结果为false.第二个分配trueb,所以它总是评估true,无论你b在循环内做什么.

  • 我不会说"压倒"的原因.除非你到15年前旅行,否则你的编译器会警告这个错字. (8认同)
  • @StephenSwensen它在C#中有效,但它会产生警告.`条件表达式中的赋值总是不变的; 你的意思是使用==而不是=?` (2认同)
  • 防止这种情况的一种简单方法是将常数(lhs)与变量(rhs)进行比较。所以`while(true == LoginIn)`。这样,它将引发编译时错误而不是运行时错误。 (2认同)

Mic*_*zek 11

除了初学者编写的代码外,我从未见过前者; 它始终是后者,我认为没有人真正被它迷惑.另一方面,我认为

int x;
...
if(x) //...
Run Code Online (Sandbox Code Playgroud)

VS

if(x != 0) //...
Run Code Online (Sandbox Code Playgroud)

更值得商榷,在这种情况下,我更喜欢第二种

  • @Michael,Java并没有像在C++中那样隐式地将int转换为boolean,而是以100%的方式同意; 前者是邋new的新手语法,后者是首选. (4认同)
  • 哦,我甚至没有意识到我们在谈论Java :) (4认同)
  • 好吧,现在你知道了,多亏了这篇文章,一些经验丰富的程序员会写“== false”——而不仅仅是“初学者”,你可以清楚地阅读他们的原因,正如这里的回复中多次给出的那样。(嗯……这是潜意识的人身攻击吗?“我喜欢这个,我见过的唯一不同意我偏好的人只是‘初学者’。”) (2认同)

Mah*_*aga 7

恕我直言,我想如果你只是将bool变量名称作为前缀"Is",它将是不言而喻的,更有意义然后,你可以删除显式比较truefalse

例:

isEdited  // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names
Run Code Online (Sandbox Code Playgroud)

等等

  • 约定是`isEdited`,而不是'IsEdited`(后者将是一个类) (2认同)

Hea*_*eek 6

我更喜欢第一个,因为它更清晰.机器可以同样读取,但我尝试编写代码供其他阅读,而不仅仅是机器.

  • +1绝对可以编写人们更容易阅读的代码. (3认同)