web-dev-qa-db-fra.com

Boucle dans le diagramme d'activité UML à l'aide d'une région

Je modélise une boucle dans un diagramme d'activité UML. Cela fonctionne bien avec des nœuds de condition simples (diagramme 1), mais je cherche un moyen plus expressif pour souligner la sémantique de la boucle . Je suis donc arrivé aux "régions" ou "régions interruptibles" qui sont affichées ici et , mais je n'ai pas pu trouver beaucoup d'exemples vraiment satisfaisants.

Mon exemple est une fonction qui traite les messages d'une liste donnée. La boucle s'interrompt dès que le premier message valide est trouvé, puis le message est traité et la fonction renvoie true. Sinon, il retourne faux (s'il vous plaît pas de commentaires sur le sens ou le non-sens, c'est uniquement pour le plaisir d'un échantillon).

Diagramme 1: utilise un bon ancien nœud conditionnel de diagramme d'activité. Il est certes plus facile de suivre le flux de contrôle le long des flèches, mais il n'y a pas de "The LOOP", il y a juste un "si".

Diagramme 2:

  • la condition de sortie (positive) est-elle correcte, en utilisant un front d'interruption? Certes, il pourrait faire partie de la section [test] de la boucle avec l'itérateur.
  • BTW: comment le caractère itératif d'une boucle for est-il mieux exprimé en UML?
  • Le nœud final d'activité à l'intérieur du corps de la boucle est-il correct (c'est-à-dire lorsque le "message conditionnel valide?" Renvoie "non")? Il ne semble pas approprié d'utiliser un nœud final ici, mais comment puis-je exprimer le flux de contrôle d'une boucle?

La fonctionnalité des deux diagrammes doit être équivalente:

loop with conditional node

loop with region


Edit: Un autre diagramme qui met en œuvre les suggestions de Steph:

  • Noeud initial et final à l'intérieur du corps de la boucle
  • le "traitement ultérieur" est maintenant à l'intérieur du corps de la boucle. Eh bien ... OK ici mais il pourrait y avoir d'autres boucles où je préférerais l'avoir à l'extérieur. Ensuite, je pourrais changer le design de toute façon ...
  • Le "message suivant" peut également être vu comme objet itérateur lui-même au lieu de action "(fournir le) message suivant" du diagramme d'origine.
  • Les deux flèches de flux d'objets peuvent être un peu exagérées, mais je pense qu'elles sont correctes.

enter image description here

20
minastaros

En UML, le noeud final d'activité représente un achèvement, il est donc correct dans une région de boucle lorsque vous l'utilisez, c'est l'achèvement normal du contenu de votre boucle (qui à son tour conduit à l'itération suivante). En remarque, je vous conseille d'utiliser également un nœud initial pour le début de votre boucle.

Et il y a aussi le nœud final de flux, qui représente une sortie, au lieu d'un achèvement. Ainsi, vous pouvez l'utiliser pour représenter l'instruction "break", au lieu de l'Edge d'interruption que vous utilisez. Dans ce cas, vous devez intégrer le "nœud de traitement de message supplémentaire", dans la branche "oui", juste avant ce nœud final de flux.

L'Edge d'interruption est plutôt destiné aux interruptions provenant de l'extérieur du traitement en cours. La région est interruptible et certains événements (généralement notés avec les nœuds de réception) peuvent l'interrompre complètement, quelle que soit la progression du contenu de la région. Ici ce n'est pas le cas.

Concernant le caractère itératif, il n'y a malheureusement rien de très visuel. J'ai tendance à utiliser un nœud d'objet au-dessus de la région, juste à côté du nœud initial.

10
Steph