代码之家  ›  专栏  ›  技术社区  ›  stagas

如果“else”即将发生,是否应该声明?[副本]

  •  13
  • stagas  · 技术社区  · 14 年前

    可能重复:
    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 回复  |  直到 7 年前
        1
  •  18
  •   Michael    14 年前

    无论如何,它在编译时得到优化,所以运行时没有差别。

    像往常一样,你可以争论风格。我的50美分:第一个变体(没有显式的其他变体)更好,因为这样做的代码更少。

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

    return a != 0;
    

        2
  •  25
  •   Russ    14 年前

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

        3
  •  6
  •   Nathan Fellman    14 年前

    我想说这样做是一个很好的实践,因为这样做会使修改代码更容易一些。例如,假设您想要打印结果。你可以这样改变它:

    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
    

    当然,这是一个人为的例子,但它展示了您应该如何使代码尽可能具有可维护性。

        4
  •  3
  •   kbrimington    14 年前

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

    请注意,代码优雅是主观的,因此教条式地坚持一种或另一种格式是不必要的。

        5
  •  2
  •   Dominique    14 年前
    if(statement)
           result = true
    else
           result = false
    
    return result
    
        6
  •  2
  •   Frxstrem    14 年前

    else 当没有一个 if else if 上面的陈述是正确的,那么就这样做吧
    但是,如果你有很多代码 如果 其他的 声明。

        7
  •  2
  •   Niels van der Rest    14 年前

    如果语言需要If/else语句的大括号,我个人喜欢删除else语句和附带的大括号。守则的意图将同样清楚,但守则将 减少缩进

    正如其他人提到的,编译器将优化else语句。但如果你在处理解释语言, 必须解释else语句 . 在这种情况下,删除它将导致未成年人( 非常

        8
  •  2
  •   Hendra Jaya    14 年前

    当然,“else”应该显式声明。

    “else”应该显式声明有几个原因:

    1. 可读性
    2. 概念的。你的第一个代码并没有告诉人类读者“如果‘if-guard’返回false,你会怎么做”。相反,您的代码告诉读者“默认值为false,true只在bla bla bla时发生”。或者换句话说,您的代码告诉读者“我假设值为false,只有当bla bla bla时才是true”。

    基于上述概念上的原因,它-当然-取决于您的函数规范。对于某些函数来说,使用这样的代码是有意义的。例如“函数假定访问者没有注册,只有当bla bla bla时他才被注册”。

        9
  •  1
  •   Ian Johnson    14 年前

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

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

        10
  •  1
  •   AJM    14 年前

    只需加入一个新的话题,继续做一些更令人兴奋的事情!

        11
  •  0
  •   nothrow    14 年前

    如果你想回来 true 当满足某个条件时(例如,找到某个对象),然后可能以另一种方式处理数据,最后,当没有找到任何对象时,返回false,该选项没有 else 更清晰。

        12
  •  0
  •   Ripter    14 年前

    没关系。无论哪种方式,编译器都会产生相同的代码。检查现有代码遵循的约定,然后执行相同的操作。

    就我个人而言,我不使用“else”,因为它很明显。我发现多余的“else”看起来杂乱无章。

        13
  •  0
  •   Cericme    14 年前

    我个人喜欢这种语法:

    /*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;
    

        14
  •  0
  •   timw4mail    14 年前
    function DoSomethingConditionally(foo)
    {
        if (Bar)
        {
            foo.DoX();
            return;
        }
        else
        {
            foo.DoY();
        }
    }
    

        15
  •  0
  •   supercat    14 年前

    我决定是否使用“else”取决于我对“if”的语义解释,在某些情况下还取决于返回值。如果我觉得“if”是在两个动作过程或两个返回值之间做出决定,我将使用“else”。如果我觉得这是在正常行动和“提前流产”之间做出决定,我会跳过其他的。在返回值回答问题“Doessomethingfail”的情况下,我通常会将错误返回视为提前中止,即使剩下的唯一要做的就是返回成功,因此跳过“else”。但是,如果返回值询问“Issomething xxx”,那么我将更经常地包含“else”。

        16
  •  0
  •   chugadie    14 年前

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

    而且,源代码分析器不会对此进行优化。额外的“else”将算作另一个逻辑分支。这可能会使您的函数比实际更“复杂”。请参阅“垃圾索引”、“圈复杂度”和其他软件度量。

    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;
    }
    
        17
  •  0
  •   Kevin Stock    14 年前

    LLVM Coding Standards Mozilla Coding Style 两者都声明在返回后不应使用else。

        18
  •  -1
  •   Scott Stanchfield    14 年前

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

    return (a != 0)
    

    但一般来说,我尽量避免从函数中间返回。每个函数有一个返回。