if-statement - 退出带有空 return 语句的函数是好还是坏的做法?

标签 if-statement coding-style return

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

两个例子如下:

  • return;在 void 函数的末尾,这简直荒谬。
  • 在函数中间使用 return; 来跳出它。我不喜欢。

以下示例可能会阐明第二种情况(第一种情况很明显):

- SomeMethodThatReturnsSomethingOrNot(var param1){

    if (param1 == null){

         CallThisMethod();
         return;
    }

    CallThisOtherMethod(param1);

}

对于很多人来说,这很好而且很清楚。对我来说,充其量是可以接受

为什么不简单地使用一个if else?您避免了在代码中间不需要返回任何东西,它不会降低可读性,而且,好吧,我不知道还能说什么,这看起来是一个更好的做法我。

- SomeMethodThatReturnsSomethingOrNot(var param1){

        if (param1 == null){
             CallThisMethod();
        }else{
             CallThisOtherMethod(param1);
        }

    }

现在我想在这里强调这个例子的简单性,我知道可以做一些更性感的东西但是让我们假装它比 null 检查复杂一点,这需要相同的一种 if-return 而不是 if-else 技术。

那么,大家的想法是什么?

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

我是完全错误/正确还是这里有一些讨论空间?

最佳答案

您可能有兴趣研究 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

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

结论

因此,这些是需要考虑的一些因素。我个人处于范围的中低端(如果“低”意味着将返回放在任何地方,而“高”意味着仅在底部)。但这完全取决于您在哪里找到自己的舒适区,以及您发现哪种代码最容易理解和维护。

以我的愚见,我们可能会斗鸡眼,试图分析一个函数是如何写到每一行代码的优点,但我不得不求助于一种务实的观点,比如只是测试好吧,确保接口(interface)和文档清晰,确保实现可能通过基本的试金石,不会引起人们的大脑爆炸,然后再发货。

关于if-statement - 退出带有空 return 语句的函数是好还是坏的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33899815/

相关文章:

Javascript elseif/if else 需要帮助

arrays - 创建一个函数来迭代和循环 Swift 中的数组

visual-studio - Visual Studio 中按字母顺序排列的方法

Python - 缩短 if/for 循环

c - 字符串不是从 C 函数的返回值中捕获的

c - 没有返回类型定义的 main() 函数给出警告

C API : why are functions using returnParameters with buffer + size instead of returning char*

c - 即使数组编号匹配,它仍然返回 false

c - 如何检查矩阵中是否存在元素?

python - setattr(object, name, value) vs object.__setattr__(name, value)