可能重复:
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
}
答案 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'有几个原因:
关于上面的概念原因,它 - 当然 - 取决于你的功能规范。对于某些功能,使用这样的代码是有意义的。例如“函数假定访问者未注册,他只在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 Standards和Mozilla 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)
但总的来说,我试图避免从函数中间返回。每个功能有一个返回。