嗨,我写了一个小函数,比如
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;
....
}
上面的失败很快并且很好读(即返回空值的意图很明确)。但是现在我不想简单地返回,而是想做一些错误记录,所以我改为
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(),但我以一些嵌套很深的 if 语句结束,这些语句非常丑陋且难以阅读。那么我如何保持与以前一样的清洁度并且只使用一次 doLog() 呢?请注意,不允许为 foo() 返回其他内容而不是 void。而且我还读到使用 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();
}
以上满足了我的所有需求(快速失败,干净,没有嵌套if),但是这里使用while循环是一种反模式,因为这里的while循环永远不会运行多次?