【发布时间】:2015-04-14 04:09:23
【问题描述】:
你好,我写了一个小函数,比如
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 来反对 null 检查是一种反模式。
如果我想尝试,我想写一些类似的东西
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 循环永远不会运行多次?
【问题讨论】:
-
doLog是做什么的?你能把它改成带参数吗? -
@shree.pat18 还没想那么多,为什么?也许您可以就带参数或不带参数提出您的建议,谢谢。
-
如果您可以在每次变量之一为空时附加到一个字符串,然后在最后将结果字符串传递给
doLog,您就不必重复调用它. -
@shree.pat18 是的,可以这样做,但与我的问题无关。您在谈论哪种模式只调用一次 doLog ?如果您指的是嵌套如果,我反对。如果您指的是我的 while 循环版本,我的问题是询问使用 while 循环是否是反模式。
-
因为退货;它不会到达 dolog() 方法希望你没问题。
标签: java loops if-statement while-loop nested-if