是退出函数与空返回语句好/坏的做法?

时间:2015-11-24 17:12:38

标签: if-statement coding-style return

我见过很多例子,这让我感到非常好奇

以下两个例子如下:

  • 在空白函数结束时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技术。

那么,每个人的想法是什么?

当方法无效或者我实际上不想返回任何内容时,我一直强烈反对返回某些东西。如果我最终遇到这种情况,我想重新考虑我的架构,因为它不应该发生。

我完全错了/是对还是在这里讨论空间?

1 个答案:

答案 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

在这些情况下,由于抛出异常,任何代码行都可能具有函数的隐式退出点。结果,不可能使控制流程完全可预测。同样,自动化资源管理也是不可避免的需要,由编译器(或垃圾收集器)自动清理资源,而不是开发人员手动清理资源,因为手动执行此操作变得太不切实际了。函数中的隐式退出点。

<强>结论

所以这些是需要考虑的因素。我个人处于频谱的中下端(如果“低”意味着将回报放在任何地方,而“高”意味着只在底部)。但是,您可以在哪里找到自己的舒适区,以及您最容易理解和维护的代码类型。

在我的拙见中,我们可以试图分析确切如何将函数写入每一行代码的优点,但我必须诉诸一种实用的观点,就像测试一样好吧,确保界面和文档清晰,确保实施可能通过一个基本的试金石测试,不会导致人的大脑爆炸,然后运送它。