2017-06-12 91 views
0

我正在实施一种方法,使用Vertx检查数据库中是否存在某个值,并使用HandlerAsyncResultVert.x处理程序检查检查存在的最佳做法是什么?

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

选项1:如果没有发现,处理程序与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:当没有发现时,Handler与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())); 
     } 
    }); 
} 

UPDATE

比方说,我有另一个例子,而不是检查存在,我想获得所有的结果。我是否检查空的结果?我是否将视为失败或成功?

选项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

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

但让我们说,你决定坚持第二种选择。然后,想象你有另一种方法:

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

如果entity与提供id不存在,则抛出异常(使用Future.failedFuture)或退还null(使用Future.succeededFuture)?我认为,你应该抛出异常,让你的方法逻辑相似。但是,这又是一种特殊情况吗?

对于返回实体列表的情况,您可以返回空列表,如果没有实体。同样适用于单个实体:最好返回Optional<Entity>而不是Entity,因为这样可以避免NullPointerException并且代码中没有可为空的变量。有什么更好的:Optional<List<Entity>>或空List<Entity>,这是开放的问题。

+0

请参阅我的问题更新。 – fluency03

+0

我已更新答案。 – berserkk

1

特别是如果你把它写成可重用的代码,那么一定要选择第一个选项。这种方法只是简单地确定一个项目是否存在,所以应该简单地返回它是否存在。该特定方法如何知道是否存在该项目不存在的错误条件?

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

+0

请参阅我的问题更新。 – fluency03

+1

关于更新,答案是一样的(呃,严格地说,现在的答案是“随着你的第二个选项”,因为你改变了选项;))。同样,这种方法的工作是返回尽可能多的结果。它没有足够的上下文来确定“0结果”是否是错误。这取决于谁打电话给它。事实上,我做了类似的事情(使用vert.x和RxJava),我正在寻找一个用户。我返回一个 >>。可选要么是空的,要么包含找到的值。错误报告保留为真正的错误(例如数据库连接) –

相关问题