在if语句中使用return语句以避免else时可能出现的问题?

时间:2013-11-19 10:20:38

标签: java

例如我可以这样做:

public void onSomethingClick() {
   if (text.isEmpty()) {
      showMessage("The text is empty, put some text in the input");
   } else {
      //Do the things that you do if the text isn't empty here...
   }
}

或者我可以这样做:

public void onSomethingClick() {
   if (text.isEmpty()) {
      showMessage("The text is empty, put some text in the input");
      return;
   }
   //Do the things that you do if the text isn't empty here...
}

有时候第一种方式更清晰,而不是保持嵌套if / else语句。关于这个有什么约定吗?需要注意的任何陷阱?

5 个答案:

答案 0 :(得分:2)

第二种形式使用了很常见的保护条件。大多数程序员应该能够理解逻辑并遵循代码流程。我会使用第二种形式,因为额外的else只是语法糖。

Wards Wiki上查看此文章。

答案 1 :(得分:2)

这没有共同的惯例 - 任何一种方式都是完全可以接受的。但是,在整个代码文件/项目/解决方案中使用哪种方式一致是一种很好的做法。如果我必须选择其中一个,那么它将是return的选项。一些流行的代码审查工具,如ReSharper,公开推荐这个选项。

另外,你应该避免的一个变体是将两者结合起来:

public void onSomethingClick() {
    if (text.isEmpty()) {
    showMessage("The text is empty, put some text in the input");
    return;
    } else {
  //Do the things that you do if the text isn't empty here...
    }
}

因为这里的else显然是多余的,因为你可以在不包括它的情况下获得相同的结果。

答案 2 :(得分:2)

这两种方法都有效,具体取决于具体情况。在其他条件相同的情况下,我赞成第一种方法,因为很容易看出代码中有两个分支;具有两个可能的路径使代码处于相同的缩进级别强调了两个分支的“对等”性质。

另一方面,当一个分支明显更长时,第二种方法很有用;如果该条款是例如只需标记丢失的数据,就可以在到达主函数体之前将其排除在外,避免额外的缩进和认知负荷。

在您的具体示例中,看起来代码的第二个视图可能是更好的匹配。

这个问题可能有用: Should a function have only one return statement?

答案 3 :(得分:1)

我个人的经验法则是这样的:

void doStuff(param) {
    if (!isValid(param)) {
        //handle error
        return;
    }
    // Do complex logic here
}

基本上,如果你有一些可以执行的短代码但不是该方法的主要特性,那么在没有else的情况下执行if-handle-return是imo的方法。

如果两段代码同等重要(例如,对于奇数操作A和对偶数操作B),那么我使用if-else。

答案 4 :(得分:0)

当你在函数的开头测试一个前置条件时,就像在你的例子中一样,从if分支内部返回是完全合理的,因为你的函数没有别的东西可以做。

从嵌套语句或函数中间返回更危险,因为这可能会无意中跳过某些必需的处理或清理。