Vert.x 处理程序检查检查是否存在的最佳做法是什么?
what is the best practice of Vert.x handler for checking check existence?
我正在实施一种使用 Vertx 的方法来检查数据库中是否存在特定值并使用 Handler with AsyncResult。
我想知道哪个是最佳实践:
选项 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()));
}
});
}
更新:
假设我有另一个例子,而不是检查是否存在,我想得到所有的结果。我是否检查 Empty 结果?我将 Empty 视为失败还是成功?
选项一:只在非null或空时输出,否则失败
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()));
}
});
}
第一个选项更好,因为您可以清楚地说,checkExistence
returned True
或 False
并成功完成或因某些异常而失败(数据库问题等)。
但是可以说,您决定坚持使用第二个选项。然后,假设您有另一种方法:
void getEntity(int id, Handler<AsyncResult<Entity>> resultHandler);
如果entity
提供的id
不存在,你会抛出异常(使用Future.failedFuture
)还是return null
(使用Future.succeededFuture
)?我认为,您应该抛出异常以使您的方法逻辑彼此相似。但同样,这是例外情况吗?
对于 returning 实体列表的情况,如果没有实体,您可以 return 空列表。单个实体也是如此:最好是 return Optional<Entity>
而不是 Entity
,因为这样可以避免 NullPointerException
并且代码中没有可为 null 的变量。哪个更好:Optional<List<Entity>>
还是空List<Entity>
,这是悬而未决的问题。
特别是如果您将其编写为可重用代码,那么一定要选择第一个选项。此方法只是确定一个项目是否存在,因此应该简单地 return 是否存在。这个特定的方法如何知道项目不存在是否是错误条件?
有些来电者可能会确定这确实是一个错误;如果是这种情况,那么如果 Future returns 为 false,它将抛出一个适当的异常。但是另一个调用者可能只需要在继续之前知道该项目是否存在;在这种情况下,您会发现自己使用异常处理来编写业务逻辑。
我正在实施一种使用 Vertx 的方法来检查数据库中是否存在特定值并使用 Handler with AsyncResult。
我想知道哪个是最佳实践:
选项 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()));
}
});
}
更新:
假设我有另一个例子,而不是检查是否存在,我想得到所有的结果。我是否检查 Empty 结果?我将 Empty 视为失败还是成功?
选项一:只在非null或空时输出,否则失败
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()));
}
});
}
第一个选项更好,因为您可以清楚地说,checkExistence
returned True
或 False
并成功完成或因某些异常而失败(数据库问题等)。
但是可以说,您决定坚持使用第二个选项。然后,假设您有另一种方法:
void getEntity(int id, Handler<AsyncResult<Entity>> resultHandler);
如果entity
提供的id
不存在,你会抛出异常(使用Future.failedFuture
)还是return null
(使用Future.succeededFuture
)?我认为,您应该抛出异常以使您的方法逻辑彼此相似。但同样,这是例外情况吗?
对于 returning 实体列表的情况,如果没有实体,您可以 return 空列表。单个实体也是如此:最好是 return Optional<Entity>
而不是 Entity
,因为这样可以避免 NullPointerException
并且代码中没有可为 null 的变量。哪个更好:Optional<List<Entity>>
还是空List<Entity>
,这是悬而未决的问题。
特别是如果您将其编写为可重用代码,那么一定要选择第一个选项。此方法只是确定一个项目是否存在,因此应该简单地 return 是否存在。这个特定的方法如何知道项目不存在是否是错误条件?
有些来电者可能会确定这确实是一个错误;如果是这种情况,那么如果 Future returns 为 false,它将抛出一个适当的异常。但是另一个调用者可能只需要在继续之前知道该项目是否存在;在这种情况下,您会发现自己使用异常处理来编写业务逻辑。