web-dev-qa-db-fra.com

Notations des diagrammes de classes UML: différences entre l'association, l'agrégation et la composition

Je suis confus à propos de certaines des notations des diagrammes de classes UML.

enter image description here

Je suis presque sûr de savoir ce que signifie Association. Toute relation entre les instances de deux classes, où une instance d'une classe doit connaître une instance de la deuxième classe pour effectuer son travail - est une relation d'association. Une association signifie souvent que la classe A a une référence (champ) à une instance de classe B.

Cependant, j'ai du mal à comprendre ce que signifient les flèches Agrégation et 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 Agrégation:

Définition 1: Une notation d'agrégation entre deux classes convient chaque fois qu'une instance de classe A contient une collection d'instances de 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 classe A contient une référence à une instance de classe B, et l'instance B dépend du cycle de vie du A instance. 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. instance de classe A possédant simplement une référence à l'instance de classe B (qui est l'association régulière).

En ce qui concerne la signification de la notation de composition et en quoi elle diffère de la notation d'agrégation, je ne suis pas sûr.

Veuillez clarifier les définitions et m'aider à comprendre. Des exemples concrets seraient les bienvenus.

42
Aviv Cohn

Les trois liens Association, Agrégation et Composition forment une sorte d'échelle sur la façon dont deux classes sont étroitement liées.

À une extrémité de l'échelle, il y a l'Association, où les objets des deux classes peuvent se connaître, mais ils 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 extrémité de l'échelle, il y a 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 les objets de la classe A ne peuvent pas logiquement exister sans avoir un objet de la classe B.

La relation d'agrégation se situe quelque part entre ces deux extrémités, mais personne ne semble être d'accord exactement où, donc il n'y a pas non plus de définition universellement acceptée 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.

32

La composition est lorsqu'un object A Contient object B Et que le object A Est également responsable de la création du object B.

Relation de composition

Nous avons une classe A qui sera utilisée par la classe B.

final class A
{
}

Il y a plusieurs options comme l'apparence de la composition.

Composition d'initialisation directe:

final class B
{
    private $a = new A();
}

Composition d'initialisation du constructeur

final class B
{
    private $a;

    public function __construct()
    {
        $this->a = new A();
    }
}

Composition d'initialisation paresseuse

final class B
{
    private $a = null;

    public function useA()
    {
        if ($this->a === null) {
            $this->a = new A();
        }

        /* Use $this->a */
    }
}

Vous voyez que cela crée une relation étroite entre les classes A et B. La classe B ne peut tout simplement pas exister sans A. C'est une énorme violation de principe d'injection de dépendance , qui dit:

Une dépendance est un objet qui peut être utilisé (un service). Une injection est le passage d'une dépendance à un objet dépendant (un client) qui l'utiliserait. Le service fait partie de l'état du client. Passer le service au client, plutôt que de permettre à un client de créer ou de trouver le service, est la condition fondamentale du modèle.

La composition a parfois du sens, comme appeler new DateTime En php ou new std::vector<int> En C++. Mais le plus souvent, c'est un avertissement, que la conception de votre code est incorrecte.

Dans un cas, où class A Serait un objet spécial utilisé pour la mise en cache, le class B Serait toujours mis en cache en utilisant l'implémentation de class A, Et vous n'auriez aucun contrôle sur changer dynamiquement, ce qui est mauvais.

De plus, si vous avez utilisé la composition composition d'initialisation paresseuse, ce qui signifie que vous auriez une object B Fonctionnelle, appelée la méthode useA() et la création de object A échouerait, votre object B est soudainement inutile.


L'agrégation, en revanche, est un mode de relation qui suit le principe DI . object B Doit utiliser object A, Vous devez ensuite passer l'instance déjà créée de object A À object B, Et si la création de object A Échoue , rien ne serait passé en premier lieu.

En bref, l'agrégation est une représentation UML pour le principe d'injection de dépendance , que ce soit l'injection de constructeur, l'injection de setter ou l'injection de propriété publique.

Ce sont toutes des agrégations

L'injection de constructeur la plus étroite (object B Ne peut exister sans object A).

final class B
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

Plus lâche (vous pouvez ou non utiliser object A À l'intérieur de object B, Mais si vous le faites, vous devriez probablement le définir en premier).

Via setter:

final class B
{
    private $a;

    public function setA(A $a)
    {
        $this->a = $a;
    }
}

Via propriété publique:

final class B
{
    public $a;
}

Il n'y a pas vraiment un excellent moyen de justifier l'utilisation de l'agrégation sur la composition, si vous n'utilisez que des implémentations concrètes de classes, mais une fois que vous commencez à injecter des interfaces ou dans le cas de classes abstraites C++, soudainement l'agrégation sera le seul moyen de remplir votre contrat.

10
Andy

De plus, un extrait de la norme UML actuelle:

11.5.4 Associations - Sémantique - Notation

[...] Une association binaire peut avoir une extrémité avec agrégation = AggregationKind :: shared ou agrégation = AggregationKind :: composite. Quand une extrémité a une agrégation = AggregationKind :: shared a diamant creux est ajouté comme terminal ornement à la fin de la ligne d'association en face de la fin marquée par agrégation = AggregationKind :: shared. Le diamant doit être sensiblement plus petit que la notation du diamant pour les associations. Une association avec agrégation = AggregationKind :: composite a également un diamant à l'extrémité correspondante, mais diffère par le fait que le diamant est rempli po. […]

9.5.4 Classification - Propriétés - Notation

[…] Parfois, une propriété est utilisée pour modéliser des circonstances dans lesquelles une instance est utilisée pour regrouper un ensemble d'instances; c'est ce qu'on appelle l'agrégation. Pour représenter de telles circonstances, une propriété possède une propriété d'agrégation, de type AggregationKind; l'instance représentant l'ensemble du groupe est classée par le propriétaire de la propriété et les instances représentant les individus groupés sont classées par type de propriété. AggregationKind est une énumération avec les valeurs littérales suivantes:

  • aucun: indique que la propriété n'a pas de sémantique d'agrégation.
  • Shared: indique que la propriété a une sémantique d'agrégation partagée. La sémantique précise de l'agrégation partagée varie selon le domaine d'application et le modélisateur.
  • Composite: Indique que la propriété est agrégée de manière composite, c'est-à-dire que l'objet composite a la responsabilité de l'existence et du stockage des objets composés (voir la définition des pièces au 11.2.3). L'agrégation composite est une forme d'agrégation forte qui nécessite qu'un objet pièce soit inclus dans au plus un objet composite à la fois. Si un objet composite est supprimé, toutes ses instances de pièce qui sont des objets sont supprimées avec lui.

[…]

1
ManuelSchneid3r

J'ai déjà posté un 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 "durée de vie" dépend du conteneur.

0
C.Champagne