我见过很多例子,这让我感到非常好奇
以下两个例子如下:
return;
,这很荒谬。return;
来突破它。我不喜欢它。以下示例可能会澄清第二种情况(第一种情况很明显):
- SomeMethodThatReturnsSomethingOrNot(var param1){
if (param1 == null){
CallThisMethod();
return;
}
CallThisOtherMethod(param1);
}
对很多人来说,这很好,也很清楚。对我来说,它最多只能 。
为什么不简单地使用if else
?你不需要在代码中间return
没有任何东西,它不会降低可读性,而且,我不知道还能说些什么,它对我来说看起来更好。< / p>
- SomeMethodThatReturnsSomethingOrNot(var param1){
if (param1 == null){
CallThisMethod();
}else{
CallThisOtherMethod(param1);
}
}
现在我想在这里强调一下这个例子的简单性,我知道可以做出一些性感但是只是假装它比null
检查更复杂,需要同样的{ {1}}代替if-return
技术。
那么,每个人的想法是什么?
当方法无效或者我实际上不想返回任何内容时,我一直强烈反对返回某些东西。如果我最终遇到这种情况,我想重新考虑我的架构,因为它不应该发生。
我完全错了/是对还是在这里讨论空间?
答案 0 :(得分:5)
您可能有兴趣研究SESE的主题(单一录入,单一退出)和Dijkstra关于该主题的想法,这种想法促成了这种风格。
值得注意的是,Dijkstra的想法经常被误解。在一个很多人在直接组装中编写代码的时代,他一直在倡导实践。在汇编中,您经常被允许从任何指令跳转到任何其他指令。这就是“单一进入”概念的来源:从一个功能跳到另一个功能的中间是非常困惑的。
“单退出”经常被误解为意味着只从一个地方退出的功能。它实际上意味着将函数退出到一个地方。如果你从一个函数返回到调用它的站点以外的地方,它会变得非常混乱。
尽管如此,今天很多人仍然认为“单一退出”意味着“从退出只在函数中的一个地方”,并且倡导者经常推广你所建议的风格。
我不会考虑哪一个更好或更坏。它不可避免地会变得主观。但有些事情值得考虑。
明确清理
在一个函数中只从一个地方退出的想法在很大程度上被普及,需要在许多函数中明确清理它们的资源 - 如下所示:
function f()
allocate_resources()
...
deallocate_resources()
end
我们可以看到我们是否在这样的函数中引入了任何类型的早期return语句,以至于我们很容易忘记释放资源并最终导致某种资源泄漏。在这些情况下,仅在函数结束时支持返回语句的建议对于防止人为错误更有用。
<强>异常处理强>
异常处理现在是许多现代语言的常见功能。通过异常处理,可以在函数中隐式退出。例如:
function f()
list = create_list() -- could throw
list.insert(123) -- could throw
connect_to_server() -- could throw
if x == 0 then
add_some_widget() -- could throw
end
end
在这些情况下,由于抛出异常,任何代码行都可能具有函数的隐式退出点。结果,不可能使控制流程完全可预测。同样,自动化资源管理也是不可避免的需要,由编译器(或垃圾收集器)自动清理资源,而不是开发人员手动清理资源,因为手动执行此操作变得太不切实际了。函数中的隐式退出点。
<强>结论强>
所以这些是需要考虑的因素。我个人处于频谱的中下端(如果“低”意味着将回报放在任何地方,而“高”意味着只在底部)。但是,您可以在哪里找到自己的舒适区,以及您最容易理解和维护的代码类型。
在我的拙见中,我们可以试图分析确切如何将函数写入每一行代码的优点,但我必须诉诸一种实用的观点,就像测试一样好吧,确保界面和文档清晰,确保实施可能通过一个基本的试金石测试,不会导致人的大脑爆炸,然后运送它。