代码中间的条件和循环返回是正确的吗?[复制]

Conditional and Loop return in the middle of the code is that correct? [duplicate]

提问人:leoledmag 提问时间:11/9/2013 最后编辑:leoledmag 更新时间:11/9/2013 访问量:339

问:

有时我指出,你不能把一个返回放在条件或循环的中间,因为它会破坏这个过程。但是,现在已经向我表明,如果你能做到,那就更好了。我很困惑。通常发生在函数中

你能退货吗?不是吗?为什么?还是没有任何区别?

例:

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;
与语言无关的 编码风格

评论

0赞 Matt Ball 11/9/2013
stackoverflow.com/search?q=early+return
0赞 Bruce Dean 11/9/2013
@leoledmag,这句话是什么意思:“别人向我表示,如果你能做得更好。你的措辞似乎有点混乱,也许你可以澄清一下?

答:

1赞 user1646737 11/9/2013 #1

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

评论

6赞 Matt Ball 11/9/2013
提前返回并没有错,尤其是在功能开始时与警卫一起使用时。对于持续这么长时间的长方法,最好将其分解为更小的方法。
0赞 user1646737 11/9/2013
也同意这一点。我仍然认为最好的做法是将退出点限制在一个点。
1赞 Matt Ball 11/9/2013
你不能同意我的评论,仍然这么说。它们是相互矛盾的陈述。
0赞 user1646737 11/9/2013
好吧,那么,让我们争论一下,的!:-)(我同意将长方法分解为一系列较小的方法)。
0赞 Matt Ball 11/9/2013
事实上。不幸的是,我很确定你对单个返回语句更好的看法客观上是错误的:stackoverflow.com/questions/36707/......所以我不确定还有什么可争论的。
2赞 Kevin 11/9/2013 #2

您的两个示例在功能上基本相同,并且任何一个都可以工作。事实上,优化编译器可以很容易地将第二个示例转换为第一个示例。

大多数程序员可能更喜欢第一种,因为意图更明确。

评论

0赞 joe 11/9/2013
我希望这个例子不是他问题的真正意图。在漫长复杂的例程中,可能会导致混乱和忘记清理所有情况,并最终泄漏内存等。
0赞 Kevin 11/9/2013
@joe 很好的观点,尽管这实际上取决于语言 - 这个问题同时被标记为 C 和 C#,这有很大的不同,因为 C# 具有可以强制清理的构造,无论函数如何退出。相比之下,至少在 C 语言中,它确实会导致被遗忘的清理。如果它是一个如此复杂的例程,那么最好将其分解为多个功能。
1赞 joe 11/9/2013 #3

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

更大的问题是,大多数时候,你写的代码现在存在了很长时间,维护者不断变化,在某些时候人们并不理解所有代码行的全部意图。这将加剧所有这些混乱。

综上所述,我见过很多写得非常漂亮的代码,在循环中间有返回。

0赞 Carlos Sanchez 11/9/2013 #4

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

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

至于你最初的问题,它当然不会破坏现代编程语言中的任何内容;这完全取决于你。选择您认为更容易遵循的方式。