假设可以使用多个返回语句(我有点不同意,但让我们偏离一下话题),我正在寻找一种更可接受的方法来实现以下行为:
选项A:多个返回语句,重复代码块
public bool myMethod() {
/* ... code ... */
if(thisCondition) {
/* ... code that must run at end of method ... */
return false;
}
/* ... more code ... */
if(thatCondition) {
/* ... the SAME code that must run at end of method ... */
return false;
}
/* ... even more code ... */
/* ... the SAME CODE AGAIN that must run at end of method ... */
return lastCondition;
}
看到同一个(小)代码块在每次方法返回时都被重复三次,让我感到很不舒服。此外,我想澄清上面的两个 return false
语句可以被描述为在方法中间返回... 它们绝对不是“保护语句”。
选项B是否稍微可接受一些?我感觉可能滥用了 try/finally,并且希望有完全不同的东西我应该做。
选项B: 多个返回,try/finally 块(没有 catch 块 / 异常)
public bool myMethod() {
try {
/* ... code ... */
if(thisCondition) {
return false;
}
/* ... more code ... */
if(thatCondition) {
return false;
}
/* ... even more code ... */
return lastCondition;
} finally {
/* ... code that must run at end of method ... */
}
}
最后,在我看来,选项C是最佳方案,但由于某种原因,我的团队不喜欢这种方法,因此我正在寻求妥协。
选项C:单个返回值,条件块
public bool myMethod() {
/* ... code ... */
if(!thisCondition) {
/* ... more code ... */
}
if(!thisCondition && !thatCondition) {
/* ... even more code ... */
}
/* ... code that must run at end of method ... */
return summaryCondition;
}
如果您想讨论多个返回语句,请在此问题中进行。
if(!save(foo)) return false;
的情况,我建议从save(..)
中抛出异常,以迫使人们处理这种情况,而不是忽视它(或忘记它!)。 如果更接近于if (count() == 0) return false;
,那么显然不适合使用异常,C语言会是我的选择(采用@Loadmaster的简化方法)。 - sfussenegger