通常,您可能会有一个检查众多条件并返回状态的方法(现在就说布尔值)。最好定义一个标志,在方法中设置它,并在结束时返回它:
boolean validate(DomainObject o) {
boolean valid = false;
if (o.property == x) {
valid = true;
} else if (o.property2 == y) {
valid = true;
} ...
return valid;
}
或者一旦你知道方法的结果就回来更好/更正确吗?
boolean validate(DomainObject o) {
if (o.property == x) {
return true;
} else if (o.property2 == y) {
return true;
} ...
return false;
}
现在显然可能有try / catch块和所有其他类型的条件,但我认为这个概念很清楚。意见?
答案 0 :(得分:10)
如果这是一种你将要拨打数千次的方法,那么提前返回会更好地实现[稍微提高]性能。
如果没有,那么我更喜欢迟到,因为它提高了可读性。
请记住,程序员通常花在阅读上的时间比编写代码要多,所以你可以做的任何事情都可以提高可读性。
答案 1 :(得分:8)
我更喜欢早退,避免深度筑巢。在方法开始时,这特别是正确的:测试任何简单的东西,如果你能早点这样做,就可以退出(或抛出异常)。
如果它在方法的中间,它更像是一个判断调用。
请注意,我会立即重构您的示例以使用单个if
:
boolean validate(DomainObject o) {
if (o.property == x || o.property2 == y) {
return true;
} ...
return false;
}
我意识到这只是一个玩具示例,但我的观点是,总是值得寻找更多方法来简化代码:)
答案 2 :(得分:5)
与大多数编码风格一样,这确实是一个偏好问题,但许多人认为guard clauses是最佳实践。
答案 3 :(得分:4)
我唯一一次说你绝对不应该早点回来就是如果你不能轻易地在一个屏幕上看到每一个回报(不管标准可能适用于同一个代码库的人),你应该在至少要添加注释,表明如果提前返回,函数可以提前返回。
如果你的代码看起来像......那么我唯一一次说你肯定应该早点回来。
boolean valid = true;
if( condition1 ) {
valid = false;
}
if( valid ) {
...
if( condition2 ) {
valid = false;
}
}
if( valid ) {
...
if( condition3 ) {
valid = false;
}
}
... (etc)
如果你发现自己处于这两种情况中的任何一种情况,那么......你应该重构这个功能。
答案 4 :(得分:1)
对我而言,这是一些宗教战争主题,没有正确答案。反对早期返回的论点基本上归结为这样一个事实:只有一个函数可以退出的点减少了代码中可能的路径数量,因此,理论上至少可以减少错误的机会。我个人的风格是,在早期返回的情况下这样做,并且在有意义限制一个返回声明的情况下,我这样做。
答案 5 :(得分:1)
如果异常不是图片的一部分,我宁愿在我可以的时候立即回复。
对标志变量进行错误管理可能很容易,而且我通常会反对标志变量。不返回也可能使维护者认为可能会进行进一步的工作(如果方法很长)。
答案 6 :(得分:1)
有两个因素相互冲突。
第一个因素是易于调试。如果你立即返回(如你的第二个代码片段所示),有时很难调试一个大函数,因为很难找到这些返回语句,特别是如果它们被错误地放在那里。
第二个因素是易于实施。如果要在函数开头检查参数的基本正确性,并且在函数完成之前有一段很长的代码,则可能必须将整个代码放在条件循环中。如果你不这样做,在某些时候这个论点可能会被用来进行一些长时间的计算,浪费时间,因为它最终会被拒绝。
所以,答案可能是这样的:
If the function is small,
save the return status in a variable and return at the end.
else
return immediately.
答案 7 :(得分:0)
就个人而言,我更喜欢第二种方法。这对我来说简单明了,但我确实知道有些人必须只有一次回归。
答案 8 :(得分:0)
老实说,我认为这取决于具体情况。就个人而言,我同时使用两者,并根据哪一个来使代码更清晰易读。
如果你有很多嵌套的if语句(或任何其他控制结构)并且它可能会让人感到困惑,那么我会在语句中返回
在这种情况下,不要过分担心什么是“最佳做法”,因为更清楚且易于理解的代码更为重要。使用感觉适合的情况。
答案 9 :(得分:0)
对于这种情况,我更喜欢:
boolean validate (DomainObject o) {
if (o.property == x ||
o.property2 == y ||
...) {
return true;
} else {
return false;
}
一般来说,我喜欢使用早期返回来处理错误条件,并在结束时返回以返回计算结果。