Aller au contenu

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 :

  1. Identifier les entités avec un cycle de vie complexe (commande, demande, contrat) et créer un diagramme d'états pour chacune.
  2. Pour chaque transition importante, créer un diagramme de sequence qui montre les interactions entre systèmes pour réaliser cette transition.
  3. 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.