Hierarchische State Machines

Für die zustandsbehaftete Entwicklung mit asynchronen Nachrichten bieten wir hierarchische Zustandsmaschinen (HSM, Hierarchical State Machines) an. Diese folgen den UML State Diagram Standards und sind sehr gut geeignet, komplizierte Prozesse zu modellieren.

Im wesentlichen gehen wir davon aus, das jeder nicht-triviale Nachrichtenverkehr mit Zuständen seiner beteiligten Objekte einhergeht. Die HSM bilden den Zustand des Objektes ab. Kern-Idee ist, das ein Objekt zu einem bestimmten Zeitpunkt nicht alle Nachrichten verarbeiten kann, die es unterstützt.

Beispiele:

  • Ein Objekt A kann den Request eines Objektes B erst behandeln, wenn der vorhergehende Request abgeschlossen ist.
  • Für einen Request muss ein Objekt erst einige Nachrichten an ein drittes und viertes Objekt schicken, bevor es die Antwort kennt.
  • Da ein Objekt A schon in dem Zustand Z ist, macht es keinen Sinn, Nachrichten zu akzeptieren, die es in den schon erreichten Zustand versetzen.

Die Hierarchie der Zustände in einer HSM ermöglicht es, Nachrichtenbehandlung von ihren Eltern-Zuständen zu vererben. Das ermöglicht eine sparsame Kodierung, indem Nachrichten in der Hierarchie der Zustände nach oben gereicht werden, wenn sie nicht behandelt werden. Bestehende Implementierung in Eltern-States werden so erneut genutzt.

Beim Betreten oder Verlassen eines Zustands (während einer Transition)werden zudem Entry/Start sowie Exit-Nachrichten vom System generiert. Das stellt sicher, das keine Initialisierungs- bzw. Aufräumarbeiten vergessen werden.

Einfaches Beispiel:

Beim Öffnen des Kühlschranks wird das Licht eingeschaltet, beim Verlassen des Auf-Zustands wird das Licht ausgeschaltet.

State Machines sind dann besonders nützlich, wenn Ressourcen gekapselt werden, die nur von einer Transaktion gleichzeitig bearbeitet werden können. Bei Transaktionen, die parallel laufen dürfen, ist es meist einfacher, ein Extra-Target für die Bearbeitung zu starten.

HSM sind ein weit verbreitetes Pattern für nachrichtenbasierte Entwicklung, und devel.one unterstützt es.