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

Asynchronous Vert.x处理程序检查存在性的最佳实践是什么?,asynchronous,reactive-programming,future,vert.x,Asynchronous,Reactive Programming,Future,Vert.x,我正在实现一种方法,使用Vertx检查数据库中是否存在某些值,并与一起使用 我想知道哪一个是最佳实践: 选项1:未找到任何内容时,处理程序为SucceedFuture,但结果为FALSE: public void checkExistence (..., String itemToFind, Handler<AsyncResult<Boolean>> resultHandler) { // .... doQuery(..., queryHandler -&

我正在实现一种方法,使用Vertx检查数据库中是否存在某些值,并与一起使用

我想知道哪一个是最佳实践:

选项1:未找到任何内容时,处理程序为SucceedFuture,但结果为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()));
        }
    });
}
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()));
        }
    });
}

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

但假设你决定坚持第二种选择。然后,假设您有另一种方法:

void getEntity(int id, Handler<AsyncResult<Entity>> resultHandler);
void getEntity(int-id,处理程序resultHandler);
如果提供了
id
实体
不存在,您会抛出异常(使用
Future.failedFuture
)还是返回
null
(使用
Future.succeedFuture
)?我认为,您应该抛出异常,使您的方法逻辑彼此相似。但这又是一个例外情况吗


对于返回实体列表的情况,如果没有实体,您可以只返回空列表。对于单个实体也是如此:最好返回
Optional
而不是
entity
,因为这样可以避免
NullPointerException
,并且代码中没有可为空的变量。更好的方法是:
可选的
或空的
列表
,这是一个悬而未决的问题。

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


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

关于更新,答案是相同的(严格来说,现在的答案是“使用第二个选项”,因为您切换了选项;))。同样,此方法的任务是返回尽可能多的结果。它没有足够的上下文来确定“0结果”是否为错误。这取决于打电话的人。事实上,我做了类似的事情(使用vert.x和RxJava),我正在寻找一个用户。我退票。选项为空或包含找到的值。错误报告保留用于真实错误(例如数据库连接)
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()));
        }
    });
}
void getEntity(int id, Handler<AsyncResult<Entity>> resultHandler);