В моем приложении я выполнения транзакции, которая может находиться в трех различных состояниях в конце исполнения:Использование обратного вызова вместо возврата объекта состояния
- Успех
- Failure
- В ожидании
В зависимости от состояния клиент приложения будет выполнять различные действия. В случае успеха они захотят получить результат транзакции (виджет). В случае сбоя они захотят получить причину ошибки. В случае ожидания транзакции они захотят запланировать время для повторной попытки. В настоящее время я возвращаю объект со следующими методами:
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 и период, что позволяет приложению перенести выполнение транзакции. Другой альтернативой является бросить исключение, обертывающее причину сбоя (поскольку оно должно только терпеть неудачу в исключительных условиях), и сохраняйте методы onSuccess
10 и onPending
.
Итак, мой вопрос к SO: это использование обратного вызова соответствующего шаблона для этой конкретной проблемы, или кто-нибудь может предложить что-то более подходящее?
Но это не всегда так: если транзакция находится в состоянии ожидания *, транзакция будет продолжать опрос до тех пор, пока транзакция не завершится успешно или не сработает. Возврат из метода onPending() требуется, чтобы узнать, как долго ждать следующего опроса. –
Мне нравится идея полностью отменить ожидающую ситуацию с таймаутом (хотя, вероятно, время между запросами не обязательно будет равным), но я не уверен, что вы не согласны использовать обратный вызов. Есть ли у вас какие-либо ссылки, подтверждающие ваше мнение? –
Я согласен с Стивеном. Обратные вызовы в этом случае делают код более сложным. Я понимаю стремление сделать код расширяемым, но, жертвуя удобочитаемостью, вы жертвуете ремонтопригодностью. Я думаю, что более вероятно, что другой программист не поймет код и сделает беспорядок, чем когда-нибудь, используя преимущества расширяемости, добавленной обратными вызовами. – Carlos