Il est étonnant de voir à quel point il existe une certaine confusion sur la distinction entre l' agrégation et la composition des concepts partie-tout - association . Le problème principal est le malentendu généralisé (même parmi les développeurs de logiciels experts et parmi les auteurs d'UML) selon lequel le concept de composition implique une dépendance du cycle de vie entre le tout et ses parties, de sorte que les parties ne peuvent exister sans le tout. Mais ce point de vue ignore le fait qu'il existe également des cas d'associations partie-tout avec des parties non partageables où les parties peuvent se détacher et survivre à la destruction du tout.
Dans le document de spécification UML, la définition du terme «composition» a toujours impliqué des parties non partageables, mais il n'a pas été clair quelle est la caractéristique de définition de «composition», et ce qui est simplement une caractéristique facultative. Même dans la nouvelle version (à partir de 2015), UML 2.5, après une tentative d'améliorer la définition du terme «composition», il reste encore ambigu et ne fournit aucune indication sur la façon de modéliser des associations partie-tout avec des non- parties partageables où les parties peuvent être détachées de, et survivre à la destruction du tout, par opposition au cas où les parties ne peuvent pas être détachées et sont détruites avec le tout. Ils disent
Si un objet composite est supprimé, toutes ses instances de pièce qui sont des objets sont supprimées avec lui.
Mais en même temps, ils disent aussi
Un objet pièce peut être supprimé d'un objet composite avant que l'objet composite ne soit supprimé, et donc ne pas être supprimé en tant que partie de l'objet composite.
Cette confusion indique une incomplétude de la définition UML, qui ne tient pas compte des dépendances de cycle de vie entre les composants et les composites. Il est donc important de comprendre comment la définition UML peut être améliorée en introduisant un stéréotype UML pour les compositions « inséparables » où les composants ne peuvent pas être détachés de leur composite, et doivent donc être détruits chaque fois que leur composite est détruit.
1) Composition
Comme l' a expliqué Martin Fowler , le principal problème pour caractériser la composition est qu '"un objet ne peut faire partie que d'une seule relation de composition". Ceci est également expliqué dans l'excellent article de blog UML Composition vs Aggregation vs Association par Geert Bellekens. En plus de cette caractéristique déterminante d'une composition (avoir des parties exclusives ou non partageables ), une composition peut également présenter une dépendance du cycle de vie entre le composite et ses composants. En fait, il existe deux types de telles dépendances:
- Chaque fois qu'un composant doit toujours être attaché à un composite, ou, en d'autres termes, lorsqu'il a un composite obligatoire , tel qu'exprimé par la multiplicité "exactement un" du côté composite de la ligne de composition, il doit être soit réutilisé dans (ou ré-attaché à) un autre composite, ou détruit, lorsque son composite actuel est détruit. Ceci est illustré par la composition entre
Person
et Heart
, illustrée dans le diagramme ci-dessous. Un cœur est détruit ou transplanté à une autre personne, lorsque son propriétaire est décédé.
- Chaque fois qu'un composant ne peut pas être détaché de son composite, ou, en d'autres termes, lorsqu'il est inséparable , alors, et alors seulement, le composant doit être détruit, lorsque son composite est détruit. Un exemple d'une telle composition avec des parties inséparables est la composition entre
Person
et Brain
.
En résumé, les dépendances du cycle de vie ne s'appliquent qu'à des cas spécifiques de composition, mais pas en général, elles ne constituent donc pas une caractéristique déterminante.
La spécification UML stipule: "Une pièce peut être supprimée d'une instance composite avant que l'instance composite ne soit supprimée, et donc ne pas être supprimée comme partie de l'instance composite." Dans l'exemple d'une Car
- Engine
composition, comme le montre le schéma suivant, il est clair que le moteur peut être détaché de la voiture avant que la voiture ne soit détruite, auquel cas le moteur n'est pas détruit et peut être réutilisé. Ceci est impliqué par la multiplicité zéro ou une du côté composite de la ligne de composition.
La multiplicité de l'extrémité d'association d'une composition côté composite est de 1 ou 0..1, selon le fait que les composants ont un composite obligatoire (doivent être attachés à un composite) ou non. Si les composants sont inséparables , cela implique qu'ils ont un composite obligatoire.
2) Agrégation
Une agrégation est une autre forme particulière d'association avec la signification voulue d'une relation partie-tout, où les parties d'un tout peuvent être partagées avec d'autres ensembles. Par exemple, nous pouvons modéliser une agrégation entre les classes DegreeProgram
et Course
, comme le montre le diagramme suivant, puisqu'un cours fait partie d'un programme d'études et qu'un cours peut être partagé entre deux ou plusieurs programmes d'études (par exemple, un diplôme d'ingénieur pourrait partager un C cours de programmation avec un diplôme en informatique).
Cependant, le concept d'une agrégation avec des parties partageables ne signifie pas grand-chose, vraiment, donc il n'a aucune implication sur l'implémentation et de nombreux développeurs préfèrent donc ne pas utiliser le diamant blanc dans leurs diagrammes de classes, mais simplement modéliser une association simple au lieu. La spécification UML dit: "La sémantique précise de l'agrégation partagée varie selon le domaine d'application et le modeleur".
La multiplicité de l'extrémité d'association d'une agrégation sur le côté entier peut être n'importe quel nombre (*) parce qu'une partie peut appartenir à, ou partagée entre, n'importe quel nombre de touts.