将代码封装到“IF”语句中更好吗,还是将函数“短路”并返回?

我正在用JavaScript做一些编码,而且我有很多实例,在继续之前我必须检查一些东西。 我已经习惯了在function早期返回,但是我不知道我是否正确地做了这件事。 我不确定是否会影响我的代码的复杂性,因为它的增长。

我想从更有经验的JavaScript编程人员那里知道,下面两个例子中的一个更好的通用实践是什么。 或者它是不相关的,他们都写这个特殊的IF块的好方法?

1)我称之为“早期”或“短路”(守卫条款)。

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..... } } 

通常我有inputvalidation返回马上。 想象一下,如果你有一堆条件,你会马上得到嵌套混乱。

一般来说,一旦我通过inputvalidation,我避免了多个返回,但为了validation,我立即返回。 保持它更干净恕我直言。

我更喜欢第一个,因为这是一个守卫条件,你直接退出。 但我不认为有性能问题,只是这是你的偏好…两个将直接返回执行…

个人select。 对于我来说,如果在方法开始时可以检查一些“停止”条件,我更喜欢使用“返回”模式。 但只有在方法开始的时候我才能做到这一点。

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

结构化编程wiki文章

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

我更喜欢第一个,因为它是消除的过程,在程序甚至必须经过下一轮逻辑之前,退出该function。 我称之为我的prereq check – 如果函数不符合prereq check ,函数将不会执行

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

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

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

:=)

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

有些人认为每个function都应该有一个出口点。 但是,如果您刚才提到的快速条件检查是在开始时完成的,我会发现它更加清晰。 这也避免了一些代码被不必要的运行。

我听到的一个基本原则是基本上失败了,经常失败。 你永远不知道什么时候一行代码指向一个超负载的setter,它的工作方式比你想像的要困难得多。 如果你可以阻止这行代码被执行 – 比如说,通过提前返回 – 那么你的代码将会成倍地高效。

换句话说,如果你能够提前回来并且保持代码不被执行,那么一定要执行它 – 尤其是如果你关心的是性能。 这可能不像JS那么重要,我想 – 我更像一个AS3的人 – 但同样的逻辑适用。

如果你有很多的案例,最好还是找出每个案例的失败点 – 以你为例,追踪这个问题,因为年龄太低,这个问题早就回来了。 这将有助于其他开发人员进入并尝试debugging您的代码,他们会知道事情失败的原因以及原因。

希望有所帮助! 🙂

或者,由于JavaScript是伪装的scheme

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

select函数的习惯并不那么重要,相反,如果你正在做复杂的validation,然后有多个进程,那么把这些函数分开来分开函数,而不是做一个大的函数,除非它是在一个非常关键的代码中。

在我看来,作为一个最佳实践,我认为在你的控制块中使用大括号更为重要,即使他们的身体只有一条线。

一贯

 if ( condition ) { statement; statement; } if ( condition ) { statement; } 

不一致

 if ( condition ) { statement; statement; } if ( condition ) statement; 

但即使如此,这完全是主观的。

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

如果有多个/复杂的警卫,我会使用回报。 否则,在一个简单的情况下(在一个小function),那么我更喜欢使用if。