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

7wp*_*7wp 37 javascript coding-style

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

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

1)我称之为早期或"短路"(Guard Clause).

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


     //...Code here for serving alcohol.....
}
Run Code Online (Sandbox Code Playgroud)

..要么...

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

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

Par*_*ots 58

通常我会立即返回输入验证.想象一下,如果你有一堆条件,你就会立刻得到一堆乱七八糟的东西if.

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


Bri*_*ins 11

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


Dan*_*ail 9

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


vic*_*tcu 5

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

结构化编程维基文章

  • -1.大多数代码都在努力遵循这种范式,这往往是一种多余的难以理解的混乱,"扼杀我"......唉.基本上,你的观点很好,但并不适用于所有情况的99.9%.过早优化和所有这些.(如果您的验证是热点,那么您还有其他问题.;) (7认同)
  • 我对这些表现论点持怀疑态度.具有早期退货的代码没有更多分支.它可能会编译为完全相同的代码.正确的论点也是可疑的.例外打破单回归假设 - 这些天的语言具有像`finally`,C#中的`using`,Python中的`with`和C++中的RAII模式这样的特征,即"此代码无论如何都会运行什么"即使在例外或早期回归的情况下也明确地工作. (5认同)
  • vicatcu关于正确性论证是正确的:单退出代码更容易正式推理(Dijkstra寻求它的一个原因).他对管道冲洗问题也是正确的.通常我发现,从长远来看,仔细构建具有单退出代码的设置往往是最易维护的. (2认同)