我正在使用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.....
}
}
答案 0 :(得分:58)
通常我会立即返回输入验证。想象一下,如果你有一堆条件,你就会立刻得到一堆嵌套的if
。
一般来说,一旦我通过输入验证,我会避免多次返回,但是为了验证,我马上回来。保持清洁恕我直言。
答案 1 :(得分:11)
我更喜欢第一个,因为它是一个保护条件,你直接退出。但我不认为两者都存在性能问题,只是因为它是你的偏好......两者都将直接返回执行......
答案 2 :(得分:9)
个人选择。对我来说,如果有一些“停止”条件,我可以在方法的开头检查,我更喜欢使用“返回”模式。但只有我能在方法的开头做到这一切。
答案 3 :(得分:5)
FWIW,我会提出相反的意见。结构化编程表明函数应该有一个退出点。我认为如果使用早期返回,break语句,goto语句等,有一些编译器优化是不可用的。代码中的更多分支意味着更难填充CPU管道,从而导致可能的性能降低......还有一些原因是不能及早返回处理严格(即algebreic)关于正确性的推理。
答案 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。