Frage

In meiner Anwendung führe ich eine Transaktion aus, die am Ende der Ausführung drei verschiedene Zustände haben kann:

  • Erfolg
  • Versagen
  • Ausstehend

Je nach Status möchte der Anwendungsclient unterschiedliche Aktionen ausführen.Im Erfolgsfall möchten sie das Transaktionsergebnis (ein Widget) abrufen.Im Falle eines Fehlers möchten sie die Fehlerursache erhalten.Für den Fall, dass die Transaktion aussteht, möchten sie einen Zeitpunkt für einen erneuten Versuch festlegen.Derzeit gebe ich ein Objekt mit den folgenden Methoden zurück:

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

Die Idee besteht darin, dass der Client den Status des Ergebnisobjekts überprüft und abhängig von seinem Wert die entsprechende Methode aufruft, z. B.

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

Ich dachte, dass es vielleicht besser wäre, stattdessen einen Rückruf zu verwenden, z. B.

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

Wo Delay ist eine Klasse, die a darstellt Zeiteinheit und Zeitraum, sodass die Anwendung die Transaktionsausführung neu planen kann.Eine andere Alternative besteht darin, eine Ausnahme auszulösen, die den Fehlergrund umschließt (da sie nur unter außergewöhnlichen Bedingungen fehlschlagen sollte) und die Ausnahme beizubehalten onSuccess Und onPending Methoden.

Meine Frage an SO lautet also:Ist die Verwendung eines Rückrufs ein geeignetes Muster für dieses spezielle Problem, oder kann jemand etwas Geeigneteres vorschlagen?

War es hilfreich?

Lösung

Ich glaube nicht, das ist eine gute Nutzung des Callback-Musters ist.

Ein Rückruf ist geeignet, wenn der Angerufene (zum Beispiel der Transaktion in Ihrem Fall) fortsetzen muss Dinge nach einer Callback-Methode zurückzugibt, zu tun. Aber wenn die nächste Sache, dass der Angerufene immer tut, ist Rückkehr an den Anrufer, dann der Rückruf hinzufügen keinen Wert. Es ist, macht nur die Code-Struktur komplizierter und weniger lesbar. IMO, wäre es besser, ein Ergebnisobjekt oder (im Falle eines außergewöhnlichen Fehler) zurück eine Ausnahme aus.

Bearbeiten -. Re Kommentar des OP

kann ich den Wert der Verwendung eine Callback-Methode finden Sie in die Anrufer fragen, ob sollte die Transaktion fortsetzen, obwohl ich wahrscheinlich einen einfachen Timeout-Parameter verwendet haben würde. Allerdings Methoden Callback mit Ergebnissen zurückzukehren (IMO) immer noch falsch.

Andere Tipps

Ich ziehe es Rückrufe , da, wenn Sie es an mehreren Stellen verwenden Sie es in weniger Code und mehr lesbar führen. Mit Rückruf Ihre if-Anweisung zu bestimmen, was passieren wird (die Methode aufrufen) wird im Dienst sein, um die Transaktion zu tun und den gesamten Code, der den Dienst verwendet, wird nur sauberer aussehen.

Die Rückrufargumente sollten das Objekt enthalten, das den Aufruf auslöst.Klingt für mich in Ordnung, aber die Verwendung eines Rückrufs könnte einige Synchronisierungsprobleme mit sich bringen – Sie können nicht sicher sein, in welchem ​​Zustand Sie den Rückruf erhalten.Nicht unmöglich, aber möglicherweise eine Überlegung wert.

Natürlich wäre bei der Abfrage des Ergebnisses eine Synchronisierung auf der anderen Seite erforderlich.Aber das klingt einfacher zu synchronisieren.

Callback-Lösung ist viel ausziehbar, während Sie an einem Punkt können das Verhalten zu einem asynchronen Aufruf ändern mögen.

Der Nachteil ist Ihr Code weniger lesbar, vor allem für diejenigen Anfänger Programmierer. Wenn das nicht ein Problem für Sie dann sicher, gehen Sie auf ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top