TUTORIELS 
UML: vues dynamiques (1)
Premier volet de l'examen des vues dynamiques en UML, introduisant la donnée temporelle.  (6 juillet 2001)
 

Quels types de diagrammes?
Une précédente série d'articles a décrit les vues statiques de l'Unified Modeling Language. Il restait à détailler la modélisation "dynamique" sous forme de diagrammes de séquence, de collaboration, d'états-transitions et d'activités. Ces représentations ont pour point commun l'inclusion du paramètre temps dans le fonctionnement du système. Ce paramètre peut se traduire par un contexte (ainsi les diagrammes de collaboration décrivent des interactions entre objets dont on précise les états), ou une chronologie (diagrammes de séquence). En particulier, le déroulement d'un cas d'utilisation peut être décrit par un diagramme d'activité, variante du diagramme d'états-transitions. Nous décrirons dans ce document les diagrammes de collaboration et de séquence, tandis que les diagrammes d'activités et d'états-transitions seront abordés ultérieurement.

Diagrammes de collaboration
Ils montrent les objets, réprésentés de manière usuelle mais avec précision (éventuelle) de l'état dans lequel ils sont (donc de la valeur d'un ou plusieurs de leurs attributs, suivant la pertinence de l'information), et les messages échangés entre ces objets. Un message est, très généralement, spécifié sous la forme suivante:

[pré /] [ [cond] [séq] [ *[||][iter] ] :] [r :=] msg([par])

(tout ce qui est entre crochets est facultatif).
pré désigne une liste de numéros de séquence (séq) séparés par des virgules: le message ne sera envoyé que si tous les prédécesseurs ainsi spécifiés l'ont été;
cond est une condition sous forme d'expression booléenne entre crochets;
séq est le numéro de séquence du message: on numérote les messages par "familles" et "sous-familles" désignées par des chiffres séparés par des points (ainsi l'envoi du message 1.4.3 est antérieur à celui du message 1.4.4 mais postérieur à celui du message 1.3.5 par exemple); la simultanéité d'un envoi est désignée par une lettre (par exemple, les messages 1.6.a et 1.6.b sont envoyés en même temps);
iter spécifie (en langage naturel, entre crochets) l'envoi séquentiel (ou en parallèle, avec "||"); on peut omettre cette spécification et ne garder que le caractère "*" (ou "*||") pour désigner un message récurrent envoyé "un certain nombre de fois";
r est la valeur de retour du message, qui sera par exemple transmise en paramètre à un autre message;
msg est le nom du message et par désigne les paramètres (optionnels) du message.
Par exemple,

2 / [heure = minuit] *||[i := 1..5] : fermer()

envoie cinq fois en parallèle le message "fermer", sans paramètre ni valeur de retour, à condition qu'il soit minuit et que le message numéro 2 ait été envoyé. On n'a pas besoin ici de préciser le numéro de séquence. Notons que si l'on spécifie une itération, les caractères "*" et ":" sont obligatoires.

Cette syntaxe un peu complexe permet de préciser parfaitement la synchronisation des messages entre les objets (la direction d'un message étant spécifiée par une flèche pointant vers l'un ou l'autre des objets de l'interaction, reliés par ailleurs avec un trait continu).

Diagrammes de séquence
La représentation se concentre sur l'expression d'une interaction (on ne décrit donc pas l'état des objets). Chaque message est ici caractérisé par sa nature, à savoir:

message simple
: ceux que nous avons décrits plus haut;
message minuté: l'objet-expéditeur du message est "bloqué" pendant un temps donné (spécifié dans une contrainte) en attendant la prise en compte du message par l'objet-récepteur (si celui-ci n'a pas pris en compte le message au bout du temps imparti, l'expéditeur est "libéré");
message synchrone: l'objet-expéditeur est "bloqué" jusqu'à prise en compte du message par l'objet-récepteur;
message asynchrone: l'objet-expéditeur n'est jamais bloqué, tandis que l'objet-récepteur peut ignorer le message;
message dérobant: l'objet-expéditeur n'est jamais bloqué; et l'objet-récepteur ne traite le message qui s'il a été au préalable mis en attente de ce message.

Chaque type de message est représenté par un symbole différent (voir figure ci-dessus: l'ordre est celui du texte).

Dans un diagramme de séquence, les messages "partent" de la ligne de vie de l'objet (représentée par une ligne verticale démarrant à la base de l'objet), mais on peut utiliser aussi une bande d'activation, indiquant les périodes ou les objets sont "bloqués" ou au contraire "actifs" suivant le sens donné plus haut. Cela donnera quelque chose comme:


Un objet A (toujours "actif") envoie un message asynchrone d'activation à un autre objet (B), qui renvoie une valeur de retour à la fin de sa propre période d'activité. Plus tard, un message simple est envoyé à l'objet B, l'activant pendant une certaine période.

 
[ Jérôme Morlon, JDNet
 
Accueil | Haut de page