'if'语句是否应该总是有'else'子句?

时间:2009-11-22 23:21:45

标签: coding-style

这可能是一个宗教论点,但在我的工作中一直争论是否所有IF语句都应该包含ELSE子句 - 即使ELSE子句只包含一条注释,说明它是'故意留空'

我听过双方的争论: 'For'阵营 - 确保代码实际上解决了条件是否需要ELSE子句 “反对”阵营 - 代码难以阅读,增加了太多噪音

我对任何其他观点感兴趣,因为我必须以满足双方的答案来解决这场辩论。

感谢您的帮助。

顺便说一句:我确实搜索了StackOverflow以获得答案,但却无法找到答案。如果有,只需包含一个链接并关闭。感谢。

18 个答案:

答案 0 :(得分:136)

似乎对我来说无用的打字......以及可能造成混淆的原因。如果你不需要它,不要把它!

答案 1 :(得分:46)

没有。如果您不需要在else端运行任何代码,则不需要else子句。

答案 2 :(得分:32)

这里的答复很清楚,没有人觉得需要一个未使用的其他人。我从未听过或读过这样的话。在你与同事/开发人员打交道之前,更重要的问题是,他们坚定地相信这就是If Then的用法。

听起来你不是这个场景中的老人,所以你不能简单地判断它是如此。我建议要求“空的其他”方面显示在一本关于开发的书中(博客不计)这样的过程。更好的是,在3本关于发展的书中。自1982年以来,我已阅读了编程语言的编程书籍,我从未见过这样的建议。

这样你就不会告诉他们他们错了,他们可以亲自带走。相反,你愿意接受这样的立场,但希望看到一些文件。他们有责任找到证据。要么是他们找到了,要么他们只是认为每一本编写的编程书都是错的,只有他们是对的。

祝你好运。

答案 3 :(得分:15)

黄金法则:如果它使您的代码更清晰,更容易理解,请将其放入,否则将其删除。经验丰富的程序员将能够根据具体情况做出这些判断。

答案 4 :(得分:14)

你在谈论Algol派生的语言吗?

在Lisp中,我会说是的:每个IF都应该有一个else子句。否则,您应该使用WHEN。

答案 5 :(得分:11)

正如你所说,这可能是一个风格问题,但我不会梦想在我的代码中插入空的else块只是因为“每个if-block都应该有一个”。在我看来,除了代码中的更多字符外,它还添加了一些其他字符(非常值很小),以便在代码审查期间花时间。

答案 6 :(得分:8)

要求else发臭。需要时使用它。所有程序员都理解缺失else的构造和含义。这就像一个无意义的评论,回应了代码。这简直就是IMO。

答案 7 :(得分:8)

我倾向于使用“early if”语句作为降低嵌套大括号(或Python中的缩进)级别的方法,如下所示:

if (inParam == null) {
  return;
}

if (inParam.Value < 0) {
  throw new ArgumentException(...,...);
}
// Else ... from here on my if statements are simpler since I got here.

当然,.Net 4.0现在有代码合同,这很棒!但是,大多数语言还没有,所以“早期ifs”(缺乏更好的术语)非常精确,因为它们消除了许多其他条款和嵌套ifs。我不认为在高级语言中使用else子句是有益的...即使在汇编中也是如此!这个想法是:如果你检查并且没有跳,那么条件是错误的,我们可以继续。对我来说具有逻辑意义......

编辑:查看这篇文章,了解为什么else条款没有多大帮助: http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

答案 8 :(得分:6)

没有。警卫条件就是一个很好的例子。你可以将其余的方法逻辑嵌套在else子句中,但它可能会很快变得丑陋。

答案 9 :(得分:6)

  

“确保代码实际存在   解决是否有条件   需要ELSE条款“

这不仅仅是要求每个方法中的catch子句确保所有可能的异常都得到了正确处理。

答案 10 :(得分:4)

至少SQL Server 2000,2005。

IF 1 = 1
BEGIN
    PRINT 'doing something productive'
END
ELSE
BEGIN
    --Just sitting here
END


Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'END'.

您必须有一个有意义的声明,这意味着虚拟分配或返回客户端的数据。我想我可以使用WAITFOR DELAY ...

答案 11 :(得分:4)

if (thereIsSomeThingToDoInTheElse)
{
    putAnElseClause();
}
else
{
    // intentionally left blank
}

答案 12 :(得分:3)

只有空行代码注释的“else”通常意味着开发人员会仔细考虑条件并更好地了解在给定时间实际执行的执行路径。所有最近的编译器都将删除“else”和注释,因此您不会减慢软件执行速度。

除非我正在错误地阅读其他答案,否则看起来大多数人都反对在代码中声明他们的想法所花费的时间,而宁愿这样做。

答案 13 :(得分:3)

Haskell的if总是三元的。所以其他是强制性的。

答案 14 :(得分:2)

有很多“单词”告诉你编程的方式,比如DRY

在这种情况下,我会使用YAGNI ..你不需要它..

所以在此之后你不应该写别的。

无论如何,在我看来,这使得阅读和理解代码变得更加困难..你写的越多,理解代码就越难了

编辑: 这是您要求的链接: http://en.wikipedia.org/wiki/YAGNI http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

答案 15 :(得分:2)

这可能是一个好主意的少数可能情况之一是你有几个嵌套的if语句,但else个句子较少。该语言将指定if匹配的else,但读者可能并不总是清楚这一点。当然,在将内容放在大括号中的情况下,嵌套将是显而易见的,因此没有歧义。这使得这有点像人工案例,但仍有可能值得一提。此外,如果您的代码很复杂,那么可能有更清晰的编写方式。

答案 16 :(得分:2)

如果您的代码足够复杂,这就成了问题,那么您应该重新考虑解决问题的方法。将你正在做的事情分解成更小的更简单的函数,其中if语句正在做什么应该是令人难以置信的明显。

如果你不能将它分解为更小的函数,或者你发现自己在另一个函数中嵌套了多个if语句,那么对条件逻辑使用if语句可能不太合适。考虑开关,查找表(如果您的条件之间的唯一区别是某个常量的值)或决策表。

如果你已经完成了所有这些,那么你正在狡猾地讨论一些令人难以置信的微不足道的事情,你几乎不值得花时间去辩论。

答案 17 :(得分:1)

在某些情况下,在不需要时使用可选语法元素可以提高可读性或防止将来出现错误。典型案例是围绕一句话条件的括号:

否则

if(foo){
    bar
}

而不是

if(foo)
    bar

最终会阻止

if(foo)
    bar
    dot

我真的不能想到我知道的任何语言,省略不必要的 else 会导致潜在的错误: - ?