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.
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 unHistoriquePatient - un
HistoriquePatientcontient les dates significatives dans la vie du patient (naissance, inscription, décès) ainsi que la liste desSejoursHorsQuebec - un
SejourHorsQuebeccontient 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?
☑️ Solution
Réponse 1.
- La réponse 2 est fausse car un
HistoriquePatientne donne pas accès àHistoriquePatient(pas de méthodeobtenirHistorique). Cela briserait l'encapsulation de l'agrégat. - La réponse 3 est fausse car un
PatientAssurablen'a pas deSejourHorsQuebecdirectement.
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.
- Commencez par faire passer les tests de
SejourHorsQuebec - Ensuite, faites passer les tests de
HistoriquePatient - 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 !

