Structurer le comportement du système : un guide pratique des relations entre cas d’utilisation UML
Introduction
En génie logiciel moderne, les diagrammes de cas d’utilisation sont souvent mal compris comme de simples inventaires de fonctionnalités ou des cartes de projet de haut niveau. En réalité, ils servent de échafaudage architectural. Lorsqu’ils sont appliqués correctement, les relations entre cas d’utilisation ne se contentent pas de lister ce qu’un système doit faire ; ils décomposent activement des comportements complexes en modules gérables, réutilisables et logiquement cohérents. Cette clarté structurelle comble l’écart entre les attentes des parties prenantes et l’exécution du développement, garantissant que la documentation de conception détaillée reste maintenable, sans ambiguïté et alignée sur le comportement réel à l’exécution.
Cette étude de cas explore comment tirer parti des trois relations fondamentales entre cas d’utilisation UML 2.0—<<inclure>>, généralisation, et <<étendre>>—pour concevoir une plateforme d’entreprise évolutif. À travers des exemples concrets, des mappages de documentation textuelle et des directives éprouvées par l’industrie, nous montrerons comment ces relations transforment des documents de besoins éparpillés en plans clairs et prêts à être développés par les équipes.

Contexte de l’étude de cas : la plateforme Horizon
Pour ancrer ces concepts dans la réalité, nous examinerons la conception architecturale de la plateforme Horizon, un système de niveau entreprise chargé de gérer les comptes utilisateurs, les flux de création de contenu et la vérification d’identité externe. À mesure que les exigences ont augmenté, l’équipe d’ingénierie a fait face à deux défis critiques :
-
Bloat de documentation : Des étapes de validation et de gestion des erreurs répétitives ont été copiées-collées dans des dizaines de spécifications fonctionnelles.
-
Variations ambigües : Les types de comptes spécialisés et les chemins de défaillance conditionnels étaient mélangés, entraînant une extension du périmètre et une implémentation incohérente.
En appliquant stratégiquement les relations entre cas d’utilisation UML, l’équipe a résolu les deux problèmes. Les sections suivantes détaillent comment chaque relation a été appliquée, visualisée et documentée.
1. La <<inclure>> Relation : imposition de la réutilisation du comportement
Objectif et mécanisme
La <<inclure>> relation existe pour éliminer la redondance. Lorsque plusieurs cas d’utilisation partagent des étapes procédurales identiques, ces étapes sont extraites dans un sous-cas d’utilisation indépendant. Le cas d’utilisation de base incorpore explicitement ce comportement partagé, garantissant que les étapes incluses sont toujours exécutées dans le cadre du flux principal.
De façon cruciale, le cas d’utilisation inclus n’exige pas d’association directe avec un acteur. Il hérite automatiquement de la connexion contextuelle du cas d’utilisation de base qui l’appelle, ce qui maintient le diagramme propre et centré sur les objectifs métiers plutôt que sur les détails d’implémentation.
Visualisation PlantUML
Dans PlantUML, une flèche de dépendance pointillée indique du cas d’utilisation de base vers le cas d’utilisation inclus.

@startuml
skinparam theme plain
skinparam packageStyle rectangle
acteur Administrateur comme admin
acteur :Base de données des identifiants de l'auteur: comme db
rectangle "Système de gestion de contenu (CMS)" {
' Exemple d'inclusion
casdutilisation "Créer un nouveau compte Blog" comme UC_Blog
casdutilisation "Créer une nouvelle wiki personnelle" comme UC_Wiki
casdutilisation "Vérifier l'identité" comme UC_Check
UC_Blog ..> UC_Check : <<inclure>>
UC_Wiki ..> UC_Check : <<inclure>>
' Exemple d'extension
casdutilisation "Enregistrer une erreur d'application" comme UC_Fail
UC_Fail ..> UC_Blog : <<étendre>>
UC_Fail ..> UC_Wiki : <<étendre>>
}
admin --> UC_Blog
admin --> UC_Wiki
UC_Check --> db
@enduml
Cartographie de la documentation textuelle
Au lieu de réécrire les étapes de validation de l’identité dans plusieurs spécifications, l’équipe a adopté une syntaxe d’inclusion standardisée dans le flux principal de succès :
| Champ du cas d’utilisation | Valeur / Étapes du flux |
|---|---|
| Nom du cas d’utilisation | Créer un nouveau compte Blog |
| Flux principal de succès | 1. L’administrateur sélectionne le type de compte.
2. L’administrateur saisit les informations de l’auteur. 3. inclure::Vérifier l’identité afin de vérifier l’auteur. 4. Le système crée le nouveau compte blog. |
2. Généralisation des cas d’utilisation (héritage) : gestion des variations spécialisées
Objectif et mécanisme
La généralisation est appliquée lorsque un cas d’utilisation de base définit un flux de travail principal applicable à plusieurs contextes spécialisés, chacun nécessitant uniquement de légères variations. Un cas d’utilisation enfant hérite tous les comportements, objectifs et relations de son parent. Seuls les étapes uniques ou surchargées doivent être documentées dans l’enfant.
La règle « tout ou rien » : L’héritage dans les cas d’utilisation est strict. Chaque étape définie dans le parent doit logiquement s’exécuter dans l’enfant. Si un scénario spécialisé nécessite de sauter ou de modifier fondamentalement une étape du parent, la généralisation est l’outil inapproprié.
Visualisation PlantUML
La généralisation utilise une ligne pleine avec une flèche creuse, pointant de l’enfant vers le parent.

@startuml
skinparam theme plain
skinparam packageStyle rectangle
acteur Administrateur comme admin
rectangle "Gestion des comptes" {
casdutilisation "Créer un nouveau compte Blog" comme UC_Parent
casdutilisation "Créer un nouveau compte régulier" comme UC_Regular
casdutilisation "Créer un nouveau compte Blog éditorial" comme UC_Editorial
' Flèches de généralisation pointant vers Parent
UC_Parent <|-- UC_Regular
UC_Parent <|-- UC_Editorial
}
admin --> UC_Parent
@enduml
3. Le <<étendre>> Relation : Capture des flux conditionnels et optionnels
Objectif et mécanisme
Contrairement à <<inclure>>, qui représente une réutilisation obligatoire, <<étendre>> modélise un comportement optionnel ou conditionnel qui ne se déclenche que dans des circonstances spécifiques d’exécution. Le cas d’utilisation de base reste pleinement fonctionnel en tant que tel ; le cas d’utilisation étendu agit comme un « crochet » à l’exécution qui injecte des étapes supplémentaires lorsque des conditions prédéfinies sont remplies.
Architecturalement, cela sépare les chemins principaux de succès des gestion des exceptions, du routage alternatif ou des fonctionnalités optionnelles, évitant ainsi des flux principaux surchargés.
Cartographie de la documentation textuelle
Les extensions sont généralement mappées directement à partir des flux alternatifs ou d’exception dans la spécification textuelle :
| Champ du cas d’utilisation | Valeur / Étapes du flux |
|---|---|
| Nom du cas d’utilisation | Créer un nouveau compte Blog |
| Condition d’arrêt échouée | La demande pour un nouveau compte Blog est rejetée. |
| Section des extensions | Étape 3.1 : La base de données des identifiants de l’auteur ne vérifie pas les détails.
Étape 3.2 : étendu par::Enregistrer l’échec de la demande. |
4. Lignes directrices architecturales et bonnes pratiques
Appliquer avec succès ces relations exige une discipline. Les lignes directrices suivantes ont émergé d’un travail itératif de perfectionnement lors du déploiement de la plateforme Horizon :
-
Évitez le surmodélisation (« soupe de flèches ») :Les relations entre cas d’utilisation sont conçues pour lutter contre la redondance de la documentation, et non pour micromanager les interactions avec l’interface utilisateur. Si une étape ne représente pas un sous-objectif indépendant avec des critères commerciaux clairs de réussite/échec, gardez-la en texte intégré. Cliquer sur un bouton ou naviguer dans un menu ne justifie rarement un cas d’utilisation dédié.
-
Le « piège du programmeur » avec
<<étendre>>:Les développeurs ayant une formation orientée objet équivalent souvent à tort<<étendre>>avec l’héritage de classe.Ce n’est pas le cas.L’héritage de cas d’utilisation est exclusivement géré par la relation de généralisation. Traitez<<étendre>>strictement comme un plugin optionnel en temps d’exécution ou un point de crochet conditionnel. -
Vérifiez soigneusement les dépendances de généralisation :Avant de dessiner une flèche de généralisation, vérifiez rigoureusement que le cas d’utilisation enfant nécessite véritablementchaque étapedu parent. Si un cas d’utilisation enfant doit contourner, ignorer ou modifier fondamentalement des étapes du parent, remplacez la généralisation par
<<inclure>>ou<<étendre>>. -
Isoler les acteurs externes sur les modules réutilisables :Lorsque vous extrayez une routine partagée dans un cas d’utilisation inclus (par exemple,
Vérifier l'identité), transférez la connexion au sous-système externe d’appui (par exemple,Base de données des identifiants de l'auteur) directement vers ce sous-cas d’utilisation. Cela clarifie instantanément les limites des dépendances et maintient les diagrammes de niveau supérieur centrés sur les interactions métier plutôt que sur les détails d’infrastructure.
Conclusion
Les relations de cas d’utilisation UML sont bien plus que des conventions de dessin ; elles sontdes décisions de conception structurellequi ont un impact direct sur la maintenabilité du système, la clarté de la documentation et la vitesse de développement. En appliquant stratégiquement<<inclure>>pour le réutilisation obligatoire, la généralisation pour les variations spécialisées, et<<étendre>>pour les flux conditionnels, les architectes peuvent transformer des ensembles de besoins étendus en plans modulaires et logiquement cohérents.
La véritable valeur de ces relations réside dans leur cohérence entre les diagrammes visuels et les spécifications textuelles. Lorsque les diagrammes et les récits fonctionnels sont alignés, les équipes éliminent les ambiguïtés, réduisent la documentation redondante et établissent une source unique de vérité qui évolue avec le système. À mesure que les plateformes deviennent plus complexes, maîtriser ces relations reste l’une des façons les plus efficaces de garantir que l’intention architecturale se traduit sans heurt en logiciel fonctionnel.














