我的一位同事不断写道:
if (someBool == true)
它把我推高了!我应该大量使用还是仅丢弃它?
someBool == true
也是布尔值,因此按照同样的逻辑也应该是if ((someBool == true) == true)
。
$var = (bool) some_expression
。在大多数情况下,它甚至都没有关系,因为PHP将动态地进行必要的转换。
我的一位同事不断写道:
if (someBool == true)
它把我推高了!我应该大量使用还是仅丢弃它?
someBool == true
也是布尔值,因此按照同样的逻辑也应该是if ((someBool == true) == true)
。
$var = (bool) some_expression
。在大多数情况下,它甚至都没有关系,因为PHP将动态地进行必要的转换。
Answers:
这只是冗余代码,不是生与死。然而....
如果经常发生,someBool
命名方式可能会出现问题。一个好名字可以大大消除对==true
if(IsSomeCondition)
要么
if(hasCondition)
要么
if(somethingExists)
例如。
someBool == true
为了清楚起见,我不得不多次使用遗留代码。但是,如果我从头开始编写,我会相应地命名变量并使用if (isSomething)
当我看到时someBool == true
,我禁不住觉得程序员还没有内化评估的想法,这是一个非常根本的缺陷。
但是,我的观点是歪斜的,因为我花了几个暑假在大学里为孩子们教授编程,他们之所以经常写这样的表达,是因为他们确实没有掌握评估表达的心理活动。一旦他们理解了这个概念,冗余就变得显而易见了。
对于其他有能力的专业程序员,情况可能并非如此。这可能只是他们在编程初期就养成的一种坏习惯,而且从来没有动摇过。但是,如果这是我在面试中看到某人所做的第一件事,仍然会令我有些恐惧。
if (c == true) return true; else return false;
,但是有99%的时间(有1%的时间在那儿,因为我无法确定自己没有错过什么),我会立即注意到并用代替整个内容return c
。我希望大多数有能力的程序员如果在职业生涯的早期就养成习惯,就应该做类似的事情。我不期望的是wtf响应。
if (!someCondition) { someCondition = false; }
我已经在我们的代码中看到了一些(很多)冗余以及一些不可能,但是这个代码很简单,但是却以为有人真正写了它而使情况更糟。甚至多次。
if(x) x=true;
不是多余的,而是等效于x=!!x;
(将x归一化为0/1)
这也使我发疯,但是我要说的是以建设性的方式向他们提及冗余,然后即使他们不同意也要放弃它。
或者,您可以尝试这种方法:
您:您可以开始使用以下代码约定来评估布尔值吗?
if (someBool==true)&&(true==true) {}
他们:我们为什么要这样做?该语句的后半部分是多余的,它将始终为true。
您:乔治,您说得对。傻我 那么,我们就选择一个没有所有冗余的版本。怎么样?
if (someBool) {}
true=true
无法编译,您无法分配给true
;-)
if(somebool == false)
或!=
,但是总是反对false和not true。我发现它是多余的,但是由于编码标准坚持认为if()
看起来像一个函数调用,括号之间的空白有助于我阅读它。就我个人而言,布尔是布尔,但if (somePointer)
不会飞;我更喜欢if (somePointer != NULL)
因为指针不是一个布尔值。
我认为,如果琐事是您与同事之间最大的问题,那么您应该认为自己很幸运。
您绝对应该停止这种不良习惯。轻轻地...
很容易忘记编写双等号,将代码转换为:
if (someBool = true)
例如,在C#中,这只会产生警告,而不是错误。因此,除非将警告视为错误,否则代码将运行,请将变量设置为true并始终输入条件。
if (answer = 42) {}
根本无法编译,因为该表达式不是布尔值。
我同意你的观点,但是我将在这里扮演魔鬼的拥护者:
根据语言和变量的名称,x == true是合适的:
请考虑以下情况,这种语言具有静态类型和整数类型的类型强制:
if (actionsAllowed){
//do actions, since they are allowed
//...
}
读完本节代码的人可能不会立即意识到actionsAllowed是一个布尔变量-它也可以是整数,表示允许的操作数。因此,通过添加== true,可以清楚地看到x是一个布尔值,而不是强制转换为布尔值的整数:
if (actionsAllowed == true){
//do actions, since they are allowed
//...
}
actionsAreAllowed
。
if (x) { ...
您已经在断言它x
是布尔值还是可以转换为布尔值。您所说的与您无关。
那可空布尔呢?
bool? MyFlag = null;
if (MyFlag == true)
;
if (MyFlag) // error, doesn't compile!
;
通常,您不希望在编码约定上花很多钱,除非所述约定在某种程度上严重阻碍了项目。我已经看到许多激烈的争论在诸如代码区域和下划线之类的小问题上升级。
话虽如此,我认为添加== true
条件语句没有问题。实际上,== false
在测试负面条件时,我习惯于使用而不是领先的感叹号。我认为它更具可读性。
如果有既定的约定,除非有理由更改,否则请遵循。但是,真正值得一提的是。
(9 == True)
在Python中评估为false,我可以想象在C ++中也是如此。
让我想起“布尔疯狂代码”,就像这样
if(someBool == true)
otherBool = false;
else
otherBool = true
代替:
otherBool = !someBool
就我个人而言,我非常不喜欢基于C的语言说“不”的方式。那个小小的感叹号太容易忽略了。
因此,我将其完整写出:
if (someCondition == false) {
看了一段时间后,我也想对称
if (someCondition == true) {
因此,请考虑使用C !
代替not
。
not
运营商,也是如此C(一旦你包含标准头<iso646.h>
)。如果您不想(或不能)使用此标头(或者您被Java或C#所卡住),建议您在感叹号后添加一个空格:if (! condition)
。这使它更加显眼。
这取决于语言,但这通常是个坏主意...
在C语言中,绝对不要这样做。很容易发现您要测试的值不是false(非零),但也不等于定义为“ true”的单个值的情况。
在Ruby中,仅当您完全确定要对除Boolean true以外的所有内容都失败时,才执行此操作。
在具有bool类型的C ++和其他静态语言中,它是多余的,并且在您键入错误=
而不是时可能导致编程错误==
,或者引起注释中提到的升级错误。
if (b == true) {
),不仅是多余的。这也有些冒险,因为您可能不小心将分配true
给b
。
if (b == true)
,而b
不是一个布尔值,类型转换的走错路。A bool
是一个整数类型,通常会提升为带有值1的适当整数类型。如果您说,例如,int b(2); if (b == true)
然后为了比较的目的而true
变成一个int
带有值1的a,而不是b
被强制为type bool
,这将给出正确的结果。
==
。
我更喜欢
if (bVal)
要么
if (!bVal)
也有,但是我担心提出来会使人们生气,所以我的建议是忘记它。抱歉!
if (!bNotVal)
或if (bNotVal)
甚至在首位。名称中的否定词使所有内容都难以阅读。
怎么样
if (x == "true")
为什么是一个字符串?
if(preg_match('/title/', implode($_POST))){
。PHP,足够说了,我需要找到更好的工作。
x
来自用户输入(例如配置文件或Web服务)时,我使用了类似的构造。但是,我通常允许使用其他值,所以最终结果更像是if x.lower().strip() in ["true", "yes", "on", "1"]
实际上,如果可以为空,则必须测试x == true。:)
我写这样的代码!
原因如下:
“ if bla == true”的读起来像一个句子,而“ if bla”在很多情况下都不是。在读取实际代码时,这听起来似乎是错误的。
编译器还会警告if块中的分配,因此使用== true确实没有危险。(将其与=混淆)
那些不写“ == true”的人还会用“!()”代替“ == false”吗?我觉得这很丑。而且,如果您使用“ == false”,则仅使用“ == true”也是非常一致的,而不是采用两种不同的方式来验证真相。
通常会忽略“ == true”,但是,除非您将其包含在团队的编码标准中,否则即使讨论一分钟也几乎不值得。
尽管我以主要的C#开发人员的身份同意,但我不能总是这样。例如,在Javascript中,===将执行类型合并。因此,假设var x = 3,则:
if(x) --> true
而
if (x === true) --> false
我想这与==不同,因为即使在JS中,我也不会使用if(x == true),而只是要考虑一下。
我办公室的另一点是这样的:
bool b = false;
在C#中,布尔b; 就足够了,并且会使b变为false。但是,更明确的是编写上述行,并且无论如何在优化过程中编译器都应将其删除。
因此,我想我的意思是,什么是好方法,哪些不是好方法并不总是那么明显,很多归结为偏好以及语言功能/怪癖。
bool b;
仅在b
为字段时才初始化为false 。您必须显式初始化局部变量。
true
或仅测试“ true”,则必须明确。例如,即考虑任何非空字符串,== true
但不考虑=== true
某些语言。
年轻的人知道规则,老的人知道例外;)
最近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.
}
如果tristate没问题,那么通常不应该将理由与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
可以处理。
无论使用哪种语言,只要您发现自己与True
或进行比较False
,就可能值得一提。
notExceptButHasX
,exceptNotButIsntY
,doNotUnlessIsExceptZ
?这如何使您的问题更具可读性?如果x,y,z被命名为“ isEnabled”,“ isEffective”,“ hasProperty”,则您的语句变得isEnabled || isEffective || hasProperty
比与true
或更具可读性false
。
这样的编码以前也将以错误的方式抚慰我。尽管示例标识符的名称为“ someBool”,但在不能保证为布尔值的变量上无意中使用该编码样式可能会导致意外的行为。如果“ someBool”的值不完全是“ true”或“ false”,则结果将为false。
去年,我遇到了一个非常细微的错误,它是由这种编码风格引起的,由于人的眼睛在这种结构上蒙上了一层眼睛,所以很难识别。您可能会想:“怎么可能错了?” 对于诸如“(var)”或“(!var)”之类的易于理解的表达式,您在不验证其行为的情况下对其进行读取或编码也是如此。
因此,我引入了一些编码标准,以减少代码库中此类错误的存在,以及减少此类细微错误在将来某个时候意外蔓延的可能性。
通过清理不符合新样式的代码,我确定并纠正了一些此类细微错误的实例。
必须在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)
{
}
因此,几乎总是最好要具体。
我同意。这是多余的结构,特别是在强类型语言中。
为了进一步滥用布尔值,我在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
值。
if (some_flag == true)
但隐式的if (is_something)
orif (has_something)
。注意变量名。