如果所有其他分支 Return,你应该使用 Else 语句吗?
Should You Use an Else Statement if All Other Branches Return?
我目前正在使用 Java,尽管这个问题也与其他语言相关。 if ALL "if" 和 "else if" 分支 return 或抛出异常,还要用else语句吗?这是一个使用头指针访问链表索引的简单示例:
public Node getIndex(int index){
//Make sure it's a non-negative index
if(index < 0) {
throw new IndexOutOfBoundsException();
}
//Index 0 is the head, no need to iterate
else if(index == 0) {
return head;
}
//Option A
else {
//Use a for loop to iterate to the element inside the else statement
}
//Option B
//Use a for loop to iterate to the element outside of the if/else block
}
这部分代码与选项 A 或选项 B 的功能完全相同,因为索引 <= 0 总是会在到达它之前抛出或 return。从功能上讲,我认为 没有必要 在此处使用 else 语句。是否有任何商定的标准或个人偏好?我的直觉告诉我在这些情况下删除“else”语句。
我认为 else 令人困惑,因为它发送混合信号:当我看到 else 时,我认为 if 语句中一定有一些路径 return 我不需要查看出。另外我认为没有深度嵌套的代码更容易阅读。
这里引用了一个试图列出标准和良好做法的网站,http://www.javapractices.com/topic/TopicAction.do?Id=114:
Some programmers find that, occasionally, some methods become clearer if multiple return statements are used, instead of the usual single point of exit.
This technique can be easily abused, and should be used with care. It's mainly used to replace nested if structures.
Multiple return statements seem to work well for "guard code" at the beginning of a method, in which the main body of the method is executed only if certain conditions are satisfied.
这是该页面上的一些示例代码:
public final class Automobile {
@Override public boolean equals(Object aThat) {
if (this == aThat) return true;
if (!(aThat instanceof Automobile)) return false;
Automobile that = (Automobile)aThat;
for(int i = 0; i < this.getSigFields().length; ++i){
if (!Objects.equals(this.getSigFields()[i], that.getSigFields()[i])){
return false;
}
}
return true;
}
虽然这里没有任何特别的权威声明。你会发现有些人真的不喜欢有多个 return 语句的方法。
这是一个品味问题。在任何给定的情况下写下看起来更清晰的内容。没有必要在每种情况下都做同样的事情。
有时 if-then-else 链有助于从视觉上清楚地表明您正在选择一个备选方案,即使其中一些备选方案是 'return',因此 'else' 在技术上不是需要。
有时候,如果要先处理快的案子,然后迅速出局,最好不要做 'else'。
if (wrong args)
throw new WobblyException();
else if (trivial case)
return trivial answer;
else
… complicated stuff …
对比
if (wrong args)
throw new WobblyException();
if (trivial case)
return trivial answer;
… complicated stuff …
在你的例子中,这两个都是合理的。别着急。
我唯一建议的是 所有 else 或 none 中的 else。不要混合。所以你的例子 B 不太好,因为它保留了第一个可能的 'else' 而不是第二个
底线是,好的编程是品味问题,而不是遵循固定规则,尤其是当规则被称为“最佳实践”时。
我目前正在使用 Java,尽管这个问题也与其他语言相关。 if ALL "if" 和 "else if" 分支 return 或抛出异常,还要用else语句吗?这是一个使用头指针访问链表索引的简单示例:
public Node getIndex(int index){
//Make sure it's a non-negative index
if(index < 0) {
throw new IndexOutOfBoundsException();
}
//Index 0 is the head, no need to iterate
else if(index == 0) {
return head;
}
//Option A
else {
//Use a for loop to iterate to the element inside the else statement
}
//Option B
//Use a for loop to iterate to the element outside of the if/else block
}
这部分代码与选项 A 或选项 B 的功能完全相同,因为索引 <= 0 总是会在到达它之前抛出或 return。从功能上讲,我认为 没有必要 在此处使用 else 语句。是否有任何商定的标准或个人偏好?我的直觉告诉我在这些情况下删除“else”语句。
我认为 else 令人困惑,因为它发送混合信号:当我看到 else 时,我认为 if 语句中一定有一些路径 return 我不需要查看出。另外我认为没有深度嵌套的代码更容易阅读。
这里引用了一个试图列出标准和良好做法的网站,http://www.javapractices.com/topic/TopicAction.do?Id=114:
Some programmers find that, occasionally, some methods become clearer if multiple return statements are used, instead of the usual single point of exit. This technique can be easily abused, and should be used with care. It's mainly used to replace nested if structures. Multiple return statements seem to work well for "guard code" at the beginning of a method, in which the main body of the method is executed only if certain conditions are satisfied.
这是该页面上的一些示例代码:
public final class Automobile {
@Override public boolean equals(Object aThat) {
if (this == aThat) return true;
if (!(aThat instanceof Automobile)) return false;
Automobile that = (Automobile)aThat;
for(int i = 0; i < this.getSigFields().length; ++i){
if (!Objects.equals(this.getSigFields()[i], that.getSigFields()[i])){
return false;
}
}
return true;
}
虽然这里没有任何特别的权威声明。你会发现有些人真的不喜欢有多个 return 语句的方法。
这是一个品味问题。在任何给定的情况下写下看起来更清晰的内容。没有必要在每种情况下都做同样的事情。
有时 if-then-else 链有助于从视觉上清楚地表明您正在选择一个备选方案,即使其中一些备选方案是 'return',因此 'else' 在技术上不是需要。
有时候,如果要先处理快的案子,然后迅速出局,最好不要做 'else'。
if (wrong args)
throw new WobblyException();
else if (trivial case)
return trivial answer;
else
… complicated stuff …
对比
if (wrong args)
throw new WobblyException();
if (trivial case)
return trivial answer;
… complicated stuff …
在你的例子中,这两个都是合理的。别着急。
我唯一建议的是 所有 else 或 none 中的 else。不要混合。所以你的例子 B 不太好,因为它保留了第一个可能的 'else' 而不是第二个
底线是,好的编程是品味问题,而不是遵循固定规则,尤其是当规则被称为“最佳实践”时。