Comportements et états¶
Modéliser ce qui se passe dans le temps — interactions entre objets, enchainements de messages, et transitions d'états.
Pourquoi modéliser le comportement¶
Les diagrammes de classes et de données capturent la structure statique du système. Mais un système ne se réduit pas a ses données — il vit, réagit, change d'état. Une commande passe de "en attente" a "payee" a "expediee". Un utilisateur s'authentifie, consulte, modifie, se déconnecté. Un service reçoit un message, le traite, en emet un autre.
Pour comprendre et concevoir ces dynamiques, on a besoin de deux outils complementaires :
- Les diagrammes de sequence : qui envoie quoi a qui, dans quel ordre.
- Les diagrammes d'états : dans quels états une entité peut se trouver, et ce qui provoque les transitions.
Les deux se completent. Le diagramme de sequence montre les interactions entre objets pour un scenario donne. Le diagramme d'états montre le cycle de vie complet d'une entité unique. On a besoin des deux pour comprendre le système.
Diagrammes de sequence UML¶
Le diagramme de sequence représenté les interactions entre objets (ou systèmes, ou acteurs) le long d'un axe temporel vertical. Chaque participant est une "lifeline" (ligne de vie), et les messages circulent horizontalement entre elles.
Éléments fondamentaux¶
| Élément | Description | Notation |
|---|---|---|
| Lifeline | Participant dans l'interaction | Rectangle + ligne pointillee |
| Message synchrone | Appel bloquant, l'émetteur attend la réponse | Fleche pleine |
| Message asynchrone | Appel non bloquant, l'émetteur continue | Fleche ouverte |
| Message retour | Réponse a un message synchrone | Fleche pointillee |
| Barre d'activation | Periode pendant laquelle un participant est actif | Rectangle sur la lifeline |
| Auto-message | Un participant s'appelle lui-même | Fleche en boucle |
| Création | Un participant crée un autre | Fleche vers le rectangle |
| Destruction | Un participant est détruit | X sur la lifeline |
Exemple : passer une commande¶
sequenceDiagram
actor Client
participant UI as Interface web
participant API as API Gateway
participant CMD as Service commande
participant STK as Service stock
participant PAY as Service paiement
participant MSG as Service notification
Client->>UI: Valider le panier
UI->>API: POST /commandes
API->>CMD: creerCommande(panier)
CMD->>STK: verifierDisponibilite(articles)
STK-->>CMD: disponibilite confirmee
CMD->>PAY: initierPaiement(montant)
PAY-->>CMD: reference paiement
CMD->>CMD: enregistrer commande
CMD-->>API: commande creee (id, statut)
API-->>UI: 201 Created
PAY--)MSG: paiement confirme (async)
MSG--)Client: email de confirmation Ce diagramme révélé plusieurs décisions d'architecture : la communication synchrone entre API et services internes, la communication asynchrone pour les notifications, le point de coordination dans le service commande.
Fragments d'interaction¶
Les fragments permettent de représenter des structures de contrôle dans un diagramme de sequence.
| Fragment | Semantique | Équivalent code |
|---|---|---|
| alt | Alternative — un chemin parmi N selon condition | if/else |
| opt | Optionnel — exécuté si condition vraie | if (sans else) |
| loop | Boucle — répété tant que condition vraie | while/for |
| par | Parallèle — branches exécutées en parallèle | Thread/async |
| break | Interruption — sort du fragment englobant | break/return |
| critical | Section critique — exécution atomique | synchronized/lock |
| ref | Référence — renvoie a un autre diagramme | Appel de sous-routine |
Exemple avec fragments¶
sequenceDiagram
actor Client
participant CMD as Service commande
participant STK as Service stock
participant PAY as Service paiement
Client->>CMD: passer commande
alt stock disponible
CMD->>STK: reserver(articles)
STK-->>CMD: reservation OK
CMD->>PAY: debiter(montant)
PAY-->>CMD: paiement OK
CMD-->>Client: commande confirmee
else stock insuffisant
CMD-->>Client: commande refusee - stock
end Quand utiliser un diagramme de sequence vs un diagramme d'activité¶
| Critère | Diagramme de sequence | Diagramme d'activité |
|---|---|---|
| Focus | Interactions entre objets | Enchainement d'étapes |
| Axe principal | Temps (vertical) | Flux de contrôle |
| Participants | Explicites (lifelines) | Implicites (partitions) |
| Meilleur pour | Protocols, APIs, échanges | Algorithmes, workflows |
| Parallélisme | Fragment par | Fork/join |
| Niveau de détail | Messages et réponses | Actions et décisions |
La règle pragmatique : si on veut montrer qui parle a qui, on utilisé un diagramme de sequence. Si on veut montrer les étapes d'un processus, on utilise un diagramme d'activité (ou BPMN).
Diagrammes d'états¶
Un diagramme d'états (statechart) modélisé le cycle de vie d'une entité unique. Il répond à la question : dans quels états l'entité peut-elle se trouver, et quels événements provoquent les transitions entre états ?
Éléments fondamentaux¶
| Élément | Description | Notation |
|---|---|---|
| État | Situation stable dans le cycle de vie | Rectangle arrondi |
| Transition | Passage d'un état a un autre | Fleche avec label |
| Événement | Ce qui déclenche la transition | Label sur la fleche |
| Guard | Condition qui doit être vraie pour la transition | [condition] sur la fleche |
| Action entry | Action exécutée à l'entree dans l'état | entry / action |
| Action exit | Action exécutée à la sortie de l'état | exit / action |
| Action do | Activité continue pendant l'état | do / activité |
| État initial | Point de départ | Cercle plein |
| État final | Point d'arrivee | Cercle dans un cercle |
Exemple : cycle de vie d'une commande¶
stateDiagram-v2
[*] --> Brouillon : creation
Brouillon --> EnAttente : validation client
Brouillon --> Annulee : abandon
EnAttente --> Payee : paiement confirme
EnAttente --> Annulee : timeout 30 min
Payee --> EnPreparation : prise en charge logistique
Payee --> Remboursee : annulation apres paiement
EnPreparation --> Expediee : colis remis au transporteur
Expediee --> Livree : confirmation livraison
Expediee --> EnLitige : probleme livraison
EnLitige --> Livree : resolution positive
EnLitige --> Remboursee : resolution negative
Livree --> [*]
Annulee --> [*]
Remboursee --> [*] Ce diagramme rend explicite :
- Les états terminaux (Livree, Annulee, Remboursee)
- Les transitions conditionnelles (timeout, problème livraison)
- Les chemins de retour (litige vers livree ou rembourse)
- L'impossibilite de certaines transitions (on ne peut pas passer de Livree a EnPreparation)
Transitions implicites
Si une transition n'apparait pas dans le diagramme, elle est interdite. C'est la force du statechart : il rend explicite ce qui est permis et ce qui ne l'est pas. En revue, on vérifié chaque état : "que se passe-t-il si... ?" Si la réponse est "rien", l'état doit gérer ce cas (guard, rejet, ou ignorance explicite).
Automates finis¶
Les diagrammes d'états UML sont une notation pour un concept mathématique : l'automate fini. Comprendre les automates aide à modéliser des systèmes corrects.
Définition formelle¶
Un automate fini deterministe est un quintuplet (Q, Sigma, delta, q0, F) :
- Q : ensemble fini d'états
- Sigma : alphabet (ensemble d'événements d'entree)
- delta : fonction de transition (Q x Sigma -> Q)
- q0 : état initial
- F : ensemble d'états finaux (acceptants)
Lien avec les machines a états logicielles¶
En développement, les machines a états apparaissent partout : parseurs, protocoles réseau, UI, workflows. La théorie des automates garantit des propriétés utiles :
| Propriété | Signification pratique |
|---|---|
| Determinisme | Pour un état et un événement donnés, un seul état cible |
| Completude | Chaque état géré chaque événement possible |
| Accessibilite | Pas d'état impossible a atteindre (dead state) |
| Absence de deadlock | Pas d'état dont on ne peut pas sortir (sauf final) |
Valider un statechart
Avant d'implémenter une machine a états, on vérifié : (1) chaque état est accessible depuis l'état initial, (2) chaque état non-final a au moins une transition sortante, (3) chaque combinaison état/événement a une transition définie ou un rejet explicite. Ces verifications previennent les bugs les plus penibles : les états fantomes et les deadlocks.
États composites et avances¶
États composites¶
Un état composite contient des sous-états. Il permet de structurer une machine a états complexe en niveaux de détail. L'état "EnPreparation" peut contenir les sous-états "PriseEnCharge", "Emballage", "ControleQualite".
stateDiagram-v2
[*] --> EnPreparation
state EnPreparation {
[*] --> PriseEnCharge
PriseEnCharge --> Emballage : articles collectes
Emballage --> ControleQualite : colis scelle
ControleQualite --> [*] : controle OK
}
EnPreparation --> Expediee : preparation terminee
Expediee --> [*] Historique¶
L'état historique (H) memorise le dernier sous-état actif quand on quitte un état composite. Quand on y revient, on reprend ou on s'etait arrêté au lieu de recommencer depuis l'état initial interne.
Cas d'usage : un processus de commande interrompu par une vérification manuelle reprend à l'étape où il s'etait arrêté, pas au début.
Parallélisme (regions orthogonales)¶
Un état composite peut contenir des regions parallèles qui evoluent independamment. Par exemple, une commande en cours de traitement a simultanément un sous-état "logistique" (préparation, expedition) et un sous-état "financier" (facturation, encaissement).
| Concept | Usage | Complexité |
|---|---|---|
| États simples | Cycles de vie lineaires | Faible |
| États composites | Processus avec sous-étapes | Moyenne |
| Historique | Reprise après interruption | Moyenne |
| Regions parallèles | Dimensions indépendantes d'un même objet | Élevée |
Combiner sequences et états¶
Les diagrammes de sequence et les diagrammes d'états ne sont pas redondants — ils offrent deux vues complementaires du même système.
Le diagramme de sequence montre un scenario : "quand le client passe une commande, voici ce qui se passe entre les services". Le diagramme d'états montre le cycle de vie : "voici tous les états possibles d'une commande et toutes les transitions permises".
On les combine ainsi :
- Identifier les entités avec un cycle de vie complexe (commande, demande, contrat) et créer un diagramme d'états pour chacune.
- Pour chaque transition importante, créer un diagramme de sequence qui montre les interactions entre systèmes pour réaliser cette transition.
- Vérifier la cohérence : chaque message dans un diagramme de sequence qui change l'état d'une entité doit correspondre a une transition valide dans le statechart.
graph LR
SEQ[Diagramme de sequence] --"montre les interactions pour"--> TRANS[Transition d'etat]
STATE[Diagramme d'etats] --"definit les transitions valides"--> TRANS
TRANS --"valide les messages de"--> SEQ Cette vérification croisee est un outil puissant de détection d'incoherences. Si un diagramme de sequence montre qu'on passe de "Expediee" a "EnPreparation", mais que le statechart ne permet pas cette transition, il y a un bug de conception.
Erreurs classiques¶
| Erreur | Conséquence | Correction |
|---|---|---|
| Diagramme de sequence trop détaillé | Illisible, fragile, redondant avec le code | Se limiter aux interactions significatives |
| Oublier les messages d'erreur | Happy path uniquement, bugs en production | Ajouter des fragments alt pour les erreurs |
| États implicites ("en cours") | Ambiguite sur ce que le système fait | Nommer chaque état avec précision |
| Transitions sans guard | Transitions possibles dans tous les cas | Expliciter les conditions |
| Machine a états trop grande | Plus de 15 états = illisible | Utiliser des états composites |
| Confondre état et action | "Envoyer email" n'est pas un état | L'état est stable, l'action est ponctuelle |
Chapitre suivant : Structure technique — composants, déploiement, C4 niveaux 3-4 et ArchiMate pour documenter l'architecture physique.