从具有隐式或显式"else"或单个"return"语句的方法返回?

dea*_*mon 18 java coding-style

有些人认为多个return语句是错误的编程风格.虽然对于较大的方法也是如此,但我不确定它是否适用于较短的方法.但是还有另一个问题:如果else前面有回复声明,应该明确写出来if吗?

隐含的else:

private String resolveViewName(Viewable viewable) {
    if(viewable.isTemplateNameAbsolute())
        return viewable.getTemplateName();
    return uriInfo.getMatchedResources().get(0).getClass().toString();
}
Run Code Online (Sandbox Code Playgroud)

明确else:

private String resolveViewName(Viewable viewable) {
    if(viewable.isTemplateNameAbsolute())
        return viewable.getTemplateName();
    else
        return uriInfo.getMatchedResources().get(0).getClass().toString();
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,else这里没有必要,但它更明显.

也许是一次回报最简洁的方法:

private String resolveViewName(Viewable viewable) {
    String templateName;
    if(viewable.isTemplateNameAbsolute())
        templateName = viewable.getTemplateName();
    else
        templateName = uriInfo.getMatchedResources().get(0).getClass().toString();
    return templateName;
}
Run Code Online (Sandbox Code Playgroud)

你更喜欢哪一个?其他建议?

Jon*_*eet 22

其他明显的建议:使用条件运算符.

private String resolveViewName(Viewable viewable) {
    return viewable.isTemplateNameAbsolute()
        ? viewable.getTemplateName()
        : uriInfo.getMatchedResources().get(0).getClass().toString();
}
Run Code Online (Sandbox Code Playgroud)

对于不可行的情况,我几乎肯定不一致.我不会过分担心它,说实话 - 这种可读性无论如何都会受到严重影响,而且它不太可能引入错误.

(在另一方面,我建议使用大括号的所有if块,甚至单个语句的.)


Dea*_*mer 7

我更喜欢单一返回的最干净的方法.对我来说代码是可读的,可维护的而不是混淆.明天如果你需要在if或else块中添加一些行很容易.

1.)代码永远不应该是聪明的.


Ste*_*n C 7

"单点退出"教条来自结构化编程的时代.

在当时,结构化编程是一件好事,特别是作为GOTO缠绕的意大利面条代码的替代品,该代码在1960年代和1970年代的复古Fortran和Cobol代码中很流行.但随着Pascal,C等语言的流行以及更丰富的控制结构,结构化编程已被同化为主流编程,并且某些教条方面已经失宠.特别是,大多数开发人员都乐于从循环或方法中有多个出口...只要它使代码更容易理解.

我个人的感觉是,在这种特殊情况下,第二种选择的对称性使其最容易理解,但第一种选择几乎是可读的.最后一个选择让我感到不必要的冗长,而且可读性最低.

但@Jon Skeet指出,你的代码存在更为重要的风格问题; 即'then'和'else'语句周围没有{}块.对我来说代码应该真的写成这样:

private String resolveViewName(Viewable viewable) {
    if (viewable.isTemplateNameAbsolute()) {
        return viewable.getTemplateName();
    } else {
        return uriInfo.getMatchedResources().get(0).getClass().toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

不仅仅是代码可爱的问题.总是使用块实际上是一个严重的问题.考虑一下:

String result = "Hello"
if (i < 10) 
    result = "Goodbye";
    if (j > 10) 
         result = "Hello again";
Run Code Online (Sandbox Code Playgroud)

乍一看,如果i小于10并且j大于10 ,看起来结果将是"你好再次" .事实上,这是一种误读 - 我们被错误的缩进所欺骗.但如果代码是用{ }当时的部分编写的,那么缩进就很明显了; 例如

String result = "Hello"
if (i < 10) {
    result = "Goodbye";
    }
    if (j > 10) {
         result = "Hello again";
    }
Run Code Online (Sandbox Code Playgroud)

如你所见,第一个}像拇指一样突出,并告诉我们不要相信缩进作为代码意味着什么的视觉提示.