Archyno
UMLDiagrammes de comportement

Exemples de diagrammes d'états-transitions

Trois machines à états réutilisables telles quelles - un cycle de vie de commande, un workflow éditorial qui revient en arrière, et le fragment qui montre pourquoi un état en attente n'est pas un état bloqué.

8 min de lectureUML 2.5.116 sur 35

La réponse courte

  • Le cycle de vie d'une commande est l'exemple à reprendre : six états, un déclencheur par transition, et deux fins distinctes plutôt qu'une.
  • Plusieurs états finaux, c'est normal. Annulée et livrée sont toutes deux terminées, et les ramener au même disque cerclé efface la différence.
  • Un délai d'expiration est une transition déclenchée par un événement temporel - after(72 heures). Aucune garde : le temps qui passe est le déclencheur.
  • Un état sans transition activée est inactif, pas cassé. C'est l'inverse du diagramme d'activité, où un jeton sans issue signale un blocage.
Un diagramme de machine à états UML pour une commande. Depuis le pseudo-état initial, la commande est dans Panier ; checkout la fait passer à Passée. Depuis Passée, pay avec les fonds suffisants la fait passer à Payée, et cancel la fait descendre vers Annulée, qui atteint un état final. Depuis Payée, dispatch la fait descendre vers Expédiée, deliver la fait passer à Livrée, et Livrée atteint un second état final.
Le cycle de vie d'une commande. Six états, un déclencheur par transition, et deux fins qui ne sont pas la même fin.

01Exemple 1 : le cycle de vie d'une commande#

Si une table de votre base a une colonne status, ce diagramme est déjà implicite dans le code : il est simplement écrit à travers une douzaine de clauses de garde au lieu d'être dessiné une fois. Le rendre explicite est l'exercice de recherche de défauts le moins cher qu'offre une machine à états.

Lisez les transitions plutôt que les boîtes. Chacune porte le déclencheur qui la provoque - checkout, pay, dispatch, deliver - et l'une porte un effet après une barre oblique : dispatch / print label. Ces étiquettes sont le contenu. Un diagramme de six boîtes arrondies aux flèches non étiquetées dit seulement que les choses changent, ce que tout le monde savait déjà.

Les deux états finaux sont délibérés. Annulée et Livrée sont toutes deux terminales et ne sont pas le même résultat, et dessiner un seul disque cerclé pour les deux dirait que la commande est terminée sans dire comment. Rien dans UML ne vous limite à un seul.

02Exemple 2 : un flux qui revient en arrière#

Les vrais flux de travail vont rarement dans un seul sens. Quelque chose est refusé, revient, et repasse - et c'est dans la transition de retour que vivent en général les règles intéressantes.

Un diagramme de machine à états UML pour un flux éditorial. Depuis le pseudo-état initial au-dessus, un article est dans Brouillon. Submit le fait passer à En relecture. Approve le fait passer à droite vers Approuvé puis en bas vers Publié, qui atteint l'état final. Reject fait descendre En relecture vers Refusé, et revise ramène Refusé vers la gauche à Brouillon.

La transition revise de Refusé vers Brouillonest ce qui fait de ceci une machine à états plutôt qu'une liste de contrôle. Elle dit qu'un article refusé n'est pas fini : il rentre dans le même cycle, et tout compteur du genre « refusé deux fois signifie escalader » pend à cette flèche et non à un état.

Notez que Refusé a une sortie et Publié non. Un état sans transition sortante et sans état final derrière lui affirme que l'objet y reste pour toujours, ce qui est parfois vrai et plus souvent un oubli. Vérifier chaque état feuille sur ce point est une relecture de deux minutes qui trouve de vrais trous.

Les noms de déclencheurs sont des événements du vocabulaire du domaine - submit, approve, reject, revise - et non des noms de méthodes. Cela garde le diagramme lisible pour les rédacteurs qui possèdent le processus, c'est-à-dire le public capable de vous dire qu'il est faux.

03Exemple 3 : deux sorties qui ne sont pas une décision#

La confusion la plus fréquente quand on passe des diagrammes d'activité aux machines à états porte sur ce que signifient deux flèches sortant d'une boîte.

Un fragment de machine à états UML. L'état En attente de paiement a deux transitions sortantes : pay barre oblique capture mène à Payée, et timeout de 72 heures mène à Expirée. Une note explique qu'il s'agit de deux déclencheurs et non de deux gardes, donc rien n'a besoin d'être exhaustif : l'état attend, tout simplement.

Ce sont deux déclencheurs, pas deux branches d'une décision. La commande reste indéfiniment dans En attente de paiement ; l'événement qui arrive le premier - pay ou l'événement temporel timeout(72h) - décide où elle va. Rien n'a besoin d'être exhaustif et il n'y a pas de [else], parce qu'attendre est une issue légitime.

C'est l'inverse d'un diagramme d'activité, où un jeton arrivant à une décision sans garde activée est un processus bloqué. Une géométrie identique, une sémantique opposée : d'où l'intérêt de choisir entre les deux notations volontairement plutôt que par habitude.

04Quand en dessiner une#

Une machine à états est peu coûteuse à dessiner et coûteuse à entretenir, donc la question de savoir si l'objet a un cycle de vie mérite d'être posée avant la première boîte.

À utiliser quand

  • L'objet a un champ de statut à plus de deux valeurs et des règles sur les changements licites.
  • Certaines transitions sont interdites et l'interdiction compte : remboursements, annulations, approbations.
  • Le même objet est touché par plusieurs services qui ne s'accordent pas sur ce qu'il peut faire ensuite.
  • Des délais ou des expirations changent l'objet sans que personne n'agisse dessus.

Préférer autre chose quand

  • Un processus traversant plusieurs objets et rôles : c'est un diagramme d'activité.
  • Une classe dont le statut est dérivé d'autres champs plutôt que stocké.
  • La configuration d'un moteur de workflow, qui est déjà une machine à états écrite.
  • Un diagramme couvrant deux objets. Dessinez une machine par cycle de vie.

Si le processus s'étend sur plusieurs participants plutôt que sur la vie d'un objet, vous voulez un diagramme d'activité ou, pour un public métier, BPMN. Le test est simple : si vous ne pouvez pas nommer la chose unique dont ce sont les états, ce n'est pas une machine à états.

05Ce qu'il faut retenir#

En une ligne chacun

  1. 01Les étiquettes de transition sont le contenu. Des flèches non étiquetées entre états ne disent rien.
  2. 02Plusieurs états finaux sont normaux : annulée et livrée sont toutes deux terminales et ne sont pas la même chose.
  3. 03Les flèches manquantes sont là où sont les bugs. Vérifiez chaque paire que vous n'avez pas dessinée.
  4. 04Deux flèches sortant d'un état sont deux déclencheurs, pas deux branches. Rien n'a besoin d'un [else].
  5. 05Une machine à états par objet doté d'un vrai cycle de vie. Un processus traversant des rôles est un diagramme d'activité.

06Questions fréquentes#

Quel est un bon exemple de diagramme d'états-transitions ?

Un cycle de vie de commande : panier, passée, payée, expédiée, livrée, avec une branche annulée depuis passée. Six états, un déclencheur par transition et deux fins distinctes couvrent tout ce qu'on demande habituellement à la notation.

Un diagramme d'états peut-il avoir plusieurs états finaux ?

Oui, et c'est en général souhaitable. Une commande annulée et une commande livrée sont toutes deux terminées mais ne sont pas le même résultat, et les ramener au même disque cerclé efface la distinction. UML ne limite pas le nombre d'états finaux.

Comment modéliser un délai d'expiration dans un diagramme d'états ?

Par une transition dont le déclencheur est un événement temporel, écrit par exemple timeout(72h) ou after(72 heures). Elle quitte l'état où l'objet attend et pointe vers ce que produit l'expiration. Aucune garde n'est nécessaire : le temps qui passe est le déclencheur.

Que se passe-t-il si aucune transition sortante n'est activée ?

Rien, et c'est correct. Une machine à états attend dans son état courant jusqu'à l'arrivée d'un déclencheur : un état sans transition activée est inactif, pas cassé. C'est l'inverse d'un diagramme d'activité, où un jeton sans issue signale un processus bloqué.

Faut-il une machine à états par classe ?

Au plus une, et seulement pour les classes ayant un vrai cycle de vie. Si une classe a une colonne de statut à plus de deux valeurs et des règles sur les changements permis, dessinez-la. Si le statut est dérivé ou fixé une seule fois, la machine n'apporte rien.

Dans cette série

À lire aussi

Tous les articles