在方法开始时使用返回错误的编码实践?

时间:2013-03-20 15:14:40

标签: java

我发现自己使用了以下练习,但每次我使用它时,我内心都会有些畏缩。基本上,它是参数的前提条件测试,以确定是否应该完成实际工作。

public static void doSomething(List<String> things)
{
    if(things == null || things.size() <= 0)
        return;

    //...snip... do actual work
}

11 个答案:

答案 0 :(得分:14)

最好尽早回来 这样就可以执行和评估最少量的代码。

未运行的代码不能出错。

此外,它使函数更容易阅读,因为您不必处理所有不再适用的情况。

比较以下代码

private Date someMethod(Boolean test) {
  Date result;
  if (null == test) {
    result = null
  } else {
    result = test ? something : other;
  }
  return result;
} 

VS

private Date someMethod(Boolean test) {

  if (null == test) { 
    return null 
  }
  return test ? something : other;
} 

第二个更短,不需要其他并且不需要临时变量。

请注意,在Java中,return语句立即退出该函数;在其他语言(例如Pascal)中,几乎等效的代码result:= something;不会返回 由于这个事实,习惯上在Java方法中返回很多点 调用此bad practice忽略了这样一个事实,那就是特定列车早已离开了Java站。

如果您要在功能中的多个点退出某个功能,最好尽早退出

答案 1 :(得分:4)

这是一种风格和个人偏好的问题。它没有错。

答案 2 :(得分:3)

据我所知 -

为了便于调试,子程序,方法功能中只应有一个返回/退出点

使用这种方法,您的程序可能会变得更长,更不易读,但在调试时,您可以在出口处设置断点并始终查看返回的状态。例如,您可以记录所有局部变量的状态 - 这对于故障排除可能非常有用。

看起来有一个两个“学校” - 一个说“尽早返回”,而另一个说“应该只有一个程序中的返回/退出点“

我是第一个的支持者,虽然在实践中有时会遵循第二个,只是为了节省时间。

另外,不要忘记例外。通常情况下,您必须提前从方法返回,这意味着您处于异常情况。在您的示例中,我认为抛出异常更合适。

答案 3 :(得分:2)

PMD似乎这么认为,并且你应该总是让你的方法运行到最后,但是,对于某些快速的健全性检查,我仍然使用过早的return语句。

它确实会损害该方法的可读性,但在某些情况下,这可能比添加另一个if语句或其他方法更好,以便在所有情况下运行该方法。

答案 4 :(得分:2)

它没有任何内在错误,但如果它让你畏缩,你可以抛出IllegalArgumentException。在某些情况下,这更准确。但是,无论何时调用doSomething

,它都会产生一堆代码
try {
    doSomething(myList);
} catch (IllegalArgumentException e) {}

答案 5 :(得分:2)

这个问题没有正确答案,这是一个品味问题。

在上面的具体示例中,可能有更好的方法来强制执行前置条件,但我将多个早期返回的一般模式视为类似于函数式编程中的守卫。

我个人对这种风格没有任何问题 - 我认为它可以使代码更清晰。尝试扭曲所有内容以获得单个退出点会增加冗长度并降低可读性。

答案 6 :(得分:1)

这是一个很好的做法。所以继续你的好工作。

答案 7 :(得分:0)

它没有任何问题。就个人而言,我会使用 else 语句来执行函数的其余部分,并让它自然返回。

答案 8 :(得分:0)

如果你想避免方法中的“返回”:也许你可以使用你自己的一个异常子类并在方法的调用中处理它?<​​/ p>

例如:

public static void doSomething(List<String> things) throws MyExceptionIfThingsIsEmpty {
    if(things == null || things.size() <= 0)
        throw new MyExceptionIfThingsIsEmpty(1, "Error, the list is empty !");    

    //...snip... do actual work
}

编辑: 如果您不想使用“return”语句,则可以在if():

中执行相反的操作
if(things != null && things.size() > 0)
// do your things

答案 9 :(得分:0)

如果函数很长(例如,20行或更多),则最好在开始时返回少量错误条件,以便代码读取器在读取函数的其余部分时可以关注逻辑。如果函数很小(例如5行或更少),那么一开始的return语句可能会让读者分心。

因此,决定应主要基于函数是否更具可读性或更低可读性。

答案 10 :(得分:-1)

Java良好实践表明,返回语句应尽可能独特,并在方法结束时编写。要控制返回的内容,请使用变量。但是,对于从void方法返回,就像您使用的示例一样,我要做的就是在仅用于此目的的中间方法中执行检查。无论如何,不​​要认真对待 - 像continue这样的关键字永远不应该根据Java的良好实践使用,但它们就在你的范围内。