您应该查看doA(),doB()和doC(). 如果它们不太可能失败,则在它们失败时抛出异常。
try {
doA();
doB();
doC();
} catch (FailureException e) {
// handle failure
}
不合理失败的例子比比皆是,,,IOException等等IllegalParameterException。
如果他们有合理的可能失败
if (!doA()) {
// handle A's failure
return;
}
if (!doB()) {
// handle B's failure
return;
}
if (!doC()) {
// handle C's failure
return;
}
Java 中不太强调合理失败的示例。一些示例包括read()在没有更多内容可阅读时返回 -1。如果您doA()的实际名称更接近,attemptA()那么返回一个boolean指示尝试成功的值可能是合适的。想想add(...)并addAll(...)在Collections界面中,true如果结果Collection被修改,它们就会返回。
在大多数语言中,传统goto语言并不是一个好的选择,因为在审查代码时,实际上不可能知道代码“来自何处”。在进入区块之前缺乏对状态的了解goto使得在进入区块之前无法保证一致的环境goto。顺便说一句,这就是为什么传统goto在 Java 中不可用,而只有有限的延续可用goto。
要将嵌套不良的结构转换为嵌套较少的结构,请使用一些重构技术:
if(doA()){
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
} else {
// I know A failed
}
return;
相当于
if (doA()) {
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
return;
} else {
// I know A failed
return;
}
这相当于
if (!doA()) {
// I know A failed
return;
} else {
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
return;
}
如果“我知道A失败”中的代码包含了return,那么你不必担心条件doA()为真的代码会落入下面的代码中;因此您可以提升较低的块,如下所示:
if (!doA()) {
// I know A failed
return;
}
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
return;