在我的应用程序,我执行的交易可以在三个不同的国家结束时执行:

  • 成功
  • 失败

根据不同的状态,用户将需要进行不同的行动。在成功的情况下,他们将要检索交易的结果(一件).在失败的情况下,他们会希望收到错误的原因。在这种情况下,该事务未决,他们将要安排一个时间重试.目前,我返回的一个目用以下方法:

public interface Result() {
     State getState();
     Widget getWidget(); // Success
     Reason getFailureReason(); // Failure
     Callable<Result> getTask(); // Pending
}

这个想法是,客户检查的状态,结果对象,并援引适当的方法取决于它的价值,例如

if (result.getState() == State.PENDING) {
    result.getTask();
}

我在想,也许最好使用回调,而不是的,例如

public interface TransactionCallback() {
    void onFailure(Reason reason);
    void onSuccess(Widget widget);
    Delay onPending(Delay previous);
}

哪里 Delay 是一类代表 TimeUnit 和周期,允许申请重新安排交易的执行。另一种选择是扔一个例外包装的失败原因(因为它应该只在特殊条件),并保持 onSuccessonPending 方法。

所以我的问题所以是这样的:是用回调一个适当的模式对于这个特定问题,或任何人都可以提出一些更合适?

有帮助吗?

解决方案

我不认为这是一个很好的使用,将回调的模式。

回调是适当的,如果被叫方(例如交易在你的情况)需要继续做的事情后回调的方法返回。但如果接下来的事情,被永远不会是返回的呼叫者,然后回调不添加任何价值。它仅仅是使这些代码结构更加复杂和不可读性。海事组织,它将更好地为返回的一个结果对象,或者(在这种情况的一个特殊的失败)扔一个例外。

编辑 -重新运的评论。

我可以看到的价值,使用一个回调方法,要求呼叫者如果交易应该继续,虽然我可能会用一个简单的超时参数。然而,使用回调的方法返回的结果是(海事组织)仍然是错误的。

其他提示

我更喜欢回调 因为如果你用它在几个地方它将导致较少的代码和代码被更具可读性。呼叫回你的,如果声明,确定将来会发生什么(这种方法叫)将在业务做交易和所有代码,使用该服务将只是看起来更清洁。

回调参数应包括目的采购的电话。听起来不错对我来说,而是使用一个回调可能涉及一些同步的问题-你不能确定在哪个国家,你将会收到回调。不是不可能的,但可能需要审议。

当然与投票的结果,你会需要同步在另一边。但听起来更简单的同步。

回调解决方案是多可延伸,同时您可能在一个点想改变行为的一个步的呼吁。

缺点是你的代码将不太可读的,特别是那些初学者的程序员。如果那不是你的一个问题然后确定,走上...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top