• Aucun résultat trouvé

Nœud de stockage des données (data store node)

contraintes OCL

Chapitre 6 Diagramme d’activités

6.4 Nœud de contrôle (control node)

6.5.6 Nœud de stockage des données (data store node)

Figure 6.10: Dans cette modélisation, le personnel, après avoir été recruté par l’activité

Recruter personnel, est stocké de manière persistante dans le nœud de stockage Base de donnée du Personnel. Bien qu’ils restent dans ce nœud, chaque employé qui n’a pas encore

reçu d’affectation (étiquette stéréotypée «selection» : personnel.affectation=null) est disponible pour être utilisé par l’activité Affecter personnel.

Un nœud de stockage des données est un nœud tampon central particulier qui assure la persistance des données. Lorsqu’une information est sélectionnée par un flux sortant, l’information est dupliquée et ne disparaît pas du nœud de stockage des données comme ce serait le cas dans un nœud tampon central. Lorsqu’un flux entrant véhicule une donnée déjà stockée par le nœud de stockage des données, cette dernière est écrasée par la nouvelle.

Graphiquement, un nœud tampon central est représenté comme un nœud d’objet détaché (en bas de la figure 6.8) stéréotypé «datastore» (cf. figure 6.10).

6.6 Partitions

Figure 6.11: Illustration de l’utilisation de nœuds d’objets et de partitions dans un diagramme d’activités.

Les partitions, souvent appelées couloirs ou lignes d’eau (swimlane) du fait de leur notation, permettent d’organiser les nœuds d’activités dans un diagramme d’activités en opérant des regroupements (cf. figure 6.11).

Les partitions n’ont pas de signification bien arrêtée, mais correspondent souvent à des unités d’organisation du modèle. On peut, par exemple, les utiliser pour spécifier la classe

responsable de la mise en œuvre d’un ensemble tâche. Dans ce cas, la classe en question est responsable de l’implémentation du comportement des nœuds inclus dans ladite partition. Graphiquement, les partitions sont délimitées par des lignes continues. Il s’agit généralement de lignes verticales, comme sur la figure 6.11, mais elle peuvent être horizontales ou même courbes. Dans la version 2.0 d’UML, les partitions peuvent être bidimensionnelles, elles prennent alors la forme d’un tableau. Dans le cas d’un diagramme d’activités partitionné, les nœuds d’activités appartiennent forcément à une et une seule partition. Les transitions peuvent, bien entendu, traverser les frontières des partitions.

Les partitions d’activités étant des catégories arbitraires, on peut les représenter par d’autre moyens quand une répartition géométrique s’avère difficile à réaliser. On peut ainsi utiliser des couleurs ou tout simplement étiqueter les nœuds d’activité par le nom de leur partition d’appartenance.

6.7 Exceptions

Figure 6.12: Notation graphique du fait qu’une activité peut soulever une exception.

Une exception est générée quand une situation anormale entrave le déroulement nominal d’une tâche. Elle peut être générée automatiquement pour signaler une erreur d’exécution (débordement d’indice de tableau, division par zéro, …), ou être soulevée explicitement par une action (RaiseException) pour signaler une situation problématique qui n’est pas prise en charge par la séquence de traitement normale. Graphiquement, on peut représenter le fait qu’une activité peut soulever une exception comme un pin de sortie orné d’un petit triangle et en précisant le type de l’exception à proximité du pin de sortie (cf. figure 6.12).

Figure 6.13: Les deux notations graphiques de la connexion entre une activité protégée et son gestionnaire d’exception associé.

Un gestionnaire d’exception est une activité possédant un pin d’entrée du type de l’exception qu’il gère et lié à l’activité qu’il protège par un arc en zigzag ou un arc classique orné d’une petite flèche en zigzag. Le gestionnaire d’exception doit avoir les mêmes pins de sortie que le bloc qu’il protège (cf. figure 6.13).

Les exceptions sont des classeurs et, à ce titre, peuvent posséder des caractéristiques comme des attributs ou des opérations. Il est également possible d’utiliser la relation d’héritage sur les exceptions. Un gestionnaire d’exception spécifie toujours le type des exceptions qu’il peut traiter, toute exception dérivant de ce type est donc également prise en charge.

Figure 6.14: Exemple d’utilisation d’un gestionnaire d’exception pour protéger une activité de l’exception Division_par_zero déclenchée en cas de division par zéro.

Lorsqu’une exception survient, l’exécution de l’activité en cours est abandonnée sans générer de valeur de sortie. Le mécanisme d’exécution recherche alors un gestionnaire d’exception

susceptible de traiter l’exception levée ou une de ses classes parentes. Si l’activité qui a levé l’exception n’est pas protégée de cette exception, l’exception est propagée à l’activité englobante. L’exécution de cette dernière est abandonnée, ses valeurs de sortie ne sont pas générées et un gestionnaire d’exception est recherché à son niveau. Ce mécanisme de propagation se poursuit jusqu’à ce qu’un gestionnaire adapté soit trouvé. Si l’exception se propage jusqu’au sommet d’une activité (i.e. il n’y a plus d’activité englobante), trois cas de figure se présentent. Si l’activité a été invoquée de manière asynchrone, aucun effet ne se produit et la gestion de l’exception est terminée. Si l’activité a été invoquée de manière synchrone, l’exception est propagée au mécanisme d’exécution de l’appelant. Si l’exception s’est propagée à la racine du système, le modèle est considéré comme incomplet ou mal formé. Dans la plupart des langages orientés objet, une exception qui se propage jusqu’à la racine du programme implique son arrêt. Quand un gestionnaire d’exception adapté a été trouvé et que son exécution se termine, l’exécution se poursuit comme si l’activité protégée s’était terminée normalement, les valeurs de sortie fournies par le gestionnaire remplaçant celle que l’activité protégée aurait dû produire.