Language agnostic 使用if()并立即返回是否是公认的做法?

Language agnostic 使用if()并立即返回是否是公认的做法?,language-agnostic,conditional,Language Agnostic,Conditional,使用if和立即返回是否可以接受,而不是使用if和{}中的代码块?这些方法在实践中是否等效,或者其中一种方法是否存在缺点 Java中的一个示例: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext sc = this.getServletContext(); // Th

使用
if
和立即
返回
是否可以接受,而不是使用
if
{}
中的代码块?这些方法在实践中是否等效,或者其中一种方法是否存在缺点

Java中的一个示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

ServletContext sc = this.getServletContext();       

// Throw exception for fatal error (Servlet not defined in web.xml ?)
if( sc == null )
 return; // old-style programming
 // Careful with silent bugs ! Correct way of handling this is:
 // throw new RuntimeException( "BookDetail: ServletContext is null" );

BookList bookList = WebUtil.getBookList( sc );

这不是回报,这是一个例外。代码非常好


即使你用一个“返回某物”来代替抛出,也没关系。

我认为这取决于可读性。无论哪种方式,代码的功能都应该相同

我总是用这种东西

Function Blah() As Boolean
  If expr Then
     Return False
  End If
  Do Other work...

  Return result

End Function

在您的示例中,在
if
语句之后没有
return
;您正在抛出一个异常。(编辑:自从我发布这个答案后,我看到你已经更改了代码)

有些纯粹主义者认为一个方法中(在方法的末尾)应该只有一个
return
语句。这种想法有一些优点——它使代码更清晰,更容易看到方法可以返回什么,尤其是当您需要清理资源时(特别是在没有垃圾收集的语言中;或者在Java中,您需要关闭一个
InputStream
)如果在底部只有一个
return
,并且在
return
之前执行清理代码,则更清晰、更简单


不过,我不会反对你例子中的代码。

马丁·福勒会赞成提前返回,并称这个想法是错误的

就个人而言,我不喜欢Java中的它,因为我更喜欢每个方法返回一次。然而,这是主观的,我可能是少数

我已经在博客上写了这方面的内容。

我有几点(主观或非主观)意见:

  • 如果一个区块只包含一行,我总是使用带有a的赞扬
  • 我不喜欢在一个方法上有很多
    返回
  • 我认为没有必要进行此
    null
    检查。如果返回
    null
    ,那么您的Web应用程序就有一个更大的问题,应该予以修复。在这种情况下,在代码后面有一个
    NullPointerException
    ,这是一个异常错误,因此我不会费心处理它

只要您将它们作为例程中的第一件事用于条件转义。我认为,它们在该位置很明显,并且避免了至少一级缩进,这一事实超过了多次返回的负面影响。

对于错误情况,一般来说,最好抛出一个异常——异常处理是为了摆脱C程序中约30%的手动返回代码式错误检查而发明的

然而,早期返回很好——它们比使用大括号添加额外的作用域更具可读性

if (!_cache.has_key(key))
    return null;

return _cache[key]
优于:

if (_cache_has_key(key))
{
    return _cache[key]
}
else
    return null;
而且它只会变得更加明显,您添加的越早的返回,5个早的返回就胜过了5个嵌套的if语句

请注意,我没有在错误条件下返回null,通常情况下,密钥不在缓存中,但这仍然意味着调用方必须编写代码来检查结果。在.NET中,有一种更好的模式返回布尔值,并通过out参数设置结果。以Try开头的方法通常遵循以下模式:

Foo foo;
if (!TryGetCachedFoo("myfoo", foo))
{
    foo = new Foo(...);
    AddToCache("myfoo", foo);
}

// do something with foo

在您给出的示例中,我倾向于抛出异常,因为空ServletContext通常表示出现了问题。但是,有时检查参数是否为null并立即从方法返回既有用又有效

例如,如果您正在收集有关用户的联系信息,并且用户可以选择提供电话号码。在这种情况下,您可以使用一种方法验证电话号码是否包含所有号码、位数是否正确等,但如果电话号码为空或为空,则会立即返回


public void validatePhone(字符串phoneNumber)引发ValidationException{

if (phoneNumber == null || phoneNumber.equals("")) {
    return;
}
//do validation stuff, throwing exception if not valid

这始终是一个风格(宗教)问题。我个人认为所有函数都应该有一个返回语句。但是,在例外情况下,好吧……它们是例外规则的一个很好的理由。(但是,正如我所说,这是一场圣战)。这似乎是这个问题的重复@Jacob:甚至不接近。James不是在问如何在if语句中使用括号,他是在问是否可以在方法中尽早返回。@Paul:是的,我想知道两者之间是否有真正的区别。我有时会与一位在印度的朋友就类似的事情进行有趣的对话“严格编程,其中可靠性非常重要。@雅各布:我听说曲括号问题的示例4是编辑试图在书中节省空间的结果。有趣的是,那些不同意早期回报的人仍然倾向于在循环中使用“中断”或“继续”。我遇到过一些人在我们讨论这些问题时回避这些问题对我来说,所有这些构造(尤其是早期的返回和继续)是关于避免过多的嵌套级别…我喜欢。哎呀,就是这样。我最初放了一个简单的返回,直到有人告诉我这样做是一个不好的做法,特别是因为它表明在这种情况下没有ServletContext。这不是一个不好的做法,但如果这是一个例外情况,你应该像在最初的例子中那样抛出代码。避免处理关键错误,如果该对象不应为null,就让程序崩溃,当它崩溃时,进行调试。可读性参数说服我默认使用此选项。感谢您给出您的观点。单返回讨论我也是每个方法一个返回的粉丝,但最终,这只是一个样式问题。为什么不呢hr仅当异常无效时才显示异常,当异常为
null
或空时不要抛出异常?@True如果