Retour aux articles

Application du Domain-Driven Design (DDD) pour modéliser une application de gestion hospitalière

Application du Domain-Driven Design (DDD) pour modéliser une application de gestion hospitalière | Laty Gueye Samba - Développeur Full Stack Dakar Sénégal, Expert Java Spring Boot Angular
```html

Application du Domain-Driven Design (DDD) pour modéliser une application de gestion hospitalière

La modélisation d’une application de gestion hospitalière exige de concilier de nombreuses contraintes : sécurité des données, complexité métier, traçabilité des actes, gestion des rôles, exigences réglementaires et évolution constante des processus de soins. Le Domain-Driven Design (DDD) aide à structurer l’approche logicielle autour du domaine métier, en réduisant l’écart entre le vocabulaire des équipes (métiers, paramédical, administratifs) et le code.

Pourquoi le DDD est pertinent en contexte hospitalier

Dans un hôpital, les règles métier sont nombreuses et fortement interconnectées : planification des consultations, admission, prescriptions, gestion des lits, urgences, priorisation, facturation et archivage. Une conception centrée uniquement sur la technologie conduit souvent à des modèles “ancrés en base” difficiles à faire évoluer.

Le DDD propose une méthode pour :

  • Créer un langage commun entre équipes techniques et métier.
  • Isoler les sous-domaines à complexité et cycles de vie différents.
  • Encapsuler les règles métier dans des objets cohérents.
  • Gérer correctement les invariants (ex. : une prescription doit respecter des règles de validité).
  • Contrôler les interactions via des limites explicites (bounded contexts).

Découpage du domaine : bounded contexts et sous-domaines

La première étape consiste à identifier des bounded contexts, c’est-à-dire des périmètres où le modèle métier est cohérent et où les règles ne changent pas selon le contexte.

Exemples de bounded contexts

Contexte “Admission & Parcours”

  • Admission, transfert, sortie.
  • État clinique administratif (en attente, en cours, clôturé).
  • Contraintes liées au parcours patient.

Contexte “Planification & Ressources”

  • Gestion des agendas, plages opératoires, contraintes de capacité.
  • Rattachement aux ressources (salles, lits, praticiens).
  • Optimisation des contraintes (priorités, indisponibilités).

Contexte “Prescription & Traitements”

  • Prescriptions, médicaments, posologies, renouvellements.
  • Règles de validité (durée, intervalles, non-chevauchement).
  • Traçabilité des modifications et validations.

Contexte “Facturation & Paiement”

  • Génération des actes, remboursement, factures.
  • Règles de calcul, statuts et justificatifs.
  • Contrôle des montants et audit.

Chaque contexte peut utiliser sa propre représentation. Lorsqu’un même concept apparaît différemment (par exemple “acte” ou “séjour”), le DDD recommande de clarifier les différences de sens entre contextes.

Modélisation avec les concepts DDD

Entités, valeurs et agrégats

Les entités portent une identité qui persiste dans le temps (ex. Patient, Consultation). Les objets valeur décrivent des concepts immuables (ex. Adresse, Période, Montant). Les agrégats regroupent un ensemble cohérent d’objets autour d’une racine, garantissant des invariants.

Exemple : Agrégat “Prescription”

Une prescription exige des règles d’intégrité strictes : un traitement peut être refusé si le patient n’est pas éligible, ou si la période de validité chevauche une autre prescription non compatible.

Prescription (Aggregate Root) - id - patientId - items (ligne(s) de traitement) - periodeValidite - statut (Draft, Validated, Suspended) - methods: - valider() - suspendre(motif) - ajouterItem(medicament, posologie, regles)

Le code d’accès doit rester cohérent : les invariants sont contrôlés au niveau de la racine d’agrégat. Les modifications indirectes sont évitées (ou encadrées) pour ne pas casser la cohérence.

Gestion des règles métier : invariants et services de domaine

Invariants au cœur du modèle

Les invariants sont des règles qui doivent toujours rester vraies. En hospitalier, un exemple typique est la cohérence entre statut du parcours et actions possibles. Une sortie ne doit pas être déclenchée si des étapes obligatoires ne sont pas finalisées.

Services de domaine

Lorsque certaines règles nécessitent plus qu’un seul agrégat (ou des opérations qui ne rentrent pas naturellement dans l’agrégat), des services de domaine peuvent orchestrer les décisions. Ils encapsulent le “pourquoi”, sans devenir des contrôleurs applicatifs.

ServiceDeDomaine : QualificationEligibilitePatient - method: estEligible(patientId, traitement, periode) -> bool - sources: politiques de soins, historiques, contraintes

Stratégie d’intégration : bounded contexts, événements et commandes

Anti-corruption layer (ACL)

Les systèmes hospitaliers interagissent souvent avec des systèmes existants : SIH historiques, référentiels externes, outils d’imagerie, etc. Pour éviter de contaminer le modèle, un Anti-Corruption Layer transforme les données entrantes/sortantes afin de préserver le sens interne du contexte.

Événements de domaine

Les événements permettent de relier les contextes via des changements significatifs. Par exemple, lorsqu’une prescription est validée, d’autres contextes peuvent réagir : planification des dispenses, mise à jour de la traçabilité, préparation pharmaceutique.

DomainEvent : PrescriptionValidated - prescriptionId - patientId - validFrom - itemsSummary

Commande et orchestration

Les demandes d’action s’expriment souvent sous forme de commandes. Une commande déclenche une décision dans un contexte (par exemple “PlanifierConsultation”). Les workflows trans-contextes peuvent utiliser des process managers ou une orchestration asynchrone.

Architecture applicative recommandée

Couches et responsabilité

Une architecture DDD standard sépare :

  • Couche Domaine : entités, objets valeur, agrégats, services de domaine, invariants, événements.
  • Couche Application : cas d’usage, orchestrations, gestion des transactions, exécution des commandes.
  • Couche Infrastructure : persistance, connecteurs API, implémentations techniques (ORM, bus d’événements).

Exemple de cas d’usage applicatif

UseCase : ValiderPrescriptionCommandHandler - charge l’agrégat Prescription - appelle prescription.valider() - publie l’événement PrescriptionValidated - persiste les changements

Cette séparation limite la logique métier dans le domaine et empêche la couche application de devenir un “second domaine” incontrôlé.

Modélisation du langage : Ubiquitous Language

Alignement sémantique

Le langage omniprésent (Ubiquitous Language) est un livrable vivant. Il décrit des termes stabilisés : “séjour”, “consultation”, “prescription”, “dispensation”, “lot”, “statut”, “prescripteur”.

Chaque terme est documenté avec un sens et un périmètre. En cas de divergence, les bounded contexts et l’ACL doivent la clarifier.

Qualité, évolutivité et tests

Tests orientés modèle

Le DDD facilite des tests robustes : tests de domaine (invariants, transitions d’état), tests applicatifs (cas d’usage, orchestration), tests d’intégration (contrats d’événements, connecteurs).

Évolution contrôlée

Les hôpitaux font évoluer leurs pratiques. Un modèle DDD bien structuré permet de modifier un bounded context sans impacter l’ensemble, à condition de maintenir des contrats clairs (événements, DTO, ACL).

Conclusion

Le Domain-Driven Design constitue une approche efficace pour modéliser une application de gestion hospitalière en alignant la conception logicielle sur le domaine métier. En découpant le système en bounded contexts, en renforçant la cohérence via les agrégats et les invariants, puis en orchestrant les interactions par événements et couches anti-corruption, l’application gagne en clarté, maintenabilité et capacité d’évolution.

À propos de l'auteur

Laty Gueye Samba est développeur Full Stack basé à Dakar, Sénégal. Spécialiste des écosystèmes Java / Spring Boot et Angular.

Contact : latygueyesamba@gmail.com  |  Dakar, Sénégal