GLO-4002 2026

DDD : Agrégats

Vue d'ensemble

Un agrégat est un regroupement d'objets. C'est un concept assez simple, mais qui cache de nombreuses subtilités. Commençons par les règles de base d'un agrégat

  • Une frontière claire : les objets qui font partie de l'agrégat sont internes à celui-ci, les objets qui n'en font pas partie sont externes.
  • Un point d'entrée unique : les objets externes interagissent avec l'agrégat via un seul objet qui s'appelle la tête d'agrégat.

Règle fondamentale d'un agrégat : toutes les interactions provenant d'objets externes doivent passer par la tête d'agrégat

Cela signifie que les objets externes ne peuvent pas manipuler les objets internes, ils ne peuvent interagir qu'avec la tête d'agrégat. Généralement, les agrégats ne doivent pas avoir de "fuites", c'est-à-dire que la tête d'agrégat ne doit pas passer de références vers ses objets internes à l'extérieur.

Vue d'ensemble d'un agregat

Pourquoi des agrégats?

À votre avis, pourquoi utiliser des agrégats dans votre domaine? A. Rendre les objets internes immuables B. Simplifier les interactions entre les objets du domaine C. Préserver des règles d'intégrité du domaine D. Rendre le cours plus compliqué pour les étudiants

☑️ Solution

Réponse B et C :

B: Très souvent, la complexité du domaine, et notamment les interactions/relations entre ses différents concepts, ne peut être représentée telle quelle dans le code. C'est une sur-simplification de penser que l'orienté objet a pour but de représenter la réalité. En empêchant des interactions directes avec ses objets internes, l'agrégat permet de simplifier le modèle d'interaction dans le code.

C: La tête d'agrégat joue un rôle clé pour maintenir l'intégrité du domaine. En tant que point d'entrée des interactions externes à l'agrégat, elle s'assure que l'état interne de l'agrégat reste cohérent dans le temps.

La réponse A est fausse, car on n'empêche pas les objets internes de changer, on veut simplement contrôler la façon dont ils sont manipulés.

La réponse D est fausse, car le cours est assez compliqué sans devoir en rajouter :)

Exercice

Notre logiciel de gestion de clinique a du succès, de nouveaux besoins apparaissent notamment pour gérer l'assurabilité des patients. Ouvrez le code dans ce repository github, vous y trouverez un exemple d'agrégat :

  • la tête d'agrégat est PatientAssurable, elle contient un HistoriquePatient
  • un HistoriquePatient contient les dates significatives dans la vie du patient (naissance, inscription, décès) ainsi que la liste des SejoursHorsQuebec
  • un SejourHorsQuebec contient une date de départ, une durée en jours et une raison (séjour personnel ou professionnel/études)

Prenez le temps de lire le code, quel diagramme correspond au design de ce code?

Diagramme

☑️ Solution

Réponse 1.

  • La réponse 2 est fausse car un HistoriquePatient ne donne pas accès à HistoriquePatient (pas de méthode obtenirHistorique). Cela briserait l'encapsulation de l'agrégat.
  • La réponse 3 est fausse car un PatientAssurable n'a pas de SejourHorsQuebec directement.

Implémentation de l'agrégat

Ouvrez le code dans le projet clinic-aggregate, votre but est de faire passer les tests unitaires en implémentant l'agrégat PatientAssurable.

  1. Commencez par faire passer les tests de SejourHorsQuebec
  2. Ensuite, faites passer les tests de HistoriquePatient
  3. Terminez par faire passer les tests de PatientAssurable

Pour chaque série de test, facilitez-vous la vie en les faisant passer un à la fois et non tous d'un coup !