Coding style 如果';其他';无论如何都会发生,是否应该宣布?

Coding style 如果';其他';无论如何都会发生,是否应该宣布?,coding-style,if-statement,Coding Style,If Statement,可能重复: 什么时候 这: 或者这个: var bar = function() { if (a != 0) return true else return false } 您应该尽可能使代码更清晰。在这种情况下,只需直接返回表达式结果即可 return (a != 0) 但一般来说,我尽量避免从函数中间返回。每个函数有一个返回 无论如何,它都会在编译时得到优化,所以运行时没有差异 和往常一样,你可以争论风格。我的50美分:第一个变体(没有显式的其他变体)更好,因为它没有那么多代码

可能重复:

什么时候

这:

或者这个:

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

您应该尽可能使代码更清晰。

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

return (a != 0)

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

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

和往常一样,你可以争论风格。我的50美分:第一个变体(没有显式的其他变体)更好,因为它没有那么多代码做完全相同的事情

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

return a != 0;

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

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

if(statement)
       result = true
else
       result = false

return result
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
这意味着添加一个打印,但如果没有其他打印,这将无法工作


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

这两种语言在大多数语言中的工作原理是相同的,但我认为使用
else
最好是更明显地说明,当上面的
if
/
else if
语句都不正确时,就这样做,尽管这显然是不必要的。

但是,如果在
if
语句下面有很多代码,那么就不应该这样做,因为这样做只会让大量不必要的
其他
语句变得一团糟。

因为编译器可能会将其缩减为相同的编译代码,所以请做您认为更“漂亮”的事情


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

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

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

我不同意那些每个函数只需要一个返回点的人,你的函数应该很小,几个返回点可以增强而不是阻碍可读性。

如果语言要求If/else语句使用大括号,我个人喜欢删除else语句和附带的大括号。代码的意图同样清晰,但代码缩进程度将降低,这(通常)提高了可读性


正如其他人提到的,编译器将优化else语句。但是如果您处理的是解释性语言,必须解释else语句。在这种情况下,删除它将导致轻微(非常轻微)的性能提高。

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


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

这无关紧要。无论哪种方式,编译器都将生成相同的代码。检查现有代码遵循的约定,然后执行相同的操作


就我个人而言,我不会用“其他”这个词,因为这是显而易见的。我发现额外的“else”看起来很混乱。

我个人喜欢这种语法:

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

这不是很清楚,即使有正确的评论,一行是很酷的,如果我做一个比较无论如何,有一个很好的机会,我可能会想到一些需要发生的事情在该地区无论如何,我的意思是我做一个如果超过微笑。另外,如果我发现一个特殊情况需要一个Else-if,那么只需添加Else-if部分即可

function DoSomethingConditionally(foo)
{
    if (Bar)
    {
        foo.DoX();
        return;
    }
    else
    {
        foo.DoY();
    }
}
我喜欢这种风格,以防万一我以后需要添加一些东西

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

应明确声明“else”的原因有几个:

  • 可读性
    我不会为了一些“酷”的编程风格而牺牲可读性。但是,如果您面临诸如缩小javascript之类的面向对象问题,我会理解的
  • 概念上的。您的第一个代码不会告诉人类读者“如果‘if-guard’返回false,您会怎么做”。相反,您的代码告诉读者“默认值为false,true仅在bla-bla-bla时发生”。或者换句话说,您的代码告诉读者“我假设值为false,只有当bla-bla-bla时才为true”
  • 基于上述概念上的原因,这当然取决于您的函数规范。对于某些函数,使用这样的代码是有意义的。例如,“函数假定访问者未注册,仅当bla bla bla时他才注册”


    但是对于另一个问题,比如“如果一个数字可以被2整除,那么它甚至是奇数”,您应该显式地编写它,这样读者(可能不是程序员)在阅读代码时就不会感到困惑。因为读者(可能是数学家)只知道这样的不变量,他/她只知道一点编程语言。

    我决定是否使用“else”取决于我对“if”的语义解释,在某些情况下还取决于返回值。如果我觉得“如果”决定了两个行动方案或两个返回值,我将使用“其他”。如果我觉得是在正常行事还是“提前堕胎”之间做出决定,我会跳过其他步骤。如果返回值回答了问题“某件事失败了吗”,我通常会将错误返回视为早期中止,即使剩下的唯一要做的事情是返回成功,因此跳过“else”。但是,如果返回值询问“Is something xxx”,那么我将更经常地包含“else”。

    只需插入一个else,然后转到更激动人心的内容

    这个例子过于简单化了。大部分答案
    If(...)
    Return True;
    Else
    Return False;
    
    If(...)
    Return True;
    
    Return False;
    
    (...)?Return True:Return False;
    
    function DoSomethingConditionally(foo)
    {
        if (Bar)
        {
            foo.DoX();
            return;
        }
        else
        {
            foo.DoY();
        }
    }
    
    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;
    }