【问题标题】:How many return statements should a method have? [duplicate]一个方法应该有多少条返回语句? [复制]
【发布时间】:2012-11-09 09:36:34
【问题描述】:

可能重复:
Why should a function have only one exit-point?

我听说该方法最好有一个(不再有)return 语句。是真的?

例如,哪种方法更好?

//1
public Object getResult() {
   Object result; 

   if (someValue != null) {  **// NOT null checking**

       // initializing result
   }
   return result;
}


// 2
public Object getResult() {
   Object result; 

   if (someValue == null) {  // **null checking**
       return null;
   }
   // initializing result
   return result;
}

【问题讨论】:

  • 现实世界远非理想 :-) 所以答案取决于项目和您的偏好。就个人而言,我会选择第二个
  • 您的示例实际上并不是关于 return 语句的数量,而是关于是否处理错误和特殊情况。一般来说,如果有疑问,请优雅地处理错误。这意味着什么完全取决于您。
  • 这完全是主观的。当您只是确保您的方法简短而专注时,您使用哪一种并不重要。
  • 你被告知的内容有一个非常重要的背景。你从哪里学来的?

标签: c# java coding-style


【解决方案1】:

结构化编程的准则之一是不要在函数(方法)中使用多个退出点。原因主要是可读性(尝试画一个有多个出口点的算法,它看起来不会很好)。然而,今天很少有人在编写一些代码之前绘制算法,现代 IDE 可以检测到无法访问的代码等。多出口点方法允许更大的灵活性,因此您可以创建一个在代码之前返回的方法,如果它继续会产生一些副作用与执行。此外,这在大多数情况下可以防止使用复杂的条件测试,因此可以更优化(即更快)。当然,编译器如何更改您的代码是一个难题,但我认为它们中的大多数都将您的单退出方法变成了多退出方法。我倾向于在不会显着影响性能和/或涉及复杂、难以阅读的选择(如果,switch-case itd)的地方创建单一退出方法。

【讨论】:

    【解决方案2】:

    如果您在 Eclipse 中使用 checkstyle,那么它肯定是 one。但是在某些情况下,如果您在这些情况下只能有一个 return 语句,那么它会使编写代码更加困难(例如,在某些递归方法中,您正在测试基本案例)我认为您应该使用最好的上下文。

    所以它取决于上下文

    【讨论】:

      【解决方案3】:

      理想情况下,多少个 return 语句必须有一个函数?

      我只会说一个,但不以可读性为代价。

      如果有多个return 语句可以提高代码的可读性,您应该选择一个函数的多个退出点。

      最后,这取决于个人选择和项目编码指南。

      如果我要在您提供的两个代码版本之间进行选择,我会选择第二个版本。对我来说,它更具可读性。

      【讨论】:

        【解决方案4】:

        我说您绝对可以拥有多个退货声明。如果你有“只有一个返回语句”的规则,你可能会得到这样的结果:

        if (value != null) {
          if (value.fieldA != null) {
             if (value.fieldB != null) {
                // initialize
             }
         } 
         return result;
        

        而不是这个:

        if (value == null) {
           return null;    
        }
        if (value.fieldA == null) {
           return null;
        }
        if (value.fieldB == null) {
           return null;
        }
        // initialize
        return result;
        

        我发现第二个更易读、更容易调试并且在某些情况下可能更有效。

        【讨论】:

        • 你也可以在你给出的例子中用 && 做一个 if 语句
        • 是的,但我也觉得这不是很可读,比如说你有 10 个这样的条件?
        • 那么我认为你需要更多的方法,一种方法应该有一个明确的功能。如果你需要很多检查才能在一个方法中执行一些 BL,那么这些检查应该放在另一个方法中,而不是一个检查条件和执行东西的方法(我的意见)
        • 也许,但这对我来说听起来像是一个非常理论的观点。你的意思是你不应该在一个函数中检查多个条件?或者您应该始终将条件检查与其他所有内容分开?
        • 在阅读 Robert Martin 的 Clean Code 之后,我尝试确保每个方法的 if 语句不超过 2 个。否则改变是你,或者未来的你或同事可能不知道一年后该方法会做什么。如果您需要更多检查,我会尝试将它们放在其他专门设计的方法中,以确保这些检查包含在这些方法中。一种方法->一种责任
        【解决方案5】:

        在第二个示例中将返回 null 并阅读下一个规则。当我检查函数接受的值时,我添加了 return 语句,因为如果我的值不好,我不想处理所有函数,所以我返回 null 或抛出异常。

        【讨论】:

          【解决方案6】:

          如果你只有一个 return 语句;然后代码看起来更干净。 但是对 return 语句的数量没有硬性限制。所以你可以有多个返回语句。但这也不意味着要有 10 个返回语句。

          我觉得如果你有 2-3 个返回语句;方法看起来更干净,更容易理解。如果返回语句的数量增加,则表明您应该执行代码重构并将一种方法转换为多种方法。

          【讨论】:

            【解决方案7】:

            这件事可能每个人都有自己的看法。但我认为没有一个明确的正确或错误答案。我通常不关心返回语句的数量。如果有任何理由留在某种方法中,那我就退出它。

            【讨论】:

              【解决方案8】:

              > 两者都是正确的。这取决于您的项目场景。

              例如:

              在您的代码的第二种情况下,如果我在此下面有很多行代码

              **if (someValue == null) 
                {  
                  // **null checking**
                 return null;
                }**
              

              那么从“if”返回的语句是正确的

              如果您的第一个示例(代码)中的代码非常少,那么在每个 if 条件中设置返回值并返回它@end 就可以了

              >也推荐this

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-09-07
                • 1970-01-01
                • 2014-02-18
                • 2012-10-04
                • 2010-10-11
                相关资源
                最近更新 更多