繁体   English   中英

当返回值不是布尔值时,确定方法成功

[英]Determine method success when the return value is not a boolean

在编程时我尝试将我的代码模块化为尽可能小的聚焦方法,有时这会成为一个问题,因为如果我在一些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

但这似乎令人费解并且做了很多工作。

在以这种方式控制流量/错误处理时,我是否缺少某些东西?

谢谢!

我不明白为什么你首先要抓住这个例外。 你能不抛出JSONException并让调用者处理错误?

正如另一个答案建议的那样,您可以简单地使用异常处理来指示何时出错并且没有结果。 事实上,这是为什么设计了例外。

但是,在某些语言中,包括Java 8,有一种机制类似于你提出的“每个返回类型的新类”,但是通常都是这样做的,所以你不必自己编写代码就可以了。每种类型都需要一个新的。

在Haskell中,这是Maybe monad 在Scala中它是Option ,在Java 8中,它是Optional

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM