【问题标题】:Only one return statement per method, even in this scenario?即使在这种情况下,每个方法也只有一个返回语句?
【发布时间】:2010-09-23 20:28:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: methods return


【解决方案1】:

【讨论】:

  • 我一直这样做。我认为如果您的范围超过两个级别,那么您做错了什么......
【解决方案2】:

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

这样的规则的重点是使代码更易读和更易于维护,所以当它们使代码更难阅读时,它们应该被忽略。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      个人认为

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

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

      【讨论】:

      • 我不知道,我不喜欢不匹配的括号。 (我的孩子)
      【解决方案5】:

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

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

      不好:

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

      干净:

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

      另一种方法:

      if (invalid) {
           throws IllegalArgumentException();
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          您确实必须权衡这样做的成本和收益。只有一个 return 语句的好处是否会超过必须扭曲一个应该相当容易编写的方法的坏处?

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

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

                我认为这条规则旨在阻止人们仅仅因为他们认为自己“完成”了而在执行实际工作的代码中间退出。

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

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

                    【讨论】:

                      【解决方案13】:

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

                      【讨论】:

                      • 也许你倾向于编写更小的函数来缓解这个问题。也许您从不检查输入参数以查看它们是否有效。而且你编程多久并不能真正证明什么,因为也许,只是也许,你是如此锁定你的一种方式——从 1964 年开始,当时 OO 和现代编程语言甚至不存在——任何其他的方式真的让你感到困惑。什么时候不应该。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-08-05
                      • 2017-03-01
                      • 2017-12-09
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多