如果'else'即将发生,那么它是否会被宣布?

时间:2010-08-26 12:56:49

标签: coding-style if-statement

  

可能重复:
  Should ‘else’ be kept or dropped in cases where it’s not needed?

a = 0

此:

var foo = function() {
  if (a != 0) return true
  return false
}

或者这个:

var bar = function() {
  if (a != 0) return true
  else return false
}

18 个答案:

答案 0 :(得分:25)

你应该做任何使代码更清晰的事情。

答案 1 :(得分:18)

无论如何它都会在编译时进行优化,因此没有运行时差异。

像往常一样,你可以争论风格。我的50美分:第一个变种(没有明确的其他)更好,因为它的代码完全相同。

当然,在这种情况下,你会做

return a != 0;

......但我认为这个问题应该是一般性的。

答案 2 :(得分:6)

我认为这样做很好,因为它会使代码更容易更改。例如,假设您想要打印出结果。您可以像这样更改它:

if (a != 0) {
    print "returning true"
    return true
}
print "returning false"
return false

这意味着添加两次打印,否则:

if (a != 0) {
    retval = true
} else {
    retval = false
}

print "returning ", retval
return retval

这意味着添加一个印刷品,但如果没有其他印刷品,这将无效。

当然,这是一个人为的例子,但它显示了你应该如何尽可能地使代码保持可维护性。

答案 3 :(得分:3)

因为编译器可能会将它减少到相同的编译代码,所以做你认为更“漂亮”的事情。

请注意,代码优雅是主观的,因此不需要依赖于一种或另一种格式。

答案 4 :(得分:2)

if(statement)
       result = true
else
       result = false

return result

答案 5 :(得分:2)

在大多数语言中,两者的工作方式都相同,但我认为使用else最好使{em>更明显 if / else if以上陈述是正确的,然后执行此操作,即使这显然不是必要的 但是,如果你在if语句下面有很多代码,那么你就不应该这样做,因为它只会在很多不必要的else语句中变得非常混乱。

答案 6 :(得分:2)

如果语言需要if / else语句的大括号,我个人想删除else语句和随附的大括号。代码的意图同样明确,但代码将缩小,这通常会提高可读性。

正如其他人提到的,编译器将优化else语句。但是如果你正在使用解释性语言,必须解释其他语句。在这种情况下,删除它将导致次要(非常次要)性能提升。

答案 7 :(得分:2)

当然“else”应该明确声明。

为什么应该明确声明'else'有几个原因:

  1. 可读性
    我不会牺牲一些“酷”编程风格的可读性。但是,我会理解你是否面临着面向带宽的问题,比如缩小javascript。
  2. 概念。你的第一个代码并没有告诉人类读者“如果'if guard'返回false,你会怎么做”。相反,您的代码告诉读者“默认值为false,true仅在bla-bla-bla时发生”。换句话说,你的代码告诉读者“我认为这个值是假的,只有在bla-bla-bla时它才是真的”。
  3. 关于上面的概念原因,它 - 当然 - 取决于你的功能规范。对于某些功能,使用这样的代码是有意义的。例如“函数假定访问者未注册,他只在bla-bla-bla中注册”。

    但是对于另一个问题,例如“如果一个数字可以被2整除,那么它甚至是奇怪的”,你应该明确地写它,这样读者(或许不是程序员)在阅读你的代码时不会感到困惑。由于读者(可能是数学家)只知道这种不变量,他/她只对编程语言有所了解。

答案 8 :(得分:1)

如果它是多余的,我倾向于不使用else,任何开发人员都应该了解会发生什么:

public void DoSomethingConditionally(Foo foo)
{
    if (Bar)
    {
        foo.DoX();
        return;
    }
    foo.DoY();
}

我不同意每个功能只需要一个返回点的人,你的功能应该很小,一些返回点增强而不是妨碍可读性。

答案 9 :(得分:1)

坚持下去,继续做一些更令人兴奋的事情!

答案 10 :(得分:0)

IMO - 如果您的目的是在满足某些条件时返回true,(例如找到某些内容),然后可能以其他方式处理数据,最后,当找不到任何内容时,返回false,没有else的选项更清晰。

如果您的返回值仅取决于if中的条件,则if-else变体看起来更好。

答案 11 :(得分:0)

LLVM Coding StandardsMozilla Coding Style都声明返回后不应使用其他内容。

答案 12 :(得分:0)

这个例子过于简单化了。大多数答案都提倡编码捷径,这避免了关于逻辑分支的真正问题。编译器可以优化else分支,这样它在逻辑上等同于不使用else分支,但为什么让编译器工作更多?如果这是一种经常编译的脚本语言,则没有理由添加额外的“else”。

此外,源代码分析器不会对此进行优化。额外的“else”将被视为另一个逻辑分支。这可能会使您的功能比它们更“复杂”。请参阅“CRAP索引”,“Cyclomatic Complexity”和其他软件指标。

http://en.wikipedia.org/wiki/Cyclomatic_complexity

如果以下两个示例都将编译器优化为相同的字节代码,请选择适合您的样式并坚持使用。就个人而言,我觉得第一个例子更易于维护。

public void DoSomethingConditionally(Foo foo)
{
    if (Bar)
    {
        foo.DoX();
        return;
    }
    if (Baz)
    {
        foo.DoZ();
        return;
    }

    foo.DoY();
}



public void DoSomethingConditionally(Foo foo)
{
    if (Bar)
    {
        foo.DoX();
    }
    elseif (Baz)
    {
        foo.DoZ();
    }
    else 
    {
        foo.DoY();
    }
    return;
}

答案 13 :(得分:0)

我决定是否使用“else”取决于我对“if”的语义解释,在某些情况下取决于返回值。如果我觉得“if”决定在两个行动路线或两个返回值之间,我将使用“else”。如果我觉得它在正常行动和“早退”之间做出决定,我会跳过其他人。如果返回值回答了问题,“确实失败了”,我通常会将错误返回视为早期中止,即使剩下的唯一要做的事情就是返回成功,因此跳过“其他”。但是,如果返回值询问“是xxx”,那么我将更多地包含“else”。

答案 14 :(得分:0)

function DoSomethingConditionally(foo)
{
    if (Bar)
    {
        foo.DoX();
        return;
    }
    else
    {
        foo.DoY();
    }
}

我喜欢这种风格,以防我以后需要添加一些东西。

答案 15 :(得分:0)

我个人喜欢语法:

/*Function header comments*/
Function(...)
{ 
  /*English what the if is trying to achieve*/
  If(...)
  {
    ...
    Return True; /*What this tells me*/
  }
  Else
  {
    ...
    Return False: /*What this tells me*/
  }
}

仅仅因为我发现自己处于这种状况

If(...)
Return True;
Else
Return False;

If(...)
Return True;

Return False;

(...)?Return True:Return False;

这还不是很清楚,即使有正确的评论,一个班轮很酷,如果我正在进行比较,那么很有可能在路上我可能会想到需要发生的事情。无论如何,我的意思是我做的不仅仅是咧嘴笑。此外,如果我发现需要Else的特殊情况如果仅仅是添加Else If部分的问题。

答案 16 :(得分:0)

没关系。编译器将以相同的方式生成相同的代码。检查现有代码遵循的惯例,然后执行相同的操作。

就我个人而言,我没有把“其他”放进去,因为它很明显。我发现额外的“其他”看起来很杂乱。

答案 17 :(得分:-1)

在这种情况下,只需直接返回表达式结果。

return (a != 0)

但总的来说,我试图避免从函数中间返回。每个功能有一个返回。