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
ます。ちなみに、これが伝統的なものがJavaで利用できない理由でgoto
あり、限られた継続のみが利用可能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;
}
「IknowAfailed」のコードにリターンが含まれている場合は、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;