12

我喜欢每个方法只有一个return语句的想法。

在这种情况下你会怎么做?

public static string ChopText(string Text)
{
   if (String.IsNullOrEmpty(Text))
   {
      // return here ?????
   }
}

我能想到的唯一选择是设置一个标志,然后检查标志。

问题是,我不喜欢跨越超过一页的巨大 if 语句。 因此,我还看到了丑陋的嵌套 if 语句。

4

13 回答 13

36

用保护子句替换嵌套条件是可以的。

于 2008-11-24T21:35:17.600 回答
25

坦率地说,像这样的情况就是过于严格的规则不好的原因。

像这样的规则的重点是使代码更具可读性和可维护性,因此当它们使代码更难阅读时,它们应该被忽略。

这并不意味着应该完全放弃该规则,因为大多数时候它确实使代码更具可读性。

于 2008-11-24T21:33:33.080 回答
8

试图每个函数只有一个返回值的代码要复杂得多。它通常是 if-thens 和 assignments 的老鼠窝。我挑战你看看那种代码,并知道正确的值总是从那些不同的路径返回。没门。

话虽如此,大型函数表明您可能需要将代码重构为更小的更简单的函数。

于 2008-11-24T21:40:00.443 回答
7

我个人认为

public static string ChopText(string Text))
{
   if(String.IsNullOrEmpty(Text)
      return Text;

   ...
}

完全没问题,如果你不喜欢那些,如果它变大了。

于 2008-11-24T21:34:10.987 回答
4

这是应该忽略规则的情况。如果传入的参数格式不正确,通常在方法的入口点有几个保护子句返回或抛出 ArgumentException。只需将这些语句集中在方法的开头即可。

于 2008-11-24T21:36:04.523 回答
4

“我喜欢每个方法只有 1 个返回语句的想法。” 解释?

一旦知道传递给方法的参数无效,就应该返回或抛出异常。

坏的:

if (Valid) { do lots of stuff}
else {return};

干净的:

if (invalid) { return; }
if (invalid2) {return; }

另一种方法:

if (invalid) {
     throws IllegalArgumentException();
于 2008-11-24T21:37:30.980 回答
2

你真的必须权衡做这样的事情的成本和收益。只有一个 return 语句的好处会超过必须扭曲一个应该相当简单编写的方法的缺点吗?

对于这种情况,我不同意。

于 2008-11-24T21:35:41.937 回答
2

除了例外,无论如何都不再有“单进单出”规则,因此绝对没有必要遵循严格的“单次返回声明”规则。理论上,控制流可以通过抛出异常和展开堆栈随时退出函数,因此即使您实施严格的“单入口 - 单出口”策略,也不能保证它会被完全遵循。

如果适合您,请随时退出功能!

于 2008-11-24T21:46:26.283 回答
2

一般而言,您的方法不应跨越“一个屏幕”。如果他们这样做,您应该(通常再次)尝试将它们分成几种方法。这可能比“只有一个退货声明”重要得多......

毕竟,我们正在寻找的是可读性。

于 2008-11-24T22:10:41.710 回答
1

我坚信“一进一出”,除了在函数顶部验证输入。不过,这必须在函数的真正工作开始之前发生。

我认为这条规则旨在阻止人们仅仅因为他们认为他们已经“完成”而退出正在做实际工作的代码中间。

多次返回的问题是您不能确定是否会执行所需的退出处理,例如关闭套接字或释放一些其他资源。

于 2008-11-24T22:06:42.247 回答
1


public static string ChopText(string Text)
{
   string returnString = "";
   if(String.IsNullOrEmpty(Text))
   {
      returnString = "return string text";
   }
   return returnString;
}

于 2011-04-07T13:14:47.173 回答
0

规则已经过时了。干净利落。它的存在是为了帮助糟糕的程序员编写更具可读性的代码……结果适得其反。使您的代码小而易读,并摆脱那个愚蠢的规则。

于 2008-11-24T21:56:54.887 回答
0

我强烈不同意“一进一出”导致代码复杂的想法。我刚刚用 Java 为 Blackberry 和 Android 手机编写了一个应用程序,它包含大约 100 个文件,并且没有一个方法最终不会退出。虽然它是一个 GUI 应用程序和多线程,但代码并不复杂。很少有例程在屏幕上不完整可见。除了少数几种语言和操作系统,我已经设计和编写软件 46 年了,对我来说,“一进一出”使得代码非常简单、易于阅读和维护。我的价值 0.02 美元。对不起,如果我激怒了任何羽毛。

于 2010-02-13T03:30:28.030 回答