【问题标题】:Conditional and Loop return in the middle of the code is that correct? [duplicate]代码中间的条件和循环返回是否正确? [复制]
【发布时间】:2013-11-09 01:58:13
【问题描述】:

有时我表示不能将 return 放在条件或循环的中间,因为它会破坏过程。不过,现在已经向我表明,如果你能做到,那就更好了。我很困惑。 通常会发生在函数中

你能放一个return吗?是不是?为什么?还是没有区别?

例子:

if (i == 0)
{
    //other code
    return true;
}
else
{
    //other code
    return false;
}

if (i == 0)
{
    //other code
    b= true;
}
else
{
    //other code
    b= false;
}
return b;

【问题讨论】:

  • @leoledmag,这句话是什么意思:“其他人已经向我表明,如果你能做得更好。” ?您的措辞似乎有些混乱,您可以澄清一下吗?

标签: language-agnostic coding-style


【解决方案1】:

您的两个示例在功能上基本相同,并且都可以。事实上,优化编译器很容易将您的第二个示例变成您的第一个示例。

大多数程序员可能更喜欢第一个,因为意图更清晰。

【讨论】:

  • 我希望这个例子不是他问题的真正意图。在冗长复杂的例程中,可能会导致混乱和忘记清理所有案例并最终导致内存泄漏等。
  • @joe 好点,尽管这实际上取决于语言 - 问题标记为 C 和 C#,这会产生很大的不同,因为 C# 具有可以强制清理的构造,而不管函数如何退出。相比之下,至少在 C 中,它确实会导致被遗忘的清理。如果例程如此复杂,最好将其分解为多个函数。
【解决方案2】:

最好在底部有一个单一的回报。这样,您只有一个入口点和一个出口点。当您不必担心代码会从哪里退出时,调试代码会容易得多。这对于非常短的方法来说没什么大不了的,但是对于持续几百行的长方法来说,它会干净得多。

【讨论】:

  • 提前返回没有什么问题,尤其是在函数开始时与守卫一起使用时。对于持续这么长时间的长方法,最好将其分解为更小的方法。
  • 也同意这一点。我仍然认为将出口点限制在一个点是最佳做法。
  • 你不能同意我的评论,仍然这么说。它们是相互矛盾的陈述。
  • 好吧,那么,让我们争论吧,该死的! :-)(我同意将长方法分解为一系列较小的方法)。
  • 确实如此。不幸的是,我很确定你在客观上是错误的,因为单一的 return 声明更好:stackoverflow.com/questions/36707/… 所以我不确定还有很多争论。
【解决方案3】:

我没有看到在循环中间返回的任何实际含义。如果你听到人们说你不应该,那一定是基于代码的可读性。如果函数有多个退出点,则可能会使某些代码难看。此外,大多数时候,您必须在退出例程之前进行一些清理。因此,通常程序员倾向于将清理例程保留在一个地方并始终通过该路径退出。如果您有多个退出点,那么您必须在所有这些地方添加清理例程,这会导致代码重复并再次破坏代码的可读性。我已经看到返回的代码遍布各处,最终未能正确清理并导致内存泄漏。

更大的问题是,大多数情况下,您现在编写的代码会存在很长时间,并且维护者会不断变化,有时人们并不了解所有代码行的全部意图。这将增加所有这些混乱。

说了这么多,我已经看到很多写得很漂亮的代码,在循环中间有返回。

【讨论】:

    【解决方案4】:

    这是一种风格的选择,而不是规则或性能问题。第二个代码示例遵循“单进单出”的方法,其中函数内的代码只从顶部进入,只从底部退出。这背后的想法是这样更“安全”并且更容易遵循代码流。当您手动设置动态存储时,安全性就会发挥作用:通过单点返回,您可以确保释放所有内存。当然,像 java 和 C# 这样的语言会为你做动态存储,所以这不是一个真正的问题。此外,如果您在函数中间多次退出(特别是如果它很长),可能很难跟踪导致函数返回的原因。

    但是,选择仅在函数底部退出可能会产生问题,因为您有时可能需要通过设置和检查标志来跟踪更多状态。

    至于您最初的问题,它肯定不会破坏现代编程语言中的任何内容;全取决于你。选择你觉得更容易遵循的方式。

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2014-04-12
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多