Association, agrégation et composition expliquées dans la POO

Le langage de modélisation unifié (UML) est une norme de facto pour la modélisation de systèmes orientés objet. Dans UML, il existe cinq types différents de relations: association, agrégation, composition, dépendance et héritage. Cet article présente une discussion des trois premiers de ces concepts, laissant les autres à un autre article de blog.

Association en programmation orientée objet

L'association est une relation sémantiquement faible (une dépendance sémantique) entre des objets autrement non liés. Une association est une relation «d'utilisation» entre deux ou plusieurs objets dans laquelle les objets ont leur propre durée de vie et il n'y a pas de propriétaire.

À titre d'exemple, imaginez la relation entre un médecin et un patient. Un médecin peut être associé à plusieurs patients. Dans le même temps, un patient peut consulter plusieurs médecins pour un traitement ou une consultation. Chacun de ces objets a son propre cycle de vie et il n'y a ni «propriétaire» ni parent. Les objets qui font partie de la relation d'association peuvent être créés et détruits indépendamment.

En UML, une relation d'association est représentée par une seule flèche. Une relation d'association peut être représentée par un à un, un à plusieurs ou plusieurs à plusieurs (également appelé cardinalité). Essentiellement, une relation d'association entre deux ou plusieurs objets désigne un chemin de communication (également appelé lien) entre eux afin qu'un objet puisse envoyer un message à un autre. L'extrait de code suivant illustre comment deux classes, BlogAccount et BlogEntry, sont associées l'une à l'autre.

BlogAccount de classe publique

   {

       BlogEntry privé [] blogEntries;

       // Autres membres de la classe BlogAccount

   }

public class BlogEntry

   {

       Int32 blogId;

       légende de chaîne;

       texte de chaîne;

       // Autres membres de la classe BlogEntry

   }

Agrégation dans la programmation orientée objet

L'agrégation est une forme spécialisée d'association entre deux objets ou plus dans laquelle chaque objet a son propre cycle de vie mais il existe également une propriété. L'agrégation est une relation typique tout / partie ou parent / enfant, mais elle peut ou non dénoter un confinement physique. Une propriété essentielle d'une relation d'agrégation est que le tout ou le parent (c'est-à-dire le propriétaire) peut exister sans la partie ou l'enfant et vice versa.  

Par exemple, un employé peut appartenir à un ou plusieurs départements d'une organisation. Cependant, si le service d'un employé est supprimé, l'objet employé ne sera pas détruit mais vivra. Notez que les relations entre les objets participant à une agrégation ne peuvent pas être réciproques, c'est-à-dire qu'un service peut «posséder» un employé, mais que l'employé n'est pas propriétaire du service. Dans l'exemple de code suivant, une relation d'agrégation est évidente entre les classes BlogAuthor et BlogAccount.

BlogAuthor de classe publique

   {

       private Int32 authorId;

       chaîne privée firstName;

       chaîne privée lastName;

       // Autres membres de la classe BlogAuthor

   }

BlogAccount de classe publique

   {

       BlogEntry privé [] blogEntries;

       // Autres membres de la classe BlogAccount

   }

L'agrégation est généralement représentée en UML en utilisant une ligne avec un losange creux. Comme l'association, l'agrégation peut impliquer une relation un-à-un, un-à-plusieurs ou plusieurs-à-plusieurs entre les objets participants. Dans le cas d'une relation un-à-plusieurs ou plusieurs-à-plusieurs, on peut dire qu'il s'agit d'une relation redondante.

Composition en programmation orientée objet

La composition est une forme d'agrégation spécialisée. En composition, si l'objet parent est détruit, les objets enfants cessent également d'exister. La composition est en fait un type d'agrégation fort et est parfois appelée relation de «mort». A titre d'exemple, une maison peut être composée d'une ou plusieurs pièces. Si la maison est détruite, toutes les pièces qui font partie de la maison sont également détruites. L'extrait de code suivant illustre une relation de composition entre deux classes, House et Room.

Maison de classe publique

{

   chambre privée;

   Maison publique ()

   {

       pièce = nouvelle pièce ();

   }

}

Comme l'agrégation, la composition est également une relation tout / partie ou parent / enfant. Cependant, dans la composition, le cycle de vie de la pièce ou de l'enfant est contrôlé par l'ensemble ou le parent qui le possède. Il est à noter que ce contrôle peut être direct ou transitif. Autrement dit, le parent peut être directement responsable de la création ou de la destruction de l'enfant ou le parent peut utiliser un enfant qui a déjà été créé. De même, un objet parent peut déléguer le contrôle à un autre parent pour détruire l'objet enfant. La composition est représentée dans UML à l'aide d'une ligne reliant les objets avec un losange plein à la fin de l'objet qui possède l'autre objet.

J'espère que cette discussion sur les relations d'association, d'agrégation et de composition vous a aidé à comprendre en quoi ces trois concepts diffèrent. N'oubliez pas que l'agrégation et la composition sont deux sous-ensembles d'association. Dans l'agrégation et la composition, un objet d'une classe peut être le propriétaire d'un objet d'une autre classe. Et à la fois dans l'agrégation et la composition, les objets enfants appartiennent à un seul objet parent, c'est-à-dire qu'ils ne peuvent avoir qu'un seul propriétaire.

Enfin, dans une relation d'agrégation, les cycles de vie des objets parents et des objets enfants sont indépendants. Dans une relation de composition, la mort d'un objet parent signifie également la mort de ses enfants.