3

可能重复:
为什么一个函数应该只有一个出口点?

我听说该方法理想情况下必须有一个(不再有)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;
}
4

8 回答 8

2

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

于 2012-11-09T09:49:20.603 回答
1

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

所以这取决于上下文

于 2012-11-09T09:42:29.970 回答
1

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

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

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

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

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

于 2012-11-09T09:45:04.813 回答
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;

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

于 2012-11-09T09:47:39.353 回答
0

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

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

于 2012-11-09T09:44:16.547 回答
0

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

于 2012-11-09T09:47:24.250 回答
0

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

于 2012-11-09T09:40:53.237 回答
0

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

例如:

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

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

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

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

>也参考这个

于 2012-11-09T09:42:10.950 回答