Zustandsdiagramm

Über Zustandsdiagramme

Ein Zustandsdiagramm (auch Statechart oder Zustandsmaschinendiagramm genannt) beschreibt den Lebenszyklus eines reaktiven Systems – in welchen Zuständen es sich befinden kann, welche Ereignisse Übergänge zwischen ihnen auslösen und welche Aktionen beim Eintritt, Austritt oder während eines Zustands ausgeführt werden. Software-Architekten nutzen sie zur Spezifikation von Workflows; Steuerungsingenieure zur Entwicklung reaktiver Regler; UI-Designer zur Modellierung von Bildschirm-Lebenszyklen. Sie sind in OMG UML 2.5.1 §14 (Zustandsmaschinen) und Harels 1987er Statechart-Erweiterung formalisiert, die zusammengesetzte Zustände, History und orthogonale Regionen einführte.

Schematex implementiert eine strikte Obermenge von Mermaid stateDiagram-v2 – jedes Mermaid-Beispiel kann unverändert eingefügt werden, und zusätzlich stehen UML 2.5-Features zur Verfügung, die Mermaid nicht bietet: entry / exit / do-Aktivitäten, vollständige trigger [guard] / action-Übergangsbeschriftungen, terminate- und History-Pseudozustände, Junction sowie Schematex-style Block-Notes. Das Layout verwendet denselben Sugiyama-geschichteten DAG-Engine wie Flussdiagramme, sodass Zyklen, zusammengesetzte Zustände und grenzüberschreitende Übergänge sauber geroutet werden.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Idle Authenticating Authenticated Locked Admin User submit [form_valid] / clearErrors() ok / storeToken() fail [retries < 3] / incrementRetries() fail [retries >= 3] [role == "admin"] [role == "user"]
UTF-8 · LF · 14 lines · 395 chars✓ parsed·11.1 ms·6.5 KB SVG

1. Ihr erstes Zustandsdiagramm

Das kleinste nützliche Zustandsdiagramm hat einen Anfangszustand, einen Endzustand und einen Übergang.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Running done
UTF-8 · LF · 3 lines · 54 chars✓ parsed·1.4 ms·3.3 KB SVG

Drei Regeln decken 80 % der Anwendungsfälle ab:

  1. Beginnen Sie mit stateDiagram-v2 (Mermaid-Stil) oder state (Schematex-Stil) als Header.
  2. Verwenden Sie [*] für den impliziten Startknoten (wenn links von -->) oder Endknoten (wenn rechts).
  3. Verbinden Sie Zustände mit -->. Fügen Sie nach : ein Label hinzu – die vollständige UML-Form lautet trigger [guard] / action.

Die Standardrichtung ist TB (von oben nach unten), um Mermaid zu entsprechen. Überschreiben Sie mit direction LR auf einer eigenen Zeile oder [direction: LR] im Header.

Kommentare verwenden %% (Mermaid), # oder //.


2. Zustandsdeklarationen

Zustände werden automatisch erstellt, wenn sie zum ersten Mal in einem Übergang referenziert werden, aber explizite Deklarationen ermöglichen die Steuerung von Label und Form.

state Authenticating
state "Awaiting Approval" as Approval
Idle: Waiting for input
FormWirkung
IdleBloße ID – als einfacher Zustand mit Idle als ID und Label erstellt
state IdleExplizite Deklaration; gleiche Wirkung
state "Awaiting Approval" as ApprovalAlias – Anzeige von Awaiting Approval, Referenzierung mit Approval in Übergängen
Idle: Waiting for inputInline-Label – Idle ist die ID, Waiting for input das sichtbare Label

3. Pseudozustände

Pseudozustände steuern den Ablauf einer Zustandsmaschine, ohne einen stabilen Ruhezustand darzustellen.

MermaidSchematexSymbolZweck
[*] (Quelle)initial idGefüllter schwarzer KreisEinstiegspunkt einer Region
[*] (Ziel)final idGefüllter Kreis im äußeren RingErfolgreicher Austritt
state X <<choice>>choice XRauteDynamischer Zweig (Guards werden zur Laufzeit ausgewertet)
state X <<fork>>fork XDicker schwarzer BalkenEin Eingang → N parallele Ausgänge
state X <<join>>join XDicker schwarzer BalkenN Eingänge → ein Ausgang
junction XKleiner gefüllter KreisStatischer Zusammenführungspunkt
history XKreis mit HEinstieg beim zuletzt besuchten Unterzustand
dhistory XKreis mit H*Tiefe History (rekursiv)
terminate X×-MarkierungAbnormale Beendigung (kein Cleanup)
entry_point X / exit_point XHohler Kreis am Composite-RandBenannte Ein-/Ausstiegspunkte

[*] ist der Mermaid-Alias und wird immer richtungsaufgelöst: auf der Quell-Seite von --> ist es ein initial, auf der Ziel-Seite ein final. Jeder zusammengesetzte Geltungsbereich erhält sein eigenes Paar.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Idle Authorized evaluate [role == "admin"] [role == "user"]
UTF-8 · LF · 9 lines · 220 chars✓ parsed·2.0 ms·5.1 KB SVG

4. Übergänge

Das vollständige UML 2.5-Übergangslabel hat drei optionale Teile:

trigger [guard] / action
FeldBedeutungBeispiel
triggerEreignis, das den Übergang auslöstsubmit, tick, timeout(30s)
[guard]Boolescher Ausdruck, der zum Triggerzeitpunkt ausgewertet wird[count > 0], [role == "admin"]
/ actionAktion(en), die beim Übergang ausgeführt werden/ log(); increment()

Alle drei sind optional – ein unbeschrifteter Übergang ist anonym (Completion-Übergang).

A --> B                                      %% anonymer Abschluss
A --> B : tick                                %% nur Trigger
A --> B : [count > 0]                         %% nur Guard
A --> B : / clearErrors()                     %% nur Aktion
A --> B : tick [count > 0] / log()            %% alle drei
A --> B : tick, tock [enabled] / handle()     %% Multi-Trigger

Lange Labels werden automatisch umgebrochen, wenn sie die Spurbreite überschreiten.


5. Zusammengesetzte Zustände

Ein zusammengesetzter Zustand enthält ein verschachteltes Unter-Zustandsdiagramm. Der äußere Zustand fungiert als Container mit eigenen initial/final-Pseudozuständen.

state Playing {
  [*] --> Buffering
  Buffering --> Streaming : buffer_full
  Streaming --> Buffering : underflow
}

Sowohl die Mermaid-Syntax (state X { … }) als auch die Schematex-Form (composite X { … }) werden akzeptiert. Aktivitäten können innerhalb des Composite-Blocks deklariert werden:

state Playing {
  entry / startBuffer()
  exit / stopBuffer()
  do / decodeFrames()

  [*] --> Buffering
  Buffering --> Streaming : buffer_full
  Streaming --> Buffering : underflow
}

Der Renderer zeichnet Composites als gestalteten Cluster mit Titelleiste + Aktivitätskompartiment.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Playing entry / startBuffer() exit / stopBuffer() do / decodeFrames() Streaming Stopped Paused Buffering play / loadSource() pause play stop / releaseSource() buffer_full underflow
UTF-8 · LF · 18 lines · 349 chars✓ parsed·5.2 ms·6.7 KB SVG

Grenzüberschreitende Übergänge (Outside --> Inside) werden automatisch geroutet – das Sugiyama-Layout führt die Quelle/das Ziel durch den Composite-Rand.


6. Nebenläufige Regionen

Innerhalb eines Composites teilt der ---Trenner (Mermaid) oder --- (Schematex) den Körper in orthogonale Regionen auf, die gleichzeitig ausgeführt werden.

state Active {
  [*] --> r1_idle
  r1_idle --> Connected : connect
  --
  [*] --> r2_idle
  r2_idle --> Working : start
}

Verwenden Sie fork und join, um regionsübergreifend zu verzweigen/synchronisieren:

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex A B done_a done_b
UTF-8 · LF · 10 lines · 136 chars✓ parsed·1.5 ms·4.6 KB SVG

7. Notes

Eine kurze Annotation kann an eine beliebige Seite eines beliebigen Zustands angehängt werden.

note right of Checking : Calls /api/verify synchronously.
note left of Idle : Anonymous landing state

Mehrzeilige Notes verwenden die Mermaid-end note-Blockform oder die Schematex-{ … }-Form:

note right of Authenticating
  Stores the JWT in localStorage
  on success.
end note

note left_of Idle {
  Anonymous landing state.
  Returns here on 401.
}

8. Selbst-Übergänge

Ein Übergang A --> A wird als gebogener Bogen auf der rechten Seite des Knotens dargestellt.

Idle --> Idle : poll / refresh()

Das Label wird neben dem Bogen außerhalb des Begrenzungsrahmens platziert.


9. Layout-Richtung

Schematex verwendet standardmäßig TB (von oben nach unten), passend zu Mermaid. Überschreiben Sie im Header:

stateDiagram-v2
direction LR

[*] --> Loading
Loading --> Ready

Oder mit der Schematex-Bracket-Attr-Form:

state "Order Lifecycle" [direction: TB]

[*] --> Pending
Pending --> Paid

BT und RL werden vom Parser akzeptiert, aber auf TB bzw. LR normalisiert (der Layout-Engine dreht die visuelle Reihenfolge noch nicht um).


10. Häufige Fehler

GeschriebenParser-MeldungKorrektur
[*] -> [*]Wird als initial- und final-Alias auf derselben Zeile behandeltImmer mindestens einen benannten Zustand zwischen [*]-Aliassen haben
state X <<branch>>branch ist kein Stereotyp<<choice>> (dynamisch) oder <<fork>> / <<join>> verwenden
note right of
text
Mehrzeilige Note muss mit end note endenend note auf einer eigenen Zeile hinzufügen
composite X (keine geschweifte Klammer)Wird als bloße Zustandsdeklaration behandeltBlock öffnen: composite X {
direction LR innerhalb von compositeRichtungsangabe pro Region noch nicht unterstütztRichtung auf der Header-Zeile setzen

11. Grammatik (EBNF)

document     = header statement*
header       = ("stateDiagram-v2" | "stateDiagram" | "state")
                ( title )? ( "[" attrs "]" )? NEWLINE
attrs        = attr ("," attr)*
attr         = "direction:" ("TB" | "LR")

statement    = comment
             | direction-stmt              %% direction LR / TB / BT / RL
             | state-decl
             | alias-decl                  %% state "Long" as ID
             | stereotype-decl             %% state ID <<choice|fork|join|end>>
             | pseudo-decl                 %% initial / final / choice / ... ID
             | composite-block             %% (state | composite) ID { ... }
             | label-stmt                  %% ID : description
             | transition
             | note-stmt
             | region-sep                  %% --  or  ---

transition   = (ID | "[*]") "-->" (ID | "[*]") ( ":" trans-label )? NEWLINE
trans-label  = trigger? ( "[" guard "]" )? ( "/" action )?

note-stmt    = "note" side ID ":" inline-text NEWLINE
             | "note" side ID NEWLINE  text-line+  ("end note" | "}") NEWLINE
side         = "left of" | "right of" | "left_of" | "right_of"

comment      = "%%" any | "#" any | "//" any

ID           = [A-Za-z_] [A-Za-z0-9_]*

Maßgebliche Quelle: src/diagrams/state/parser.ts. Falls dies vom Parser abweicht, hat der Parser Vorrang – bitte öffnen Sie ein Issue.


12. Standardkonformität

FeatureUML 2.5Harel 1987MermaidSchematex
Einfacher Zustand
Zusammengesetzter (verschachtelter) Zustand
Initial- / Final-Pseudozustand
Choice-Pseudozustand
Fork / Join
Junction-Pseudozustand
History (flach / tief)
Terminate-Pseudozustand
entry / exit / do-Aktivitäten
trigger [guard] / action-Labels❌ (nur Label)
Interne Übergänge
Nebenläufige Regionen
Notes auf Zuständen
Grenzüberschreitende Übergänge
[*] initial/final-Alias

Schematex ist eine strikte Obermenge von Mermaid stateDiagram-v2. Mermaid-Beispiele werden unverändert eingefügt; die zusätzlichen UML 2.5-Elemente (Aktivitäten, History, Junction, Terminate, vollständige Übergangslabels) werden gleichzeitig akzeptiert.

Referenzen:


13. Roadmap

  • BT / RL-Richtungen – werden derzeit beim Parsen auf TB / LR normalisiert; visuelle Umkehrung ausstehend
  • Richtungs-Override pro Regiondirection LR innerhalb eines Composite-Blocks (wird derzeit stillschweigend ignoriert)
  • Submachine-Referenzenstate Foo : Submachine-Stereotyp-Rendering
  • Internes Übergangskompartiment – expliziter visueller Trenner für tick [g] / a-Zeilen innerhalb eines Zustandskörpers

Verwandte Beispiele

Sofort einsatzbereite Szenarien aus der Beispiel-Galerie:

state·§ OMG UML 2.5.1 §14
State Diagram — Traffic Light UML 2.5 / Harel statechart rendered by Schematex Traffic Light Red Green Yellow timer timer timer power_off
Traffic light (state diagram)
A three-state finite state machine for a traffic signal — Red, Green, Yellow — with timer-driven transitions and a power_off exit to a final state. Introduces UML initial and final pseudo-states, transition labels, and the cyclic structure that makes state diagrams the right tool for reactive systems.
education
state·§ OMG UML 2.5.1 §14
State Diagram — E-Commerce Order Lifecycle UML 2.5 / Harel statechart rendered by Schematex E-Commerce Order Lifecycle Processing AwaitingTransfer Picking Packing Shipped Delivered Failed Refunded Pending Cancelled Confirmed place_order [items_in_stock] / reserveInventory() cancel pay [method == "card"] [method == "wallet"] [method == "bank_transfer"] transfer_received [amount_correct] transfer_timeout picked / updateWarehouse() label_printed carrier_confirmed delivered / notifyCustomer() fulfillment_error return_request [within_30_days] / initiateRefund() retry [attempt < 3] retry [attempt >= 3] SLA: 48 h before timeout.
E-commerce order lifecycle (state diagram)
Full order state machine — from Pending through payment routing (choice pseudo-state), composite Processing state with Picking/Packing/Shipped sub-states, delivery, refund, and cancellation paths. Demonstrates composite states, choice pseudo-states, guard conditions, entry actions, and UML notes.
e-commerce

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.