it-swarm.cn

用==赚大钱吗?

我的一位同事不断写道:

if (someBool == true)

它把我推高了!我应该大量使用它还是放弃它?

105
JoelFan

这只是多余的代码,不是生与死。然而....

如果经常发生,可能是someBool的命名方式出现问题。一个好名字可以大大消除==true

if(IsSomeCondition)

要么

if(hasCondition)

要么

if(somethingExists)

例如。

126
Robert Harvey

当我看见 someBool == true,我忍不住觉得程序员还没有内化evaluation的想法,这是一个非常根本的缺陷。

但是,我的观点是歪斜的,因为我花了几个暑假在大学里为孩子们教授编程,他们之所以经常写这样的表达,是因为他们确实没有掌握评估表达的心理活动。一旦他们理解了这个概念,冗余就变得显而易见了。

对于其他有能力的专业程序员,情况可能并非如此。这可能只是他们在编程初期就养成的一种坏习惯,而且从未动摇过。但是,如果这是我在面试中看到某人所做的第一件事,仍然会令我有些恐惧。

71
Tim Goodman

这也使我发疯,但是我要说的是,以建设性的方式向他们提及冗余,即使他们不同意也要放弃。

或者,您可以尝试这种方法:
您:您可以开始使用以下代码约定来评估布尔值吗?

if (someBool==true)&&(true==true) {}

Them:我们为什么要这样做?该语句的后半部分是多余的,它将始终为true。

You:乔治,你是对的。傻我那么,我们就选择一个没有所有冗余的版本。怎么样?

if (someBool) {}
58
JohnFx

我认为,如果琐事是您与同事之间最大的问题,那么您应该认为自己很幸运。

45
GrandmasterB

您绝对应该停止这种不良习惯。轻轻地...

很容易忘记编写双等号,将代码转换为:

if (someBool = true)

例如,在C#中,这只会产生警告,而不是错误。因此,除非您将警告视为错误,否则代码将运行,请将变量设置为true并始终输入条件。

42
Guffa

我同意你的观点,但是我将在这里扮演魔鬼的拥护者:


根据语言和变量的名称,x == true是合适的:

请考虑以下情况,这种语言具有静态类型和整数类型的类型强制:

if (actionsAllowed){
    //do actions, since they are allowed
    //...
}

有人阅读了本节的代码后,可能不会立即意识到actionsAllowed是一个布尔变量-它也可以是整数,表示允许的操作数。因此,通过添加== true,可以清楚地看到x是一个布尔值,而不是强制转换为布尔值的整数:

if (actionsAllowed == true){
    //do actions, since they are allowed
    //...
}
21
Cam

那可空布尔呢?

bool? MyFlag = null;

if (MyFlag == true)
    ;  

if (MyFlag)  // error, doesn't compile!
    ; 
15
Steve Wellens

通常,您不希望在编码约定上花很多钱,除非所说的约定在某种程度上严重阻碍了项目。我已经看到许多激烈的争论在诸如代码区域和下划线之类的小问题上升级。

话虽这么说,我认为将== true添加到条件语句没有问题。实际上,在测试负面条件时,我习惯使用== false而不是领先的感叹号。我认为它更具可读性。

如果有既定的约定,除非有理由更改,否则请遵循。但是,真正值得一提的是。

11
Casey

阿克我就是那个人可耻,可耻。这就是我的学习方式,也是我头脑中的“自动格式化”方式。我唯一一次使用Joel的首选语法是当bool变量的动词前缀为“ is”时。我需要动词,例如“是”,“可以”,“是否”,否则我需要==以提供动词“等于”。我可能永远不会改掉这个习惯,所以如果您在街上不跟我打招呼,我会明白的。

11
Scott Fletcher

让我想起“布尔疯狂代码”,就像这样

if(someBool == true)
   otherBool = false;
else
   otherBool = true

代替:

 otherBool = !someBool
11
Marcelo de Aguiar

就个人而言,我非常不喜欢基于C的语言说“不”的方式。那个小小的感叹号太容易忽略了。

因此,我将其完整写出:

if (someCondition == false) {

看了一段时间后,我也想对称

if (someCondition == true) {

因此,请考虑使用!而不是not

8
user1249

这取决于语言,但这通常是一个坏主意...

在C语言中,从不执行此操作。很难找到一种情况,即您要测试的值不是false(非零),但也不等于定义为“ true”的单个值。

在Ruby中,仅当您完全确定要对除布尔值true以外的所有内容都失败时,才执行此操作。

在具有bool类型的C++和其他静态语言中,它是多余的,当您错误地键入=而不是==时,可能会导致编程错误,或者出现注释中提到的升级错误。

6
AShelly

你以为不好吗怎么样:

if(someCondition) {
  return true;
} else {
  return false;
}
5
Sverre Rabbelier

我更喜欢

if (bVal)

要么

if (!bVal)

也有,但是我担心提出来会使人们生气,所以我的建议是忘记它。抱歉!

4
grokus

你应该告诉他他做错了。

它的

如果(true == someBool){

}

如果他忘记了一个,那他的写作风格就会大麻烦。

4
Display Name

怎么样

if (x == "true")

为什么IS那是一个字符串?!

3
atfergs

实际上,如果可以为空,则必须测试x == true。 :)

3
Matt Sherman

我写这样的代码!

原因如下:

“ if bla == true”读起来像一个句子,而“ if bla”在很多情况下并不这样。在读取实际代码时,这听起来似乎是错误的。

编译器还会警告if块中的分配,因此使用== true确实没有危险。 (将其与=混淆)

那些不写“ == true”的人还会用“!()”代替“ == false”吗?我觉得这很丑。而且,如果使用“ == false”,那么也使用“ == true”是非常一致的,而不是采用两种不同的方式来验证真相。

3
Ronny Brendel

请记住,您是团队的一部分,因此您需要一起解决这些问题。即使在上小学后,“与人共处”仍然是一个重要的人格特质:)

3
cdkMoose

通常会忽略'== true',但是,除非您将其包含在团队的编码标准中,否则即使讨论一分钟也几乎不值得。

2
FinnNk

尽管我以主要的C#开发人员的身份同意,但我不能总是这样。例如,在Javascript中,===将执行类型合并。因此,假设var x =,则:

if(x) --> true

if (x === true) --> false

我想这与==不同,因为即使在JS中,我也不会使用if(x == true),而只是要考虑一下。

我办公室的另一点是这样的:

bool b = false;

在C#中,bool b;就足够了,并且会将b初始化为false。但是,更明确的是编写上述行,并且无论如何在优化过程中编译器都应将其删除。

因此,我想我的意思是,什么是好方法,哪些不是好方法并不总是那么明显,很多归结为偏好以及语言功能/怪癖。

2
statichippo

是的,但是如果变量可以为空,该怎么办? (布尔?)

某些语言(C#)将要求使用强制转换或与“ true”进行比较。

bool? isAccepted = true;

if((bool)isAccepted)
{...}

if(isAccepted == true)
{...}
2
Jared G

年轻的人知道规则,老的人知道例外;)

最新的C#,如果您要处理null-able bool,那么您必须:

bool? x = null;
bool? y = true;
bool? z = false;
if (x == true || y == true || z == true) {
    // That was the only way that is reasonably readable that I know of
    // to accomplish this expression.
}

如果三态不是问题,那么通常就没有理由将某些内容与true/_True进行比较。但是,使用Python和其他几种语言,例如C/C++可以对非布尔表达式执行if。这些语言具有用于将整数,指针,列表等解释为true或false的独特规则。有时您不想要那样。例如,在此Python片段中:

x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)

这里z应该是True,但z2应该是False。现在,Clojure语言可以通过另一种方法来实现-and函数不一定求值为bool,但是if可以处理。

无论使用哪种语言,只要您发现自己将某项与TrueFalse进行比较,就可能值得一提。

2
Job

这样的编码以前也将以错误的方式抚慰我。尽管示例标识符的名称为“ someBool”,但在不能保证为布尔值的变量上无意中使用该编码样式可能会导致意外的行为。如果“ someBool”的值不完全是“ true”或“ false”,则结果将为false。

去年,我遇到了一个非常细微的错误,该错误是由这种编码样式引起的,由于人的眼睛遮住了这种构造,因此难以识别。您可能会想:“怎么可能错了?”对于诸如“(var)”或“(!var)”这样的易于理解的表达式,您在不验证其行为的情况下对其进行读取或编码也是如此。

因此,我介绍了一些编码标准,以减少代码库中此类错误的存在,以及减少此类细微错误在将来某个时候意外蔓延的可能性。

  1. 必须根据意图将所有表达式括在括号中。
  2. 所有布尔测试必须以否定形式表示,例如“ suchBool!= false”。

通过清理不符合新样式的代码,我确定并更正了一些此类细微错误的实例。

1
Huperniketes

必须在ActionScript 2中一直使用它(现在已经成为一种死语言),因为:

var something:Boolean = org.black.box.unknown.ThisMightNotExistYet();

// this is slightly ambiguous
if(something)
{
}

// because if you allow undefined you might actually mean
if(false != something)
{
}

// which can mean something different than
if(true == something)
{
}

// and comparing against what you actually MEAN is less script than
if(undefined != value && value)
{
}

因此,几乎总是最好要具体。

1
bburbank

我同意。这是多余的结构,特别是在强类型语言中。

为了进一步滥用布尔值,我在Javascript中多次发现了这种构造(特别是在类似意大利面条的怪兽函数中,如100多个行):

//create the variable, not initializing it
var flag;
//...
//assing a value to the var, by the example 
flag=$("mycheckbox").selected;
//...

//and at the moment of use it:
if(flag!=true) {
   //code to execute when the checkbox is unchecked
}

似乎由于缺乏这种语言中严格的类型定义,某些程序员宁愿不必弄乱false|undefined值。

1
Tomas Narros

我有一个同事,他将有一些这样的代码:

if(something == true)

然后,对于某种测试/调试,他希望不要调用此块,因此将其更改为:

if(something == true && false)

然后偶尔他会将其更改为:

if(false)

最糟糕的是,这种类型的调试有时会困扰我,对其他开发人员来说真的很糟糕!

1
ingh.am

我想说一致性是代码库中的王者。因此,您应该使用组织中使用的样式,即通常。尝试使您偏爱的样式成为官方公司编码准则的一部分。如果已经在指南中,请遵循它。

(话虽如此,这也确实使我烦恼-但可能不足以使事情大为改观)。

0
driis

我更喜欢不将多余的== true放置,但是有时我不小心将其包括在内,却没有注意到。该人可能没有注意到并意外放置它们。我重读了代码,有时会注意到我放置了额外的== true,所以我删除了== true。我有时没有注意到它,会很乐意欢迎有人告诉我我多余地放置了它。

0
sange

我的同事叫ifloop。我活着讲这件事。

0
Daniel Mošmondor

在WPF中进行大量编程时可以养成这种习惯。它使用大量布尔? (空布尔)变量,您必须编写if (someBool == true)if (someBool ?? false)

0
Poma

希望您使用的是一种明智的语言,例如带有Option Strict On的VB.NET,该语言不允许将其他类型的强制强制转换为If语句内的布尔值。这样就不必添加“ == true”(或在VB中添加“ == True”),因为强制情况不会发生。如果要检查是否为非零值,则应明确地编写该值(即“ If x <> 0”)。

0
o. nate

怎么样:

int j = 1;
for (int i=1; i>=j; i++) ...

是的,我已经看过了。

0
Dave

对于新手开发人员来说,这是一种代码味道。他们尚未掌握/内在化布尔条件,并且必须显式评估为真还是假条件。

0
Chuck Conway

在JavaScript中,当我有足够的文档解释该方法的期望时,我更喜欢if(bool),但是当evaluation为true时,意味着该变量存在,等于数字1或布尔值是的,这更难。

强烈键入JS也意味着灵活性降低。艰难的电话。强类型的语言,放下锤子。否则,问他为什么这样做?

实际上,您的回答是:问他为什么。然后纠正他。

0
Clint

以此为契机教他。如果您愿意,他会更加尊重您。您不希望有人为您做同样的事情吗?

0
Rush Frisby

研究表明,具有许多冗余的代码与错误密切相关。这是关于此事的 有趣的文章 (PDF警报)。

0
David Plumpton

比较布尔值实际上可能会导致重大问题。我最近遇到了一些内部代码,内容为:

if(foo == false && bar == 2) {...}

现在,这看起来很简单,对吧?只需将其简化为:

if(!foo && bar == 2) {...}

错误。在这种情况下,运算顺序决定&&首先得到评估,这意味着该评估实际上是:

if(foo == (false && bar == 2))

也称为

if(!foo)

我们应该检查的额外内容,bar == 2,完全消失了。这就是为什么我永远不会批准包含someBool == [true|false]

(您可以看到反向语句== true||,也会引起问题。)

0
tghw

是的,这是一种程序员的思维定势。他们一直认为“如果条件”不存在,而没有带有== <,>符号的表达式。

if(RowsAffected> 0){返回true; } else {返回false; }

程序员需要从实时角度观看他们的代码。::)

0
Krishna Prasad A

C语言中的一个问题是,对于布尔值,使用0和1以外的值是一种传统。

typedef enum { WHATEVER = 1 << 4 } MyFlags;
if (flags & WHATEVER) {
}

甚至依靠-1为真。

问题是您正在编写API:

struct foo { 
  unsigned int bar : 1;
};

void myapi_foo_set_bar(struct foo *foo, int bar) {
   foo->bar = bar;
}

在这里,如果bar不能规范化为0或1,它将不适合位域,并且会中断:

myapi_foo_set_bar(foo, flags & WHATEVER); /* broken */

您还可以找到其他打破非规范布尔的方法,例如将它们与问题中的TRUE或FALSE进行比较!

无论如何,我要规范化布尔通常是有意义的:

foo->bar = bar != FALSE;

当然,这是C特有的怪异。

0
Havoc P

是的,这很重要,因为布尔值的名称应表明它是布尔值。说如果您有这段代码:

bool arrayIsEmpty = array.length == 0;
if (arrayIsEmpty) { ... }

它已经很容易阅读,因此您不需要== true,即使对于评估意识较差的人或程序员也是如此。

0
tia

编程约定不一定是“正确”或“错误”。它们的存在使程序的阅读者熟悉该结构,因此可能出现的错误将更加清楚地显示出来-如果您看上去有些不对劲,就很难“发现”问题。

重要的是,所有参与者均应明确定义并同意约定(即使该协议就像“我在这里工作时同意使用此约定” :)一样,否则弊大于利。

当然,将布尔值与真值进行比较的特殊情况是完全错误的,并且不惜一切代价避免。 ;-)

0
Daniel C. Sobral

我写if(var == false)因为在写完var之后我不喜欢回溯并写东西!在它后面。我也喜欢== false使它看起来更清晰。

但是== true只是很奇怪。我不知道有什么大不了的意义。除非他强迫其他人使用它或使其成为编码标准,否则我不会。

0
user2528

您可以通过以下示例尝试与您的同事联系:

if ((x == 3) == true) {
    ...
}

他应该说== true是多余的,应重写为

if (x == 3) {
    ...
}

由于x == 3已经是布尔表达式。

现在给他someBool == true示例,但稍作重写:

if ((someBool) == true) {
    ...
}

由于someBool已经是布尔值,因此与前面的示例相比,现在应该清楚== true在此示例中也是多余的。因此,应将其重写为:

if (someBool) {
    ...
}
0
gablin

有趣,因为我总是替换如下代码:

if(foo) {

拥有:

if(true == foo) {
if(false == foo) {

但是我养成了这种习惯,因为大多数时候我使用的代码没有明确的变量名。

0
mhitza

这可能会使您的一而就。

对于布尔类型,我们有.IsTrue和.IsFalse的扩展方法。

所以我们写

如果(someBool.IsTrue())

-要么-

如果(someBool.IsFalse())

是的我爱他们。在阅读代码时,它对我来说变得更加明显。

0
ElGringoGrande