Certaines notes des diagrammes de classe UML m'embrouillent.
Je suis sûr que je sais ce que signifie Association . Toute relation entre des instances de deux classes, lorsqu'une instance d'une classe a besoin de connaître une instance de la seconde classe pour pouvoir exécuter son travail, est une relation d'association. Une association signifie souvent que la classe A a une référence (champ) à une instance de la classe B.
Cependant, j'ai du mal à comprendre ce que signifient les flèches d' agrégation et de composition . Une partie de ma confusion a été causée par la rencontre de différentes définitions de ces notations.
Deux définitions de la notation d' agrégation :
Définition 1: Une notation d'agrégation entre deux classes est appropriée lorsqu'une instance de la classe A contient une collection d'instances de la classe B (par exemple, une liste, un tableau, peu importe).
Définition 2: Un lien d'agrégation entre deux classes convient si une instance de la classe A contient une référence à une instance de la classe B et que l'instance B dépend du cycle de vie de l'instance A. Signification: Lorsque l'instance de la classe A est supprimée, l'instance de la classe B le sera également. L'instance de la classe B est entièrement contenue par l'instance de la classe A, par opposition à l'instance de la classe A possédant simplement une référence à l'instance de classe B (qui est une association régulière).
En ce qui concerne la signification de la composition et ses différences avec la notation d'agrégation, je n'en suis pas sûre.
Veuillez clarifier les définitions et aidez-moi à comprendre. Des exemples concrets seraient les bienvenus.
la source
Réponses:
Les trois liens Association, Agrégation et Composition forment une sorte d’échelle sur la relation de proximité entre deux classes.
À une extrémité de l'échelle, il y a Association, où les objets des deux classes peuvent se connaître, mais n'affectent pas la vie de chacun. Les objets peuvent exister indépendamment et quel objet de classe A sait quels objets de classe B peuvent varier dans le temps.
À l'autre bout de l'échelle, il y a la composition. La composition représente une relation partie-tout telle que la classe B fait partie intégrante de la classe A. Cette relation est généralement utilisée si des objets de la classe A ne peuvent exister logiquement sans un objet de classe B.
La relation d'agrégation se situe quelque part entre ces deux extrémités, mais personne ne semble s'accorder sur l'endroit où il se trouve, il n'y a donc pas non plus de définition universellement convenue de ce que signifie une agrégation. En ce sens, les deux définitions que vous avez trouvées sont correctes et si vous demandez à 10 personnes, vous risquez d’obtenir 11 définitions différentes.
la source
La composition est quand
object A
contientobject B
etobject A
est également responsable de la création duobject B
.Relation de composition
Nous avons une classe A qui sera utilisée par la classe B.
Il y a plusieurs options, comme l'apparence de la composition.
Composition d'initialisation directe:
Composition d'initialisation du constructeur
Composition d'initialisation paresseuse
Vous voyez que cela crée une relation étroite entre les classes
A
etB
. La classeB
ne peut tout simplement pas exister sansA
. Ceci est une énorme violation du principe d'injection de dépendance , qui dit:La composition est parfois utile, comme appeler
new DateTime
en php ounew std::vector<int>
en C ++. Mais le plus souvent, c'est un avertissement, que la conception de votre code est erronée.Dans le cas où l'objet
class A
serait un objet spécial utilisé pour la mise en cache, ilclass B
serait toujours mis en cache à l'aide de l'implémentation declass A
et vous n'auriez aucun contrôle pour le modifier de manière dynamique, ce qui est incorrect.De plus, si vous utilisiez la composition d’initialisation paresseuse , ce qui signifie que vous auriez une méthode de travail
object B
appelée lauseA()
méthode et que la création de celle-object A
ci échouerait, votre utilisation deviendraobject B
soudainement inutile.L'agrégation, en revanche, est une forme de relation qui suit le principe de l' ID .
object B
doit utiliserobject A
, vous devez alors passer l’instance déjà créée àobject A
àobject B
, et si la création d’object A
échec échouait, rien ne serait passé en premier lieu.En bref, Aggregation est une représentation UML du principe d’injection de dépendance , qu’il s’agisse d’injection de constructeur, d’injection de setter ou d’injection de propriété publique.
Ce sont tous des agrégations
L'injection de constructeur la plus étroite (
object B
ne peut exister sansobject A
).Looser (vous pouvez ou non utiliser l'
object A
intérieurobject B
, mais si vous le faites, vous devriez probablement le définir en premier).Via setter:
Via propriété publique:
Il n’existe pas vraiment de bon moyen de justifier l’utilisation de Aggregation sur Composition, si vous n’utilisez que des implémentations concrètes de classes, mais dès que vous commencez à injecter des interfaces ou, dans le cas de classes abstraites C ++, l’agrégation sera le seul moyen de procéder. remplir votre contrat.
la source
En outre, un extrait du standard UML actuel:
11.5.4 Associations - Sémantique - Notation
9.5.4 Classification - Propriétés - Notation
la source
J'ai déjà posté une réponse sur Stackoverflow .
Fondamentalement, une agrégation est plus forte qu'une simple association, mais les objets agrégés peuvent continuer à «vivre» les uns sans les autres, comme avec une simple association.
Une composition est encore plus forte qu'une agrégation car la classe agrégée ne peut pas être agrégée par d'autres classes. Sa "vie" dépend du conteneur.
la source