Akka bietet zwei etwas überlappende Möglichkeiten zur Verwaltung von Akteur Staaten, Finite State Machines und unbecome/become. Was sind ihre jeweiligen Vorteile/Nachteile? Wann sollte einer von ihnen über den anderen gewählt werden?FSM vs werden/nicht in Akka
Antwort
FSM
ist ein DSL, mit dem Sie anspruchsvollere, lesbare State Machines erstellen können, als wäre die Verwendung der Core-Aktor-API möglich. Sie könnten den FSM-Code einer Geschäftsperson anzeigen und die Geschäftsregeln validieren.
Die FSM
DSL ermöglicht es Ihnen, Dinge zusammen sauberer zu komponieren. Zum Beispiel transitions ermöglichen es Ihnen, Logik herauszufiltern, die über Akteur become
Verhaltensweisen dupliziert werden müsste. Sie können auch andere Akteure abonnieren, um über Übergänge informiert zu werden, die beim Entkoppeln und Testen helfen.
Auch Timer sind schön in die DSL integriert und Dinge wie Stornierung werden sauber behandelt. Codierungs-Timeout-Nachrichten, die den Scheduler verwenden, haben eine Reihe von Fehlern.
Die nach unten zu FSM
ist, dass es ein DSL ist und eine neue Syntax für andere Teammitglieder zu verdauen. Die Oberseite ist, dass es eine DSL und eine viel höhere Abstraktionsebene ist. Ich denke, die Schwelle von 2 Staaten von Agilesteel ist gut. Aber sobald man an 2 Staaten vorbeikommt, sind die Vorteile von FSM
wirklich überzeugend.
Lesen Sie unbedingt the FSM docs und die accompanying examples kontrastierenden become
und FSM
.
Eine Anmerkung re: "Popup" ein Verhalten mit unbecome
- das Standardverhalten ist das Verhalten Stacking nicht zu verwenden. Es ist nur in einer kleinen Anzahl von Anwendungsfällen relevant (dh in der Regel keine Zustandsmaschinen).
Werden/Unbequem sind im Gegensatz zu FSMs sehr leicht. Wenn Sie also nicht mehr als 2 Zustände (zum Beispiel an/aus) und/oder komplexe Statusänderungsrichtlinien haben, würde ich "Become/Unbecome" nicht in eine vollständige FSM umwandeln. Andere dann, dass ich denke, es gibt nur geringe Unterschiede ... Wie zum Beispiel FSMs Sie einen schönen Timer DSL gebaut geben:
setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")
Oder zum Beispiel ich bin mir nicht sicher, ob es in einer FSM möglich ist, auf " Gehe zurück "in den vorherigen Zustand, es gibt nur" vorwärts ", da du explizit angeben musst, in welchen Zustand es gehen soll. Wohingegen unbecome
genau das gibt.