我的一位同事不断写道:
if (someBool == true)
它把我推高了!我应该大量使用还是丢弃它?
#1 楼
这只是冗余代码,不是生与死。但是......如果发生很多,可能是
someBool
的命名方式出现问题。一个好名字可以大大消除对==true
的需求if(IsSomeCondition)
或
if(hasCondition)
或
if(somethingExists)
。例如。
评论
这对我来说是最正确的。一切都与清晰度和命名技巧有关,原始语法并不是那么糟糕,但这是获得更好代码的正确途径。
– TJB
2010-10-19 3:41
击败我吧!如果没有适当的命名,那么更简洁的等效性将毫无意义。
–特洛伊·亨特(Troy Hunt)
2010-10-19 3:42
为了清楚起见,我不得不多次对遗留代码使用someBool == true。但是,如果我从头开始写,我会相应地命名变量并使用if(isSomething)
–nimcap
2010-10-19 6:38
我同意,即使命名可以解决此问题,假设名称为SomeBool,它也可以表示任何含义,可以是任何类型(整数等于数组中布尔值的数量吗?)。布尔值需要某种存在性动词,否则它们将永远很难独自阅读。
–摩根·赫洛克(Morgan Herlocker)
2010-10-19 6:45
我同意,这全都与可读性有关。如果变量命名正确,则不需要它。如果表达式可以更好地理解,我会选择“ == true”,如果您使用“ == false”而不是(丑陋的)“ if(!())”,这也是一致的。
–罗尼·布伦德尔(Ronny Brendel)
2010-10-19 8:07
#2 楼
当我看到someBool == true
时,我不禁感到程序员没有将评估的想法内在化,这是一个非常根本的缺陷。但是,由于我花了几个夏天,我的观点出现了偏差。在针对孩子的大学教学编程中,他们经常写这样的表达,因为他们真的没有掌握评估表达的心理活动。一旦他们理解了这个概念,冗余就变得很明显。
对于其他称职的专业程序员来说,情况可能并非如此。这可能只是他们在编程初期就养成的一个坏习惯,而且从未动摇过。但是,如果这是我在采访中看到某人所做的第一件事,仍然会令我有些恐惧。
评论
我不会那么快就习惯这个。我从专业程序员的口中听到了一些真正令人震惊的事情。通常在此后不久,便有一位古怪的人,“这是怎么工作的?”
–dash-tom-bang
2010-10-18 23:18
完全同意评估。偶尔我想知道,“它在哪里停下来?” if((((x == true)== true)== true)!= false)//等等...
–yawmark
2010-10-19 3:52
有时我会写(c == true)返回true的情况;否则返回false;但是有99%的时间(因为我无法确定自己没有错过任何机会,所以有1%的时间),我会立即注意到并用return c替换整个内容。我希望大多数有能力的程序员如果在职业生涯的早期就养成习惯,就应该做类似的事情。我不期望的是wtf响应。
– Lie Ryan
2010-10-19在11:54
哦,男孩,思考的艺术。我上周在我们的代码库中确实遇到了这个问题。如果(!someCondition){someCondition = false; }我已经在我们的代码中看到了一些(很多)冗余以及一些不可能,但是这个代码很简单,但是却以为有人真正写了它而使事情变得更糟。甚至多次。
–安东尼·佩格拉姆
10-10-20在19:26
请注意,我已经看到了if(x)x = true的一些情况;这不是多余的,而是相当于x = !! x; (将x归一化为0/1)
– jkerian
10-10-20在20:02
#3 楼
这也使我发疯,但是我想以建设性的方式向他们提及冗余,然后即使他们不同意也将其删除。或者,您可以尝试这种方法:您:可以您开始使用以下代码约定评估布尔值?
if (someBool==true)&&(true==true) {}
他们:我们为什么要这样做?该语句的后半部分是多余的,它将始终为true。
您:乔治,您说得对。傻我那么,我们就选择一个没有所有冗余的版本。怎么样?
if (someBool) {}
评论
是的,同意。这很愚蠢,但是您必须选择打架,并且这段代码确实可以完成您同事的工作。在非“提及您的情况到底是什么?!”中提及它。一种方式,然后将其删除。尽管如果他们开始像“ if(someBool!= true)”或“ if(!someBool == true)”之类的垃圾,或其他类似的卷积,那可能是值得一战的战斗。
– BlairHippo
2010-10-18 20:11
(someBool == false)与if(someBool == true)有何不同?
– FinnNk
2010-10-18 20:16
true = true不会编译,您不能分配给true ;-)
– fredoverflow
2010-10-18 21:41
我已经习惯了if(somebool == false)或!=,但是总是反对false而不是true。我发现它是多余的,但是由于编码标准坚持认为if()看起来像一个函数调用,所以括号之间的空格可以帮助我读取它。就我自己而言,布尔是布尔,但是(somePointer)不会飞;我更喜欢if(somePointer!= NULL),因为指针不是布尔值。
–dash-tom-bang
2010-10-18 23:05
这是关于可读性,而不是非逻辑或(微)冗余
–罗尼·布伦德尔(Ronny Brendel)
2010-10-19 8:14
#4 楼
我认为,如果琐事是您与同事之间最大的问题,那么您应该认为自己很幸运。评论
好吧,它是追求完美的好选择,但是肯定有更大的鱼可以油炸
– TJB
2010-10-19 3:43
我认为您是在谈论每个值得讨论的问题的。
–戴夫·范·登·艾恩德
2010-10-19 6:40
这可能预示着更大的问题。车库天花板上的一小块棕色污渍似乎没什么大不了,但这可能意味着您漏水严重。
–乔什
2010-10-19 12:52
#5 楼
您绝对应该停止这种不良习惯。轻轻地...很容易忘记编写双等号,将代码变成:
if (someBool = true)
例如在C#中,这是只会产生警告,而不是错误。因此,除非将警告视为错误,否则代码将运行,请将变量设置为true并始终输入条件。
评论
这不是一个相关的论点。如果您使用的是这样的语言,则可以将true移到另一侧。问题是是否要包含真实值。
–凸轮
2010-10-18 20:18
@Cam:错过了重点。我不建议使用后向逻辑。
–古法
2010-10-18 20:36
@Cam-他提供了一个实际的例子,说明这可能是个问题。我会说这很相关。
–混沌潘迪翁
2010-10-18 20:39
@Guffa Cam非常正确。这不是停止在if块中使用==(anyType)的原因。
–罗尼·布伦德尔(Ronny Brendel)
2010-10-19 8:10
@Ronny:不,任何类型都不可能发生(除非语言实际上允许任何类型作为条件)。 if(answer = 42){}语句只是不编译,因为该表达式不是布尔值。
–古法
2010-10-19 14:08
#6 楼
我同意您的意见,但是我将在这里扮演魔鬼的拥护者:根据语言和变量的名称,x == true是合适的:
在使用静态类型和强制类型为整型的语言时,请考虑以下情况:
if (actionsAllowed){
//do actions, since they are allowed
//...
}
阅读本节代码的人可能不会立即意识到actionAllowed是布尔变量-也可以是整数,表示允许的操作数。因此,通过添加== true,可以清楚地看到x是布尔值,而不是强制转换为布尔值的整数:
if (actionsAllowed == true){
//do actions, since they are allowed
//...
}
评论
可读性== GoodThing
–Muad'Dib
2010-10-18 20:18
如果((可读性==好东西== true)...
– JoelFan
2010-10-18 20:42
bool isGoodThing =可读性?true :(编码标准?true:(internalizationOfConcept?true:false));
– Johnc
2010-10-19在2:02
因此,重命名变量actionsAreAllowed。
– Graeme Perrow
2010-10-19 3:13
通过编写if(x){...,您已经在断言x是布尔值或可转换为布尔值。您所说的与您无关。
–丹尼尔(Daniel Earwicker)
10-10-19在10:28
#7 楼
那可空布尔呢?bool? MyFlag = null;
if (MyFlag == true)
;
if (MyFlag) // error, doesn't compile!
;
评论
如果(MyFlag.Value)
– Johnc
2010-10-19 2:05
并非所有语言都具有可为空的布尔,并且许多语言都将接受您的第二种构造。
–zneak
2010-10-19 2:30
@johnc:“ if(MyFlag.Value)”可能并没有真正实现您想要的功能,因为如果MyFlag为null(可以通过检查MyFlag.HasValue进行测试),它可能引发异常。
–卢多维克·查班特(Ludovic Chabant)
2010-10-19 3:36
这是我的带有可空布尔值的小表情:)
–贾罗德·迪克森(Jarrod Dixon)♦
2010-10-19 4:48
布尔? isValid = null; if(isValid ?? false);
– Skolima
2010-10-19 5:47
#8 楼
通常,您不希望在编码约定上花很多钱,除非所说的约定在某种程度上严重阻碍了项目。我已经看到许多激烈的争论在诸如代码区和下划线之类的小问题上升级。话虽如此,在条件语句中添加
== true
并没有问题。实际上,在测试负面条件时,我习惯使用== false
而不是领先的感叹号。我认为它更具可读性。如果有既定的约定,除非有理由更改,否则我说遵循它。但是,这真的不值得引起很大的反感。
评论
根据您的语言,即使someValue评估为true,也不一定等于true。例如,(9 == True)在Python中的计算结果为false,我想在C ++中也是如此。
–dash-tom-bang
2010-10-18 23:06
代码区域和下划线使我想打人。
– MGOwen
2010-10-19 3:42
#9 楼
阿克我就是那个人可耻,可耻。这就是我的学习方式,也是我头脑中的“自动格式化”方式。我唯一一次使用Joel的首选语法是当bool变量的动词前缀为“ is”时。我需要动词,例如“是”,“可以”,“已完成”,否则我需要==来提供动词“等于”。我可能永远不会改掉这个习惯,所以如果您在街上不跟我打招呼,我会明白的。评论
这不是一件坏事。看起来像真实文本的代码要比隐式foo好得多。为了便于阅读,请养成该习惯。
–罗尼·布伦德尔(Ronny Brendel)
2010-10-19 8:18
#10 楼
让我想起“布尔疯狂代码”,就像这样if(someBool == true)
otherBool = false;
else
otherBool = true
代替:
otherBool = !someBool
评论
这很有趣,我必须维护一个系统,这些系统到处都是垃圾。它使我发疯。
– Tjaart
2010-10-20 9:15
#11 楼
就我个人而言,我非常不喜欢基于C的语言说“不”的方式。那个小小的感叹号太容易忽略了。因此,我将其完整写出来:
if (someCondition == false) {
读了一段时间之后,我也想与
if (someCondition == true) {
对称,所以请考虑使用
!
而不是not
来解决C问题。评论
C ++实际上具有not运算符,C也具有not运算符(一旦您包含标准头文件
–康拉德·鲁道夫(Konrad Rudolph)
10-10-21在7:28
我会做Java。不是不是一种选择。
–user1249
2010-10-21 8:13
#12 楼
它取决于语言,但这通常是一个坏主意...在C语言中,请不要这样做。很容易发现您要测试的值不为假(非零),但也不等于定义为“真”的单个值的情况。
在Ruby中,仅当您完全确定要对除布尔值true以外的所有内容都失败时,才执行此操作。
在带有bool类型的C ++和其他静态语言中,这是多余的,当您错误键入
=
而不是==
时,可能会导致编程错误,或注释中提到的升级错误。 >评论
实际上,在赋值运算符返回值...的语言中,例如C ++ ... if(b == true){不只是多余的。这也有些冒险,因为您可能不小心将true赋给b。
– Stephen C
2010-10-19 8:34
这不仅在C ++中是多余的,而且很危险。如果您编写if(b == true),并且b不是布尔值,则类型转换将以错误的方式进行。布尔是整数类型,通常会提升为值为1的适当整数类型。如果您写成int b(2);如果(b == true),则为了进行比较,true变为一个值为1的int,而不是将b强制转换为bool类型,这将给出正确的结果。
– David Thornley
2010-10-19 18:02
@DavidThornley,在编译器中打开警告。将警告视为错误是一种更好的防御性编程技术,而不是避免==。
– Abyx
2011年12月8日在16:12
#13 楼
你以为不好吗怎么样:if(someCondition) {
return true;
} else {
return false;
}
评论
男孩,我已经看过多少次了。对于像ReSharper这样的工具,这是一个很好的例子。
–求职
2010-11-27 19:12
是的-如果您租用土块,请购买ReSharper。
–柯克·布罗德赫斯特(Kirk Broadhurst)
2011年11月22日下午5:19
#14 楼
我更喜欢if (bVal)
或
if (!bVal)
也太可惜了,但我担心提起它会生气人们离开,所以我的建议是忘记它。抱歉!
评论
对于所有神圣的事物的热爱,只要不是(!bNotVal)或if(bNotVal)都没有的话。名称中的否定词使所有内容都难以阅读。
–dash-tom-bang
2010-10-18 23:48
我知道一个开发人员会宣布isNotConnected;如果(isNotConnected == true)...
– Johnc
2010-10-19 2:04
#15 楼
你应该告诉他他做错了。如果(true == someBool){
}
如果他忘记了一个=他是他的写作风格遇到了很大的麻烦。
#16 楼
if (x == "true")
为什么是字符串?!
评论
我正在使用一些遗留的php代码,有时会发现类似if(preg_match('/ title /',implode($ _ POST))){。的东西。 PHP,足够说了,我需要找到更好的工作。
– Keyo
2010-10-19 5:23
是的,我也查看是否(x ==“ 1”),但这通常是针对较差的数据库设计。
– atfergs
2010-10-19 12:53
当x来自用户输入(例如,配置文件或Web服务)时,我使用了类似的构造。但是,我通常允许使用其他truish值,因此,最终结果更像[[true],“ yes”,“ on”,“ 1”]中的x.lower()。strip()
–eswald
2010-10-19 17:17
#17 楼
实际上,如果可以为空,则必须测试x == true。 :)#18 楼
我写这样的代码!这是为什么:
“ if bla == true”读起来像一个句子,而“ if bla”在很多情况下都不是。读取实际代码时,这听起来似乎是错误的。
编译器还会警告if块中的分配,因此使用== true确实没有危险。 (将其与=混淆)
不写“ == true”的人也将“!()”用于“ == false”吗?我觉得这很丑。而且,如果您使用“ == false”,那么也使用“ == true”是非常一致的,而不是使用两种不同的方式来验证真相。
评论
您说的“ if bla”读起来不像句子……这意味着您的变量命名不正确……这是怎么回事:if(userHasRights)doSomething()
– JoelFan
2010-10-19 13:13
“在许多情况下”。是的,你是对的。重命名也可以。如果使用“ if(QWidget :: acceptDrops()== true)”,则无法重命名。也许将它命名为dosAcceptDrops()可能会很好。。。这太麻烦了(并且不可能在任何API中使用该省略规则来保持一致),因此要与其他“ == what” -ifs保持一致,我强烈建议您不要忽略它,这样它就不会“看起来”有所不同,因此看起来是一致的。
–罗尼·布伦德尔(Ronny Brendel)
2010-10-19 13:34
#19 楼
请记住,您是团队的一部分,因此您需要一起解决这些问题。即使在上小学后,“与人和睦相处”仍然是一个重要的人格特质:)#20 楼
通常会忽略'== true',但是,除非您将其包含在团队的编码标准中,否则即使讨论一分钟也几乎不值得。评论
另外,如果它属于团队的编码标准,那么您确实需要重新评估这些标准,以消除这种琐事。
–JohnFx
10-10-18在20:11
同意!以防万一...
– FinnNk
2010-10-18 20:15
#21 楼
虽然我同意主要是C#开发人员,但我不能总是这样。例如,在Javascript中,===将执行类型合并。因此,假设var x = 3,则:if(x) --> true
while
if (x === true) --> false
我想这与==不同因为即使在JS中,我也不会使用if(x == true),而只是要考虑一下。
这种触动又出现在我办公室的另一点上:
bool b = false;
在C#中,布尔b;将足够,并且将b初始化为false。但是,编写上述代码更为明确,无论如何在优化过程中编译器都应将其剔除。而且很多归结为偏好以及语言功能/怪癖。
评论
布尔b;仅当b是字段时才初始化为false。您必须显式初始化局部变量。
–马修·弗拉申(Matthew Flaschen)
2010-10-19 5:55
+1同意。其他(脚本)语言也存在相同的问题。如果要测试布尔值true还是“ true”,则必须明确。例如,在某些语言中,将任何非空字符串视为== true,但不视为=== true。
–马丁·威克曼(Martin Wickman)
10-10-29在7:22
#22 楼
是的,但是如果变量可以为空,该怎么办? (布尔?)某些语言(C#)将需要并强制转换或与'true'进行比较。
bool? isAccepted = true;
if((bool)isAccepted)
{...}
if(isAccepted == true)
{...}
#23 楼
年轻的人知道规则,老的人知道例外;)在最新的
C#
中,如果要处理null-able bool
,则必须: /> 如果三态不是问题,那么通常就没有理由将其与
true
/ True
进行比较。但是,在Python
和其他几种语言(例如C/C++
)中,您可以在非布尔表达式上执行if
。这些语言具有用于将整数,指针,列表等解释为true或false的独特规则。有时您不想要那样。例如,在此Python代码片段中:现在,z
语言以另一种方式解决了这一问题-True
函数不一定要评估为z2
,但False
可以处理该问题。不管哪种语言,只要您发现自己在比较某些东西到
Clojure
或and
,可能值得一提。评论
第一个问题源于使用糟糕的变量名导致的错误前提IMO。假设x,y,z被命名为notExceptButHasX,NotNotButIsntY,doNotUnlessIsExceptZ吗?这如何使您的问题更具可读性?如果x,y,z被命名为“ isEnabled”,“ isEffective”,“ hasProperty”,则您的语句将变为isEnabled ||。 isEffective || hasProperty,它比true或false更具可读性。
–托马斯
2011-3-20在2:46
#24 楼
这样的编码以前也将以错误的方式抚慰我。尽管示例标识符的名称为“ someBool”,但在不能保证为布尔值的变量上无意中使用该编码样式可能会导致意外的行为。如果“ someBool”的值不完全是“ true”或“ false”,则结果将为false。去年,我遇到了一个非常细微的错误,该错误是由这种编码风格引起的,难以识别,因为一个人的眼睛掩盖了这种构造。您可能会想:“怎么可能错了?”对于“(var)”或“(!var)”等易于理解的表达式,您在不验证其行为的情况下进行读取或编码也是如此。
因此,我介绍了一些的代码标准,以减少代码库中此类错误的存在,并减少此类细微错误在将来某个时候意外蔓延的可能性。
所有布尔测试都必须以负数表示,例如“ suchBool!= false”。
通过清理不符合新样式的代码,我已经确定并更正了一些这些细微错误的实例。
评论
使someBool成为TRUE / FALSE以外的东西是不好的编码习惯。
–攻击流浪汉
2010-10-19在0:20
@AttackingHobo,这是没有语言中的布尔类型和/或不使用类来提供所需的确切行为的陷阱之一。
– Huperniketes
10-10-19在11:36
#25 楼
必须在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)
{
}
所以几乎总是最好要具体化。 >
#26 楼
我同意。这是多余的结构,特别是在强类型语言中。为了进一步滥用布尔值,我在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
值。#27 楼
我有一个同事,他的代码将是这样的:if(something == true)
然后,为了进行某种测试/调试,他希望不要调用此块,所以他'将其更改为:
if(something == true && false)
然后偶尔他会将其更改为:
if(false)
最糟糕的是,这种类型的调试有时会困扰我,对其他开发人员来说真的很糟糕!
#28 楼
我想说一致性是代码库中的王者。因此,您应该使用组织中最常用的样式。尝试使您偏爱的样式成为官方公司编码准则的一部分。如果已经在指南中,请遵循它。(话虽如此,这也确实使我烦恼-但可能不足以使它大为改观。)
#29 楼
我更喜欢不将多余的== true放置,但有时我不小心将其包括在内,却没有注意到。该人可能没有注意到并意外放置它们。我重读了我的代码,有时会注意到我放置了额外的== true,所以我删除了== true。有时我没有注意到它,会很乐意欢迎有人告诉我我多余地放置了它。#30 楼
怎么样:int j = 1;
for (int i=1; i>=j; i++) ...
是的,我已经看过了。
评论
我更喜欢显式的if(some_flag == true),但是隐式的if(is_something)或if(has_something)。注意变量名。提醒您的同事someBool == true的类型也是布尔值,因此根据相同的逻辑,如果((someBool == true)== true)应该是。
@GSto:我想您知道这一点,但是在PHP中,您可以执行此操作以将任何内容“投射”到布尔中,并且实际上很有用。
@zneak或者您可以更清楚一些,并使用$ var =(bool)some_expression。而且在大多数情况下,它甚至都没有关系,因为PHP会动态地进行必要的转换。
总是先检查常量,如果是(true == someBool),以防万一您不小心键入了=而不是== [是,我在开玩笑!]