编程时,我尝试将我的代码模块化为尽可能小的聚焦方法,有时这会成为一个问题,因为如果我处于某个I / O循环中,并且某些方法无法获取所请求的数据,那么我就可以'如果我有一个大方法,就像我可以一样轻松控制返回值的流量。
大多数方法通过返回一个表示成功的布尔值来解决这个问题,但我的问题是,当返回一个重要对象的方法成功/失败时,最佳做法是什么?
考虑以下java代码:
public JSONObject toJSONObjectForServer() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put(KEY_TASKTYPE, _taskType);
jsonObject.put(KEY_TIMESTAMP, _timestamp);
jsonObject.put(KEY_TASKSCORE, _taskScore);
jsonObject.put(KEY_UNITSCONSUMED, _unitsConsumed);
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}
如果由于某种原因失败,将返回一个空的JSONObject。将错误检测推迟到调用方法,使我必须编写丑陋的东西,如:
JSONObject result = x.toJSONObjectForServer();
if (result.has(KEY_TASKTYPE))
// method success
else // method failure
以这种方式处理结果并不是不言自明的。我可以为每种返回类型定义一个新类:
public class JSONObjectForServerResult {
private JSONObject _object;
private boolean _result;
public JSONObject getObject { return _object; }
public boolean getResult { return _result; }
// ctor
}
然后让调用者这样:
// some method
JSONObjectForServerResult forServerResult = x.toJSONObjectForServer();
if (forServerResult.getResult())
// method success
else // method failure
但这似乎令人费解并且做了很多工作。
在以这种方式控制流量/错误处理时,我是否缺少某些内容?
谢谢!
答案 0 :(得分:3)
我不明白为什么你首先要抓住这个例外。你能不抛出JSONException并让调用者处理错误吗?
答案 1 :(得分:2)
正如另一个答案建议的那样,您可以简单地使用异常处理来指示何时出错并且没有结果。事实上,这是为什么设计了例外。
但是,在某些语言中,包括Java 8,有一种机制类似于你提出的“每个返回类型的新类”,但是通常都是这样做的,这样你就不必自己编写代码了。每种类型都不需要新的。
在Haskell中,这是Maybe monad。在Scala中它是Option,并且在 Java 8,它是Optional。