【问题标题】:why "only one return"? [duplicate]为什么“只有一个回报”? [复制]
【发布时间】:2013-03-22 03:50:38
【问题描述】:

今天收到一位资深开发者的code review cmets,他指出的一件事是每个函数应该只有一个return语句。我想知道这只是代码风格问题还是存在安全问题,即潜在的函数堆栈问题或未初始化的变量。谁能提供一个例子(我更喜欢 C\C++\C#)来展示多个 return 语句的缺点?非常感谢。

【问题讨论】:

  • 这个问题可能更适合 codereview.stackexchange.com
  • IIRC(快速的谷歌搜索没有找到任何东西,我不记得我在哪里读过它),这是因为旧的 C 或 Fortran 编译器或其他东西会被吓倒,如果你有多个回报。不过,如今,这不是问题。我会说反对多次返回是荒谬的,但话又说回来,有些人有多页方法,在那种情况下,我明白为什么它会让你不高兴(尽管真正的问题是你的方法的疯狂)。
  • 这可能适用于任何没有垃圾收集的语言。
  • 我的编码风格是返回所有独立路径并且使用“返回值变量”,这在风格中经常需要单个返回语句。这实际上意味着我的许多函数都有 more 多个 return 语句。我主要使用 C# 和 JavaScript:这在语言中可能效果不佳 - cough C cough - 需要跨路径手动清理。

标签: design-patterns coding-style


【解决方案1】:

Google 搜索会显示有关该主题的数小时阅读量。简短的版本是许多旧语言只允许一个返回点。此外,在较旧的过程编码风格中,通常有数千行长的方法。即使这不是语言要求,但如果每个方法的底部都有一个返回值,许多人发现代码更容易阅读。

快进到今天。如果您遵循面向对象的最佳实践,主要是单一职责原则,您的方法应该小于 50 行并且易于阅读。拥有多个返回点不是问题。事实上,它们有助于防止深度嵌套的代码。

到此结束;我刚刚注意到this StackOverflow question。读一读。

【讨论】:

  • FWIW:该页面上接受的答案实际上是我书中的 uhg-pattern ..
  • 我不知道 uhg-pattern 是什么,但我一直使用保护子句。
  • 早点回来。在这种情况下,我对每个 if-else 进行分支(很少有例外),并在两条不同的路径中返回。我喜欢多个返回点。我不喜欢不在“叶节点”上的返回点。也许这只是“受功能语言影响的偏好”.. 但对我来说仍然是一个 ugh-pattern
【解决方案2】:

在汇编中,所有函数都必须在函数开头设置堆栈后恢复堆栈。这意味着函数没有逃逸,除非你愿意多次编写清理堆栈的代码,这对空间效率不太好。

这仅适用于实际具有参数或调用其他函数或存储局部变量的函数,平面系统程序集可以随时返回。

用一个入口和一个返回,尽可能少的循环和跳转,并且有意图地推理程序的正确性要容易得多。多个 return 语句让很多人失望(尽管人们仍然设法适应)。

我不会将多个返回称为邪恶,有时它们是必要的,而且在很多时候是有意义的,例如阶乘程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 2019-07-22
    • 2014-12-06
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2011-03-05
    相关资源
    最近更新 更多