将代码包装到“IF”语句中是否更好,或者将“短路”函数和返回更好?

时间:2010-01-12 20:05:40

标签: javascript coding-style

我正在使用JavaScript编写代码,而且我有很多实例需要在继续之前检查一些内容。我养成了早期返回功能的习惯,但我不确定我是否正确行事。我不确定它是否会随着代码的增长而对代码的复杂性产生影响。

我想从更有经验的JavaScript编码器中了解到,以下两个示例中的更好的一般做法是什么。或者它是无关紧要的,它们都是编写这个特定IF块的好方法吗?

1)我称之为早期或“短路”(Guard Clause)。

ServeAlcohol = function(age)
{
     if(age < 19)
         return;


     //...Code here for serving alcohol.....
}

..或者...

2)将代码包装到IF语句中。

ServeAlcohol = function(age)
{
     if(age >= 19)
     {
          //...Code here for serving alcohol.....
     }
}

12 个答案:

答案 0 :(得分:58)

通常我会立即返回输入验证。想象一下,如果你有一堆条件,你就会立刻得到一堆嵌套的if

一般来说,一旦我通过输入验证,我会避免多次返回,但是为了验证,我马上回来。保持清洁恕我直言。

答案 1 :(得分:11)

我更喜欢第一个,因为它是一个保护条件,你直接退出。但我不认为两者都存在性能问题,只是因为它是你的偏好......两者都将直接返回执行......

答案 2 :(得分:9)

个人选择。对我来说,如果有一些“停止”条件,我可以在方法的开头检查,我更喜欢使用“返回”模式。但只有我能在方法的开头做到这一切。

答案 3 :(得分:5)

FWIW,我会提出相反的意见。结构化编程表明函数应该有一个退出点。我认为如果使用早期返回,break语句,goto语句等,有一些编译器优化是不可用的。代码中的更多分支意味着更难填充CPU管道,从而导致可能的性能降低......还有一些原因是不能及早返回处理严格(即algebreic)关于正确性的推理。

Structured Programming wiki article

答案 4 :(得分:4)

这取决于。我确实喜欢简单函数的一个返回点,但是任何长度超过10-20行的东西我都会为了代码清晰而开始解决问题。

答案 5 :(得分:4)

我更喜欢第一个,因为它是消除过程,在程序甚至必须逐步完成下一轮逻辑之前返回函数。 我称之为prereq check - 如果函数不符合prereq check

,函数将无法执行

事实上,我一直这样做,例如,经典的是我有一个函数,期望一个整数,我得到一个字符串,我检查函数的顶部,如果它是一个整数,不是它不是一个字符串或不是另一个对象/类型,这在我的书中只是愚蠢。

这就像哈佛大学的大学申请,一个先决条件:

'I don't want to even want you to come for an interview if you don't have a 3.5GPA or higher!'

:=)

答案 6 :(得分:3)

第一个通常是首选,因为它减少了所需的缩进(可能会失控)。没有真正的性能差异。

答案 7 :(得分:3)

有些人认为每个功能都应该有一个退出点。但是,当你提到的快速条件检查在开始时完成时,我发现它更清楚了。它还可以避免某些代码被不必要地运行。

答案 8 :(得分:3)

我听说的一般规则基本上是早期失败而且经常失败。你永远都不知道一行代码何时指向一个超级重载的setter,它的工作方式比你想象的要难。如果您可以阻止执行该行代码 - 比如提前返回 - 那么您的代码将会以指数方式提高效率。

换句话说,如果你可以尽早返回并保持代码不被执行,那么每次都要这样做 - 特别是如果你完全关心性能的话。这可能不像JS那样重要,我想 - 我更像是一个AS3人 - 但同样的逻辑适用。

如果你有很多案例,最好还是找出每一个案件的失败点 - 在你的例子中,追溯到这个因为年龄太低而提前返回。这将有助于其他进入并尝试调试代码的开发人员,他们会知道事情的失败原因和原因。

希望有所帮助! :)

答案 9 :(得分:2)

或者,因为JavaScript是伪装的方案

HandleRequestForAlcohol = function(age) { 
    ( IsUnderAge(age) ? RespondUnderAge : ServeAlcohol )();
}

选择函数的习惯用语并不重要,而是如果你正在进行复杂的验证然后有多个进程,那么将它们分解为单独的函数而不是制作一个大的函数,除非它处于一个非常关键的性能代码。

答案 10 :(得分:1)

在我看来,作为一种最佳实践,我认为使用控制块持续使用大括号更为重要,即使它们的主体只有一条线。

一致

if ( condition ) {
    statement;
    statement;
}

if ( condition ) {
    statement;
}

不一致

if ( condition ) {
    statement;
    statement;
}

if ( condition )
    statement;

但即使如此,这仍然是主观的。

至于什么时候打破一个功能,以及缩进的程度,这也是主观的。研究和经验表明,只在一个点(结束)退出函数更容易调试,优化等。另一方面,多级缩进可能使函数难以阅读。

答案 11 :(得分:1)

如果有多个/复杂的警卫,我会使用返回。否则,在一个简单条件的情况下(在一个小函数中),我更喜欢使用if。