一个方法应该有多少个return语句?

时间:2012-11-09 09:36:34

标签: c# java coding-style

  

可能重复:
  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;
}

8 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

所以 取决于上下文

答案 2 :(得分:1)

  

理想情况下,返回语句必须有多少函数?

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

如果有超过return语句提高了代码的可读性,则应该选择从函数中获得多个退出点。

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

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

答案 3 :(得分:1)

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

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;

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

<强>&GT;两者都是正确的。这取决于你的项目情景。

对于Ex:

在您的代码的第二种情况下,如果我在此

下面有许多行代码
**if (someValue == null) 
  {  
    // **null checking**
   return null;
  }**

然后返回&#34; 如果&#34;陈述是正确的

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

<强>&GT;参考this

答案 6 :(得分:0)

如果您只有一份退货声明;代码看起来更干净。 但是对退货声明的数量没有严格的限制。所以你可以有多个return语句。但这也并不意味着要说10个返回语句。

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

答案 7 :(得分:0)

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