Tod*_*wen 60 java if-statement coding-style function-exit
这个方法:
boolean containsSmiley(String s) {
if (s == null) {
return false;
}
else {
return s.contains(":)");
}
}
Run Code Online (Sandbox Code Playgroud)
可以等同地写成:
boolean containsSmiley(String s) {
if (s == null) {
return false;
}
return s.contains(":)");
}
Run Code Online (Sandbox Code Playgroud)
根据我的经验,第二种形式更常见,特别是在更复杂的方法中(可能有几个这样的退出点),"throw"和"return"也是如此.然而,第一种形式可以说使代码的条件结构更加明确.有什么理由比较喜欢一个吗?
(相关:一个函数应该只有一个return语句吗?)
Del*_*ani 87
在else这种情况下是多余的,以及对功能的主要代码创建不必要的额外缩进.
Rei*_*ica 70
根据我的经验,这取决于代码.如果我'守护'某事,我会做:
if (inputVar.isBad()) {
return;
}
doThings();
Run Code Online (Sandbox Code Playgroud)
重点很明确:如果该语句为false,我不希望该函数继续.
另一方面,有一些函数有多个选项,在这种情况下我会这样写:
if (inputVar == thingOne) {
doFirstThing();
} else if (inputVar == secondThing) {
doSecondThing();
} else {
doThirdThing();
}
Run Code Online (Sandbox Code Playgroud)
即使它可以写成:
if (inputVar == thingOne) {
doFirstThing();
return;
}
if (inputVar == thingTwo) {
doSecondThing();
return;
}
doThingThree();
return;
Run Code Online (Sandbox Code Playgroud)
它真正归结为哪种方式最清楚地显示代码正在做什么(不一定代码的哪一部分最短或压痕最少).
Eug*_*ota 32
这是一种名为Guard Clause的模式.我们的想法是预先进行所有检查,以减少嵌套条件,从而提高可读性.
从链接:
double getPayAmount() {
double result;
if (_isDead) {
result = deadAmount();
} else {
if (_isSeparated) {
result = separatedAmount();
} else {
if (_isRetired) {
result = retiredAmount();
} else {
result = normalPayAmount();
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
使用Guard子句,您将看到以下结果:
double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};
Run Code Online (Sandbox Code Playgroud)
你会看到这一切:
if (condition) {
return var;
}
// by nature, when execution reaches this point, condition can only be false,
// therefore, the else is unnecessary
return other_var;
Run Code Online (Sandbox Code Playgroud)
大多数情况下,在这种情况下添加else子句不仅是不必要的,而且很多时候,它会被编译器优化掉.
想想计算机如何看待这个代码(就机器代码而言,为了演示目的简化为伪代码):
0x00: test [condition]
0x01: if result of test was not true, goto [0x04]
0x02: push [var] onto stack
0x03: goto [0x05]
0x04: push [other_var] onto stack
0x05: return from subroutine
Run Code Online (Sandbox Code Playgroud)
代码(再次,这是一个伪代码而不是汇编)对if/then/else条件的行为完全相同.
很多人认为,对于函数来说,有多个可能的出口点是不好的和/或混乱的做法,因为程序员必须通过他的代码思考每条可能的路径.另一种做法如下:
return (condition) ? var : other_var;
Run Code Online (Sandbox Code Playgroud)
这简化了代码,并且不会创建任何新的退出点.
我更喜欢这样写:
boolean containsSmiley(String s) {
return s != null && s.contains(":)");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16659 次 |
| 最近记录: |