Question

Dans ma demande, je l'exécution d'une transaction qui peut être dans trois états différents à la fin de l'exécution:

  • Le succès
  • Echec
  • Dans l'attente

En fonction de l'état, le client d'application voudra effectuer différentes actions. Dans le cas de succès, ils veulent récupérer le résultat de la transaction (Widget). En cas d'échec, ils veulent recevoir la raison de l'erreur. Dans le cas où la transaction est en cours, ils veulent programmer un temps pour une nouvelle tentative. Actuellement, je retourne un objet avec les méthodes suivantes:

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

L'idée est que le client vérifie l'état de l'objet de résultat, et appelle la méthode appropriée en fonction de cette valeur, par exemple.

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

Je pensais qu'il pourrait être préférable d'utiliser un rappel à la place, par exemple.

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

Delay est une classe représentant un

Autres conseils

Je préfère callbacks car si vous l'utilisez dans plusieurs endroits, il se traduira par moins de code et d'être plus lisible. Avec rappel votre instruction if pour déterminer ce qui va se passer (la méthode à appeler) sera au service de faire la transaction et tout le code qui utilise le service va il suffit de regarder plus propre.

Les arguments de rappel devraient inclure l'objet de sourcing l'appel. Ça a l'air bien pour moi, mais en utilisant un rappel pourrait impliquer quelques problèmes de synchronisation - vous ne pouvez pas être sûr dans quel état vous recevrez le rappel. Pas impossible, mais peut nécessiter un examen.

Bien sûr, avec vote le résultat, vous auriez besoin de synchronisation de l'autre côté. Mais cela semble plus simple à synchroniser.

Solution de rappel est beaucoup plus extensible, alors que vous pouvez à un moment donné que vous souhaitez modifier le comportement à un appel asynchrone.

L'inconvénient est votre code sera moins lisible, en particulier pour les programmeur débutant. Si ce n'est pas un problème pour vous, alors vous, allez ...

scroll top