检查检查存在的Vert.x处理程序的最佳实践是什么?

时间:2017-06-12 15:48:46

标签: asynchronous reactive-programming future vert.x

我正在使用Vertx实现一个方法来检查数据库中是否存在某个值,并将HandlerAsyncResult一起使用。

我想知道哪一个是最佳做法:

选项1:当找不到任何内容时,Handler处于succeededFuture但结果为FALSE:

public void checkExistence (..., String itemToFind, Handler<AsyncResult<Boolean>> resultHandler) {
    // ....
    doQuery(..., queryHandler -> {
        if (queryHandler.succeeded()) {
            List<JsonObject> results = queryHandler.result();
            boolean foundIt = false;
            for (JsonObject json: results) {
                if (json.getString("someKey").equals(itemToFind)) {
                    foundIt = true;
                    break;
                }
            }
            resultHandler.handle(Future.succeededFuture(foundIt));
        } else {
            resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
        }
    });
}

选项2:当找不到任何内容时,处理程序处于failedFuture:

public void checkExistence (..., String itemToFind, Handler<AsyncResult<Void>> resultHandler) {
    // ....
    doQuery(..., queryHandler -> {
        if (queryHandler.succeeded()) {
            List<JsonObject> results = queryHandler.result();
            boolean foundIt = false;
            for (JsonObject json: results) {
                if (json.getString("someKey").equals(itemToFind)) {
                    foundIt = true;
                    break;
                }
            }
            // HERE IS THE DIFFERENCE!!!
            if (foundIt) {
                resultHandler.handle(Future.succeededFuture());
            } else {
                resultHandler.handle(Future.failedFuture("Item " + itemToFind + " not found!"));
            }
        } else {
            resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
        }
    });
}

更新

假设我有另一个例子,而不是检查存在,我想得到所有结果。我检查清空结果吗?我是否将清空视为失败或成功?

选项1:仅在非空或空时输出,否则输出

public void getItems(..., String itemType, Handler<AsyncResult<List<Item>>> resultHandler) {
    // ....
    doQuery(..., queryHandler -> {
        if (queryHandler.succeeded()) {
            List<Item> items = queryHandler.result();
            if (items != null && !items.empty()) {
                resultHandler.handle(Future.succeededFuture(items));
            } else {
                resultHandler.handle(Future.failedFuture("No items found!"));
            }

        } else {
            resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
        }
    });
}

选项2:我得到的输出结果,即使它可能为空或null

public void getItems(..., String itemType, Handler<AsyncResult<List<Item>>> resultHandler) {
    // ....
    doQuery(..., queryHandler -> {
        if (queryHandler.succeeded()) {
            List<Item> items = queryHandler.result();
            resultHandler.handle(Future.succeededFuture(items));
        } else {
            resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
        }
    });
}

2 个答案:

答案 0 :(得分:2)

第一个选项更好,因为您可以清楚地说,checkExistence返回TrueFalse并成功完成,或者失败并出现一些异常(数据库问题等)

但是,让我们说,你决定坚持使用第二种选择。然后,假设你有另一种方法:

void getEntity(int id, Handler<AsyncResult<Entity>> resultHandler);

如果提供entity的{​​{1}}不存在,您会抛出异常(使用id)还是返回Future.failedFuture(使用null)?我认为,你应该抛出异常使你的方法逻辑彼此相似。但是,那是一种特殊的情况吗?

对于返回实体列表的情况,如果没有实体,则可以返回空列表。单个实体也是如此:最好返回Future.succeededFuture而不是Optional<Entity>,因为这样可以避免Entity并且代码中没有可空变量。什么更好:NullPointerException或空Optional<List<Entity>>,这是一个悬而未决的问题。

答案 1 :(得分:1)

特别是如果您将此作为可重复使用的代码编写,那么请务必使用您的第一个选项。这种方法只是确定一个项目是否存在,因此应该简单地返回它是否存在。这种特殊的方法如何知道该项目是否存在的错误条件是什么?

某些来电者可能会确定这确实是一个错误;这就是情况,如果Future以 false 返回,它将抛出适当的异常。但是另一个呼叫者可能只需要在继续之前知道该项是否存在;在这种情况下,您会发现自己使用异常处理来构建业务逻辑。