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