我发现自己在使用以下练习,但每次使用它时,我内心都会有些畏缩。基本上,这是对参数的前提条件测试,以确定是否应该完成实际工作。
public static void doSomething(List<String> things)
{
if(things == null || things.size() <= 0)
return;
//...snip... do actual work
}
我发现自己在使用以下练习,但每次使用它时,我内心都会有些畏缩。基本上,这是对参数的前提条件测试,以确定是否应该完成实际工作。
public static void doSomething(List<String> things)
{
if(things == null || things.size() <= 0)
return;
//...snip... do actual work
}
尽早返回是一个好习惯。
这样,最少的代码被执行和评估。
不运行的代码不能出错。
此外,它使函数更易于阅读,因为您不必处理所有不再适用的情况。
比较以下代码
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
称呼它忽略了那个特定的火车早已离开爪哇车站的事实。
如果你要在函数中的多个点退出函数,最好尽早退出
这是风格和个人喜好的问题。它没有任何问题。
据我所知 -不。
为了更容易调试,在子例程、方法或函数中应该只有一个返回/退出点。
使用这种方法,您的程序可能会变得更长且可读性更低,但是在调试时,您可以在出口处设置一个断点,并始终查看您返回的内容的状态。例如,您可以记录所有局部变量的状态——这可能对故障排除非常有帮助。
看起来有两个“学校” ——一个说“尽早返回”,而另一个说“程序中应该只有一个返回/退出点”。
我是第一个的支持者,尽管在实践中有时会遵循第二个,只是为了节省时间。
另外,不要忘记异常。很多时候,您必须从一个方法中提前返回这一事实意味着您处于特殊情况。在您的示例中,我认为抛出异常更合适。
PMD 似乎是这么认为的,并且您应该始终让您的方法运行到最后,但是,对于某些快速的健全性检查,我仍然使用过早的return
语句。
它确实会稍微削弱该方法的可读性,但在某些情况下,这比添加另一个if
语句或其他方法更好,以便在所有情况下将方法运行到最后。
它本质上没有任何问题,但如果它让你畏缩,你可以扔一个IllegalArgumentException
代替。在某些情况下,这更准确。但是,它可能会导致一堆代码在您调用时看起来像这样doSomething
:
try {
doSomething(myList);
} catch (IllegalArgumentException e) {}
这个问题没有正确的答案,这是一个品味问题。
在上面的具体示例中,可能有更好的方法来强制执行前置条件,但我认为多个提前返回的一般模式类似于函数式编程中的守卫。
我个人对这种风格没有意见——我认为它可以使代码更简洁。尝试扭曲所有内容以获得单个退出点会增加冗长并降低可读性。
这是一个很好的做法。所以继续你的好工作。
没有什么问题。就个人而言,我会使用else语句来执行函数的其余部分,并让它自然返回。
如果您想避免方法中的“返回”:也许您可以使用自己的 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
如果函数很长(比如 20 行或更多),那么最好在开始时返回一些错误条件,以便代码读者在阅读函数的其余部分时可以专注于逻辑。如果函数很小(比如 5 行或更少),那么开头的 return 语句可能会分散读者的注意力。
因此,决定应该主要基于函数是否变得更具可读性或可读性降低。
Java 的良好实践表明,return 语句应该尽可能多地是唯一的,并且应该写在方法的末尾。要控制返回的内容,请使用变量。但是,对于从 void 方法返回,就像您使用的示例一样,我要做的是在仅用于此目的的中间方法中执行检查。无论如何,不要把这当回事 - 关键字 likecontinue
永远不应该根据 Java 的良好实践使用,但它们就在那里,在你的范围内。