10

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

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

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

11 回答 11

17

尽早返回是一个好习惯。
这样,最少的代码被执行和评估。

不运行的代码不能出错。

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

比较以下代码

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

对比

private Date someMethod(Boolean test) {

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

第二个更短,不需要 else 也不需要 temp 变量。

请注意,在 Java 中,return语句会立即退出函数;在其他语言(例如 Pascal)中,几乎等效的代码result:= something;不会返回。
由于这个事实,习惯上在 Java 方法中的许多点都返回。
这么bad practice称呼它忽略了那个特定的火车早已离开爪哇车站的事实。

如果你要在函数中的多个点退出函数,最好尽早退出

于 2013-03-20T20:07:49.870 回答
4

这是风格和个人喜好的问题。它没有任何问题。

于 2013-03-20T15:15:36.530 回答
4

据我所知 -

为了更容易调试,在子​​例程、方法函数中应该只有一个返回/退出点

使用这种方法,您的程序可能会变得更长且可读性更低,但是在调试时,您可以在出口处设置一个断点,并始终查看您返回的内容的状态。例如,您可以记录所有局部变量的状态——这可能对故障排除非常有帮助。

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

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

另外,不要忘记异常。很多时候,您必须从一个方法中提前返回这一事实意味着您处于特殊情况。在您的示例中,我认为抛出异常更合适。

于 2013-03-20T20:21:46.570 回答
2

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

它确实会稍微削弱该方法的可读性,但在某些情况下,这比添加另一个if语句或其他方法更好,以便在所有情况下将方法运行到最后。

于 2013-03-20T15:24:23.320 回答
2

它本质上没有任何问题,但如果它让你畏缩,你可以扔一个IllegalArgumentException代替。在某些情况下,这更准确。但是,它可能会导致一堆代码在您调用时看起来像这样doSomething

try {
    doSomething(myList);
} catch (IllegalArgumentException e) {}
于 2013-03-20T16:13:02.867 回答
2

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

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

我个人对这种风格没有意见——我认为它可以使代码更简洁。尝试扭曲所有内容以获得单个退出点会增加冗长并降低可读性。

于 2013-03-20T16:20:40.767 回答
1

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

于 2013-03-20T15:17:07.853 回答
0

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

于 2013-03-20T15:17:42.817 回答
0

如果您想避免方法中的“返回”:也许您可以使用自己的 Exception 子类并在方法的调用中处理它?

例如 :

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
于 2013-03-20T15:49:06.587 回答
0

如果函数很长(比如 20 行或更多),那么最好在开始时返回一些错误条件,以便代码读者在阅读函数的其余部分时可以专注于逻辑。如果函数很小(比如 5 行或更少),那么开头的 return 语句可能会分散读者的注意力。

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

于 2013-07-06T20:59:29.597 回答
-1

Java 的良好实践表明,return 语句应该尽可能多地是唯一的,并且应该写在方法的末尾。要控制返回的内容,请使用变量。但是,对于从 void 方法返回,就像您使用的示例一样,我要做的是在仅用于此目的的中间方法中执行检查。无论如何,不​​要把这当回事 - 关键字 likecontinue永远不应该根据 Java 的良好实践使用,但它们就在那里,在你的范围内。

于 2013-03-20T15:19:50.253 回答