您应该查看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;