“如果(0 ==值)…”弊大于利吗?[关闭]


49

当我在别人的代码中看到它时,这是我最讨厌的事情之一。我知道它的含义以及为什么有人这样做(例如,如果我不小心放了'='怎么办?”)。对我来说,这就像一个孩子下楼,大声地数步。

无论如何,这是我反对的论点:

  • 它破坏了读取程序代码的自然流程。我们人类说“如果值等于零”而不是“如果值等于零”。
  • 当您的条件中有一个赋值,或者实际上您的条件仅由该赋值组成时,现代编译器会警告您,是的,无论如何看起来都是可疑的
  • 如果您是程序员,则在比较值时不要忘了加双'='。您可能会忘记加上“!”。测试不平等时。

17
我也不太在乎,但这远不及我个人的宠物惹恼清单。
亚当·克罗斯兰

7
程序员有时确实会错过双'='。这是一个容易犯的错误,而且很容易被忽视。
2010年

8
这怎么不是建设性的或不是真正的问题?
TheLQ '11

7
这是封闭的,所以这是我的简短见解:人们怎么会记得写0 == value而又不记得写==?我的意思是blimey,如果您正在考虑它,为什么不正确地开始编写它。
汉尼拔·莱克特博士

3
@muntoo:根据编译器,很多事情都是“正确的”,我认为这不是一个很好的基准。
汉尼拔·莱克特博士

Answers:


59

嗯,是的,“ Yoda条件句”(“如果值为零,则必须执行此代码!”)。我总是指出任何声称自己“更好”使用lint(1)之类的工具的人。自70年代末以来,这个特殊的问题就已经解决了。大多数现代语言甚至都不会编译像这样的表达式if(x = 10),因为它们拒绝强制赋值给布尔值的结果。

正如其他人所说,这当然不是问题,但确实会引起一些认知失调。


32
+1为“ Yoda条件”。我实际上对此大声笑。:)
Bobby Tables 2010年

3
尽管排序很好,但我反对将其与零进行比较,而不是简单的布尔类型转换if(!value)
SF。

1
因此,您认为条件内的赋值是错误的吗?

4
“大多数现代语言甚至都不会编译它”当您使用的是一种默默地强制将赋值给布尔值的语言时,就会出现问题。我能想到的最流行的语言就是JavaScript。这就是为什么即使在Java中我也总是使用yoda条件语句,以便在编写javascript时不会忘记这样做。我经常在这两者之间切换,可能会(并且一直)是一个问题。
山姆·哈斯勒

3
有人知道不会编译的编译器if (0 == x)吗?
克里斯托弗·艾夫斯

56

它令人讨厌,因为它征收了少量但引人注目的精神税。

人们几乎以所有编程语言(和大多数自然语言)从左到右阅读。

如果我看到了123 == x,我在心理上解析的方式是:

  • 123- 所以呢?信息不完整。
  • == -123是123,为什么要测试...
  • x-好的,这就是我们所关心的。直到现在我才有了上下文。
  • 回到重新考虑123以及为什么将x与之比较。

当我看到x == 123心理分析是:

  • x-提供上下文,我知道情况是什么。我可能会选择忽略其余部分。根据先前的流程,我很好地知道了为什么以及接下来要发生什么(如果有所不同,我会感到惊讶)。
  • == - 我是这么想的。
  • 123 - 对。

中断很小(在一个简单的示例中),但是我总是注意到它。

如果您引起重视,例如,将价值放在首位可能是个好主意if (LAUNCH_NUKES == cmd)。通常这不是故意的。


5
究竟。在自然语言中,常量总是出于相同的原因而持续最后:如果灯是红色的……
mojuba 2010年

2
@mojuba是的,这几乎是普遍的。奇怪的是,有几种自然语言会将对象放在主题之前(OVS / OSV顺序),但是它们都是晦涩的。
dbkk 2010年

1
另一方面,我们中有些人倾向于在变量之前读取符号。他们更引人注目。因此,我将解析出===之前123或之后x,最终甚至不费脑子将代码翻译成英语。
伊兹卡塔2012年

另外,除非正确使用提示,否则大多数编译器都会发出警告,除非使用大括号,否则它会尝试解决一个非问题。
重复数据删除器

47

有害?否。无论哪种方式都可以。

不良做法?值得商bat的。这是简单的防御性编程。

值得失去睡眠吗?没事


8
当我阅读它时,我立即理解了代码,这对我来说是辩论编码风格的最重要原因。我完全同意,不值得失去睡眠。
杰夫·西弗

17

这基本上是flaimbait。

不,这样做弊大于利。简单。

还有更多字?

编译器参数?Erm,ish,也许-不要对编译器抱有太大的信心,以免您陷入困境。

“你不应该忘记” -好 -不,你当然不应该同时我累了,我已经编码了一整天,我不得不使用两种不同的语言,有时,只是有时候,做人我做错误。

这种行为的关键在于它的防御性,它不存在,因为您期望犯错误的可能性超过了保险,因为您期望崩溃会导致错误……但是如果您做得很好,就会被掩盖。

难以阅读?您抱怨的是,一个体面的程序员应该使用==进行硬接线(这会做出各种错误的假设),但是同一位体面的程序员无法读取0 == value?

不伤害,有潜在的好处,愚蠢的问题,如果其他人愿意,请继续这样做。


6
我认为对于那些在学习编程之前就学习过代数方式的人来说,0 == value是不自然的。
mojuba 2010年

4
那不是重点-是的,是的,它的阅读不正确,但同样地,作为程序员,我们写的东西并没有完全像自然语言那样堆积,这与您如何解释内容有关您会看到
Murph

4
太好了。更不用说一个事实,因为它读起来不自然,所以您倾向于更仔细地注意它,从而发现了潜在的错误。
mocj 2010年

7
@mocj-因此,我们都应该尽可能简化代码,以确保阅读我们代码的人需要真正阅读我们的代码吗?
卡兹巨龙

6
@mocj-非常感谢,但是您的观点是,在阅读有条件的Yoda时出现“脑结巴”是一件好事。我在问一个问题,如果是这样,我们是否应该以编写所有代码为目标,从而导致“脑结巴”?真正的问题。
Kaz Dragon

11

我不会称其为伤害,但令人讨厌。所以不,我不会说。


10

我从来没有感觉到整个“如果我忘记=会怎样?”。曾经真正担负过重。是的,您可能会打错字,但我们所有人都会打错字,更改整个编码样式似乎很愚蠢,因为您担心会犯错误。为什么不将所有变量和函数全部小写而不加标点符号,因为您可能会忘记大写某些东西或忘记下划线呢?


5
这不是问题的重点,重点是“是否有害”-并非如此。最坏的情况是非常轻微的刺激,但无害。
Murph 2010年

1
在动态语言中-绝对可以,您可能会输错符号并浪费时间在寻找错误的根源
mojuba 2010年

3
从各方面来讲,当您花了一晚(或两晚)发现源(用C ++代码)是一个=而不是==时,它将带有一些分量。
DevSolo

2
@DevSolo:我认为这应该在您的职业生涯中真正发生一次或两次,但不要超过此次数
mojuba 2010年

9

某些人使用它来明确弄清条件在做什么。例如:

方法1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

方式2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

有人认为第二个示例更为简洁,或者倒置参数说明了测试本身之前的测试要点(有条件的)。

实际上,我都不介意任何一种方式。我对风格充满热情,最大的矛盾是不一致。因此,请以相同的方式进行操作,始终如一,我也不会介意阅读您的代码。

混合起来,看起来好像六个不同的人立即用自己的独特风格进行处理,我有点生气。


4
第二个例子让我走了吧?第一个更具可读性。很好的例子。:)
Mateen Ulhaq

6

对我来说,这很简单。作为(在20世纪90年代)学习过C和C ++的人,我已经习惯了它,并且仍然使用它,即使有很多原因可以借鉴。

一旦“适应”了左侧的“常数”,它便成为了第二天性。

我也仅将其用于等价(或取反的等价),而不用于大于/小于。

我完全同意@Wonko的回答。


5

我发现这很有用的一种情况是if的变量部分很长,并且看到这些值使代码更易于阅读。虚线的命名空间语言就是最好的例子。

例如,我从事单点登录工作的情况是,如果发生某种类型的错误并以某种方式恢复,则您可能会有两个并发会话,因此我必须为其添加一个处理程序,该处理程序在if外观内像这样的东西:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

诚然,在此示例中,还有其他方法可以执行此操作,但是在这种情况下,数字优先版本可能更具可读性。


2
我认为这里的关键词是“其他方法”;)
mojuba 2010年

在这种情况下,是的,但是在某些情况下,这仍然是最易读的结果。我唯一的一点是,有比打击的语言或IDE行为和O型这样一些其他的正当理由
比尔

老实说,我在<=和> =的Yoda条件上遇到困难。==符号是另一回事,因为在我的脑海中我只能切换符号,但是在您的情况下,我需要记住count()必须大于或等于2,这很烦人。较小或相等的符号。
亚历克斯(Alex)

3

但是错误仍然发生。有时您希望在循环运算符中进行赋值,否则可能会检查相等性,或者至少使用它是标准做法。

我对此有所保留。我所遵循的建议(可能来自Code Complete)是在比较中将左侧的较低值保持为原值。我之前与同事讨论过这个问题,他认为这有点疯狂,但我已经习惯了。

所以我会说:

if ( 0 <= value )

但是我也会说:

if ( value <= 100 )

平等我倾向于检查左边的变量,因为它更具可读性。


1
我习惯了if(y > x)所有时间。除非y是常量。
Mateen Ulhaq,2010年

我曾经那样做,但是一旦我想到了最低值在左侧,我发现我的代码一目了然。
glenatron 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.