例如我可以这样做:
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
语句。关于这个有什么约定吗?需要注意的任何陷阱?
答案 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)
这两种方法都有效,具体取决于具体情况。在其他条件相同的情况下,我赞成第一种方法,因为很容易看出代码中有两个分支;具有两个可能的路径使代码处于相同的缩进级别强调了两个分支的“对等”性质。
另一方面,当一个分支明显更长时,第二种方法很有用;如果该条款是例如只需标记丢失的数据,就可以在到达主函数体之前将其排除在外,避免额外的缩进和认知负荷。
在您的具体示例中,看起来代码的第二个视图可能是更好的匹配。
答案 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
分支内部返回是完全合理的,因为你的函数没有别的东西可以做。
从嵌套语句或函数中间返回更危险,因为这可能会无意中跳过某些必需的处理或清理。