如何在函数返回值中使用if-else语句?

3

我总是尽量避免嵌套语句。

这会导致我将代码放入一个长的大括号中。当每个条件中的代码量变得更大时,跟踪代码就变得困难了。

if(condtion) {

} else if(condition2) {

} else {

}

如果我有如下代码:

void doSomething(){  
    if(condtion) {
        return;
    } else if(condition2) {
        return;
    } else {
        return;
    }    
}

我总是把它改成这种形式(避免使用else,因为每个条件都有一个return语句):

void doSomething() {
    if(condtion) {
        return;
    }    
    if(condition2) {
        return;    
    }
    return;
}

但有人告诉我我的文章有点难以理解,那么哪篇更好呢?

5
你的问题阅读起来比较困难。我们并不需要那么多垂直空白。有些人会在移动设备上阅读SO。 - Andy Turner
每个都有不同的用途。你的代码发生了行为上的变化。它们并不相同,无法决定哪一个是最佳实践。 - Suresh Atta
2
我是老派的,曾经学过每个函数/方法都应该有一个入口和出口点,因此最好使用第一个。在 if-else if 块中添加 return 语句可能会导致人们错过它们,突然间人们就不知道发生了什么。使用最后一个 return 可能会使理解你试图实现的关系和逻辑变得困难(在我看来)。如果您的 if-else 块运行时间很长,请考虑补充方法的功能:if (condition1) { doSomethingImportant(); } - MadProgrammer
@AndyTurner 我正在更新它。 - dsharew
1
使用多态替换条件逻辑,请阅读此链接 - bsingh
显示剩余4条评论
4个回答

4
如果条件是一些快捷情况或前提条件,我更喜欢立即使用returnthrow而不需要else语句。例如:
void processArray(int[] array) {
    if(array == null || array.length == 0) {
        System.out.println("Empty input");
        return;
    }
    // do some complex computations
}

这样,你的主要方法就没有额外的缩进和括号了,这些可能在 else 语句之下。
如果条件分支很长,并且长度大致相同,那么代码本身就有问题。你需要进行重构,将分支提取到方法中或者(有时更好)使用类似于 命令模式 的分离类来解决。

2

常见情况:

  • 如果两个结果相同,则一切取决于阅读代码的人。

  • 当方法开始执行比检查简单条件更复杂的操作时,它应该只有一个返回语句。

  • 如果方法的逻辑非常复杂,您必须创建各种方法来澄清。


Oracle Java Code Conventions 7.4没有提到if语句内的返回,但提到了if-else语句。

7.4 if、if-else、if else-if else语句

if-else语句应该具有以下形式:

if (condition) {
    statements;
}

if (condition) {
    statements;
} else {
    statements;
}

if (condition) {
    statements;
} else if (condition) {
    statements;
} else {
    statements;
}

根据ORACLE规定,必须使用if-if else-else结构,但可以在以下两种情况中选择其中之一: 1. 一个单独的return语句。
boolean doSomething(){  
    boolean var;
    if(condtion){
        var = false;
    }else if(condition2){
        var = true;
    }else{
        var = false;
    }    
    return var;
}

或者使用三个 returns 语句。
boolean doSomething(){  
    if(condtion){
        return;
    }else if(condition2){
        return;
    }else{
        return;
    }    
}

3
在一个空函数中,你可以有一个返回语句,但实际上你并没有返回任何东西。 - SomeJavaGuy
嗯...我以为IDE会抱怨...同意...已经改正了,谢谢! - Jordi Castilla
1
对于通常情况,请点赞。 - dsharew

1

但有人告诉我我的写作有点难以理解,哪一个更好一些?

没有所谓的“更好”。有人告诉你你的写作难以理解,而你显然认为自己的写作更容易理解,这证明这完全是主观的。

你应该按照自己更容易的方式去写作。


但是在团队合作时怎么办? - dsharew
团队应该足够灵活,接受来自每个开发者个人偏好的编码风格上的小变化,而不是要求所有人绝对一致。大家应该真正放松。 - Mike Nakis
现在,如果你的工作场所把自己看作是盖世太保,那么显然你必须遵守他们的意愿。很可能,你需要寻找另一份工作。 - Mike Nakis
喜欢你最后的评论。 :-) - dsharew

0
如果每个条件中的代码量变得更大,我会做什么:
void doSomething()
{
    if (condtion)
    {
        function1();
    }
    else if (condition2)
    {
        function2();
    }
    else
    {
        function3();
    }
}

像这样,我认为它更容易阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接