State diagram

À propos des diagrammes d'état

Un diagramme d'état (également appelé statechart ou diagramme de machine à états) décrit le cycle de vie d'un système réactif — dans quels états il peut se trouver, quels événements provoquent des transitions entre eux, et quelles actions s'exécutent à l'entrée, à la sortie ou pendant un état. Les architectes logiciels les utilisent pour spécifier des flux de travail ; les ingénieurs en automatique pour concevoir des contrôleurs réactifs ; les concepteurs d'interface utilisateur pour modéliser les cycles de vie des écrans. Ils sont formalisés dans OMG UML 2.5.1 §14 (machines à états) et dans l'extension Statechart de Harel (1987) qui a introduit les états composites, l'historique et les régions orthogonales.

Schematex implémente un sur-ensemble strict de Mermaid stateDiagram-v2 — chaque exemple Mermaid peut être collé sans modification, et vous bénéficiez en plus de fonctionnalités UML 2.5 que Mermaid n'expose pas : activités entry / exit / do, étiquettes de transition complètes trigger [guard] / action, pseudo-états terminate et history, junction, et notes en blocs de style Schematex. La mise en page utilise le même moteur DAG Sugiyama en couches que les diagrammes de flux, de sorte que les cycles, les états composites et les transitions inter-frontières sont tous correctement routés.

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·1.5 ms·6.5 KB SVG

1. Votre premier diagramme d'état

Le diagramme d'état utile le plus simple a un état initial, un état final et une transition.

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·0.6 ms·3.3 KB SVG

Trois règles couvrent 80 % des usages :

  1. Commencez par l'en-tête stateDiagram-v2 (style Mermaid) ou state (style Schematex).
  2. Utilisez [*] pour le nœud de départ implicite (à gauche de -->) ou le nœud de fin (à droite).
  3. Connectez les états avec -->. Ajoutez une étiquette après : — la forme UML complète est trigger [guard] / action.

La direction par défaut est TB (de haut en bas) pour correspondre à Mermaid. Remplacez par direction LR sur sa propre ligne, ou [direction: LR] sur l'en-tête.

Les commentaires utilisent %% (Mermaid), # ou //.


2. Déclarations d'état

Les états sont créés automatiquement lors de leur première référence dans une transition, mais les déclarations explicites permettent de contrôler l'étiquette et la forme.

state Authenticating
state "Awaiting Approval" as Approval
Idle: Waiting for input
FormeEffet
IdleIdentifiant nu — créé comme état simple avec Idle comme identifiant et étiquette
state IdleDéclaration explicite ; même effet
state "Awaiting Approval" as ApprovalAlias — affiche Awaiting Approval, référencé par Approval dans les transitions
Idle: Waiting for inputÉtiquette en ligne — Idle est l'identifiant, Waiting for input est le libellé visible

3. Pseudo-états

Les pseudo-états contrôlent le flux d'une machine à états sans représenter un état stable de repos.

MermaidSchematexSymboleObjectif
[*] (source)initial idCercle noir pleinPoint d'entrée d'une région
[*] (cible)final idCercle plein dans un anneau extérieurSortie réussie
state X <<choice>>choice XLosangeBranchement dynamique (gardes évalués à l'exécution)
state X <<fork>>fork XBarre noire épaisseUne entrée → N sorties parallèles
state X <<join>>join XBarre noire épaisseN entrées → une sortie
junction XPetit cercle pleinPoint de fusion statique
history XCercle avec HReprendre au dernier sous-état visité
dhistory XCercle avec H*Historique profond (récursif)
terminate XMarque ×Terminaison anormale (sans nettoyage)
entry_point X / exit_point XCercle creux sur la bordure compositePoints d'entrée / sortie nommés

[*] est l'alias Mermaid et est toujours résolu par direction : du côté source de --> c'est un initial, du côté cible c'est un final. Chaque portée composite obtient sa propre paire.

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·1.0 ms·5.1 KB SVG

4. Transitions

L'étiquette de transition complète UML 2.5 a trois parties optionnelles :

trigger [guard] / action
ChampSignificationExemple
triggerÉvénement qui déclenche la transitionsubmit, tick, timeout(30s)
[guard]Expression booléenne évaluée au moment du déclenchement[count > 0], [role == "admin"]
/ actionAction(s) exécutée(s) lors de la prise de transition/ log(); increment()

Les trois sont optionnels — une transition sans étiquette est anonyme (transition de complétion).

A --> B                                      %% complétion anonyme
A --> B : tick                                %% déclencheur seul
A --> B : [count > 0]                         %% garde seul
A --> B : / clearErrors()                     %% action seule
A --> B : tick [count > 0] / log()            %% les trois
A --> B : tick, tock [enabled] / handle()     %% multi-déclencheur

Les étiquettes longues se plient automatiquement lorsqu'elles dépassent la largeur du couloir.


5. États composites

Un état composite contient un sous-statechart imbriqué. L'état externe agit comme un conteneur avec ses propres pseudo-états initial / final.

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

La syntaxe Mermaid (state X { … }) et la forme Schematex (composite X { … }) sont toutes deux acceptées. Les activités peuvent être déclarées dans le bloc composite :

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

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

Le renderer dessine les composites comme un cluster stylisé avec une barre de titre et un compartiment d'activités.

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·6.0 ms·6.7 KB SVG

Les transitions inter-frontières (Extérieur --> Intérieur) sont routées automatiquement — la mise en page Sugiyama tire la source/cible à travers la bordure composite.


6. Régions concurrentes

Dans un composite, le séparateur -- (Mermaid) ou --- (Schematex) divise le corps en régions orthogonales qui s'exécutent de manière concurrente.

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

Utilisez fork et join pour créer / synchroniser des régions :

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.3 ms·4.6 KB SVG

7. Notes

Une courte annotation peut être attachée à l'un ou l'autre côté de n'importe quel état.

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

Les notes multilignes utilisent la forme de bloc Mermaid end note, ou la forme Schematex { … } :

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. Auto-transitions

Une transition A --> A s'affiche comme un arc courbé sur le côté droit du nœud.

Idle --> Idle : poll / refresh()

L'étiquette est placée à côté de l'arc, à l'extérieur de la boîte englobante.


9. Direction de mise en page

Schematex utilise par défaut TB (de haut en bas), correspondant à Mermaid. Remplacez sur l'en-tête :

stateDiagram-v2
direction LR

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

Ou avec la forme d'attribut entre crochets de Schematex :

state "Order Lifecycle" [direction: TB]

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

BT et RL sont acceptés par le parseur mais normalisés respectivement en TB et LR (le moteur de mise en page ne retourne pas encore l'ordre visuel).


10. Erreurs courantes

Vous avez écritLe parseur indiqueCorrection
[*] -> [*]Traité à la fois comme alias initial et alias final sur la même ligneAyez toujours au moins un état nommé entre les alias [*]
state X <<branch>>branch n'est pas un stéréotypeUtilisez <<choice>> (dynamique) ou <<fork>> / <<join>>
note right of
text
Une note multiligne doit se terminer par end noteAjoutez end note sur sa propre ligne
composite X (sans accolades)Traité comme une déclaration d'état simpleOuvrez le bloc : composite X {
direction LR dans un compositeLa direction par région n'est pas encore supportéeDéfinissez la direction sur la ligne d'en-tête

11. Grammaire (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_]*

Source faisant autorité : src/diagrams/state/parser.ts. En cas de divergence avec le parseur, le parseur a la priorité — veuillez ouvrir un ticket.


12. Conformité aux normes

FonctionnalitéUML 2.5Harel 1987MermaidSchematex
État simple
État composite (imbriqué)
Pseudo-état initial / final
Pseudo-état choice
Fork / join
Pseudo-état junction
History (superficiel / profond)
Pseudo-état terminate
Activités entry / exit / do
Étiquettes trigger [guard] / action❌ (étiquette seule)
Transitions internes
Régions concurrentes
Notes sur les états
Transitions inter-composites
Alias initial/final [*]

Schematex est un sur-ensemble strict de Mermaid stateDiagram-v2. Les exemples Mermaid peuvent être collés sans modification ; les éléments UML 2.5 supplémentaires (activités, history, junction, terminate, étiquettes de transition complètes) sont acceptés en parallèle.

Références :


13. Feuille de route

  • Directions BT / RL — actuellement normalisées en TB / LR à l'analyse ; retournement visuel en attente
  • Remplacement de direction par régiondirection LR dans un bloc composite (actuellement ignoré silencieusement)
  • Références de sous-machine — rendu du stéréotype state Foo : Submachine
  • Compartiment de transition interne — séparateur visuel explicite pour les lignes tick [g] / a dans le corps d'un état

Exemples associés

Scénarios prêts à l'emploi depuis la galerie d'exemples :

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.