こんにちは、私は次のような小さな関数を書きました
public void foo(MyClassA paraA) {
if (paraA == null) return;
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) return;
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) return;
....
}
上記はすぐに失敗し、読みやすくなっています (つまり、null 値を返す意図は明らかです)。しかし、単に戻るのではなく、エラーログを記録したいので、次のように変更しました
public void foo(MyClassA paraA) {
if (paraA == null) {doLog(); return;}
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) {doLog(); return;}
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) {doLog(); return;}
....
}
上記もきれいで読みやすいですが、doLog() を数回繰り返す必要があります。だから私は再び
public void foo(MyClassA paraA) {
if (paraA != null) {
MyClassB paraB = doSomeStuff(paraA);
if (paraB != null) {
MyClassC paraC = doMoreStuff(paraB);
if (paraC != null) {
....
return;
}
}
}
doLog();
}
上記は doLog() を 1 回だけ呼び出しますが、非常に見苦しく読みにくい、深くネストされた if ステートメントで終了しました。では、以前と同じ清潔さを保ち、doLog() を 1 回だけ使用するにはどうすればよいでしょうか。foo() に対して void 以外のものを返すことは許可されていないことに注意してください。また、null チェックとは対照的に try/catch を使用することはアンチパターンであることも読みました。
やってみるなら、次のようなものを書きたい
public void foo(MyClassA paraA) {
while(true) {
if (paraA == null) break;
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) break;
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) break;
....
return;
}
doLog();
}
上記は私のすべてのニーズを満たします (高速で失敗し、クリーンで、ネストされていない場合) が、ここで while ループを使用することはアンチパターンですか?