Black Friday Spécial Anniversaire: -30% sur la formation et -10% sur les services Demandez un devis


Comprendre le Domain-Driven Design : Une approche pratique pour une architecture logicielle moderne

· Silas Joisten · Temps de lecture: 4 minutes
DDD

Découvrez les principes et les modèles du Domain-Driven Design (DDD) tels que le langage ubiquitaire, les agrégats et les contextes délimités. Apprenez comment le DDD s’intègre parfaitement aux projets PHP et Symfony, vous aidant à aligner les logiciels avec les besoins métier.

Dans le monde actuel du développement logiciel, il est plus important que jamais d'aligner les implémentations techniques sur les besoins métier. Le Domain-Driven Design (DDD) offre une approche structurée pour relever ce défi, en mettant l'accent sur l'importance de la logique métier et des connaissances de domaine dans le processus de développement. Dans cet article, nous examinerons les concepts et les principes fondamentaux de DDD, et comment il peut aider à construire des logiciels qui reflètent vraiment les complexités de votre domaine métier.

Qu'est-ce que le Domain-Driven Design ?

Le Domain-Driven Design, introduit par Eric Evans dans son livre Domain-Driven Design: Tackling Complexity in the Heart of Software, est une méthodologie axée sur la compréhension et la modélisation d'un domaine métier dans un logiciel. DDD préconise une approche collaborative claire entre les développeurs et les experts métier pour s'assurer que le modèle logiciel reflète fidèlement les processus réels.

Principes fondamentaux du Domain-Driven Design

1. Langage Ubiquitaire

Au cœur du DDD se trouve le concept de langage ubiquitaire—un langage partagé que les développeurs et les experts métier utilisent pour communiquer. Ce langage devient la base de votre modèle de domaine, et il est important que les termes et les concepts du domaine métier soient utilisés de manière cohérente dans les conversations et dans le code. Par exemple, si l'entreprise se réfère aux clients, aux factures et aux paiements, votre modèle de domaine doit refléter ces termes.

En favorisant la communication dans un langage commun, le DDD permet de s'assurer que tout le monde dans l'équipe—qu'il soit technique ou non—comprend clairement le système.

2. Entités et Objets Valeurs

Dans le DDD, nous modélisons les objets faisant partie de notre domaine en tant qu'entités ou objets valeurs :

  • Les entités sont des objets qui ont une identité distincte qui perdure dans le temps, comme un Client ou une Commande. Même si leurs attributs changent, leur identité reste la même.

  • Les objets valeurs sont immuables et n'ont pas d'identité. Leur égalité est déterminée par leurs propriétés. Un exemple classique est un objet Argent, où deux objets Argent ayant la même devise et le même montant sont considérés comme égaux.

Comprendre cette distinction aide à concevoir un modèle de domaine robuste, où l'accent est mis sur le comportement et les relations.

3. Agrégats et Racines d'Agrégats

Un agrégat est un groupe d'objets connexes que nous considérons comme une unité pour les modifications de données. Au sommet de cette hiérarchie se trouve la racine de l'agrégat, qui agit comme point d'accès pour accéder et modifier l'agrégat. Par exemple, dans un agrégat Commande, Commande serait la racine de l'agrégat, et il pourrait contenir des entités connexes telles que LigneDeCommande ou Paiement.

Les agrégats garantissent que notre système maintient la cohérence. Toutes les mises à jour des entités au sein d'un agrégat passent par la racine de l'agrégat, garantissant que les règles et les contraintes sont respectées.

Conception Stratégique dans le Domain-Driven Design

1. Contextes Délimités

Dans les grands systèmes, différentes parties de l'entreprise peuvent avoir des interprétations différentes du même concept. C'est là qu'interviennent les contextes délimités. Un contexte délimité est essentiellement la limite dans laquelle un modèle particulier s'applique. Par exemple, dans un contexte, Client pourrait désigner un client payant, tandis que dans un autre contexte, il pourrait désigner un utilisateur gratuit.

En définissant clairement ces limites, le DDD aide à éviter les ambiguïtés et à maintenir un modèle clair.

2. Cartographie des Contextes

Même si les contextes délimités sont indépendants, ils doivent souvent interagir. La cartographie des contextes définit les relations et les interactions entre différents contextes délimités. Vous pourriez avoir un « Contexte Délimité Client » qui interagit avec un « Contexte Délimité Facturation » par le biais d'interfaces spécifiques. Des stratégies de cartographie des contextes telles que Shared Kernel, Customer-Supplier et Conformist aident à structurer ces interactions de manière claire.

3. Sous-domaines

Comprendre le domaine métier est essentiel pour identifier le domaine principal, les sous-domaines de soutien et les sous-domaines génériques. Le domaine principal représente la zone qui différencie votre entreprise des autres. Les sous-domaines de soutien fournissent des fonctionnalités nécessaires mais non critiques pour l'entreprise, tandis que les sous-domaines génériques traitent des tâches communes telles que l'authentification ou le traitement des paiements.

Modèles Tactiques dans le Domain-Driven Design

1. Dépôts

Les dépôts offrent une abstraction pour persister et récupérer les agrégats. Ils masquent les détails de l'accès aux données de la couche de domaine et permettent au modèle de domaine de se concentrer uniquement sur la logique métier. Par exemple, un CustomerRepository pourrait fournir des méthodes comme findCustomerById() sans révéler si les données proviennent d'une base de données, d'une API ou d'une autre source.

2. Fabriques

La création d'objets complexes, en particulier d'agrégats, peut parfois impliquer une logique complexe. Les fabriques encapsulent cette logique de création, garantissant que les objets de domaine sont construits correctement. Elles peuvent être soit des méthodes statiques, soit des classes dédiées.

3. Services

Il arrive qu'une opération spécifique ne trouve pas naturellement sa place dans une entité ou un objet valeur. Dans ces cas, nous utilisons des services de domaine. Ces services encapsulent la logique métier qui implique plusieurs entités mais ne relève d'aucune entité spécifique. Par exemple, un PaymentService pourrait gérer des opérations comme le prélèvement d'un client, ce qui implique une entité client, des détails de paiement et des informations de commande.

Mise en Œuvre du Domain-Driven Design en PHP et Symfony

Si vous travaillez avec PHP et Symfony, le DDD s'intègre naturellement dans l'architecture. La structure modulaire de Symfony s'aligne bien avec les contextes délimités, et les dépôts peuvent être implémentés via la couche ORM de Doctrine. Voici quelques conseils sur la manière d'intégrer le DDD dans vos projets Symfony :

  • Utilisez des objets valeurs : Le composant de validation de Symfony fonctionne bien avec les objets valeurs. Au lieu de passer des types primitifs, utilisez des objets pour représenter des concepts de domaine tels que EmailAddress ou Price.

  • Racines d'agrégats avec Doctrine : Doctrine vous permet de mapper des agrégats et de les persister via des dépôts. Assurez-vous de n'exposer que la racine de votre agrégat pour les interactions en dehors de l'agrégat.

  • Contextes délimités via des bundles : Les bundles Symfony sont un moyen idéal de séparer les contextes délimités au sein d'une application plus vaste. Chaque bundle peut représenter une partie différente de votre domaine.

Défis de l'Adoption du Domain-Driven Design

Bien que le DDD offre des outils puissants pour créer des logiciels qui reflètent les besoins métier, il comporte également des défis :

  • Complexité : Le DDD nécessite une compréhension plus approfondie du domaine métier, et modéliser cela avec précision peut être chronophage.

  • Courbe d'apprentissage : Pour les équipes qui ne sont pas familières avec le DDD, il existe une courbe d'apprentissage, tant pour comprendre les concepts que pour les appliquer efficacement.

  • Systèmes hérités : La transition d'un système existant vers le DDD peut être difficile, en particulier si le système a été construit sans frontières claires ni séparation des préoccupations.

Chez SensioLabs, nous avons relevé ces défis et adopté le DDD avec succès. En structurant soigneusement nos projets en contextes délimités et en travaillant en étroite collaboration avec les experts métier, nous avons pu créer des logiciels évolutifs et maintenables qui reflètent véritablement les besoins métier de nos clients.

Conclusion

Le Domain-Driven Design est un outil puissant pour combler le fossé entre l'entreprise et le développement logiciel. En se concentrant sur le domaine, en créant un langage partagé et en utilisant des modèles tactiques et stratégiques, le DDD aide les équipes à construire des systèmes à la fois robustes et alignés sur les objectifs métier. Bien que l'approche puisse être complexe, les avantages à long terme en termes de frontières claires, de maintenabilité et d'alignement sur les objectifs métier en valent largement la peine.

En appliquant ces principes et tactiques, votre prochain projet pourrait bien devenir une success-story en DDD !

Voulez-vous appliquer DDD dans vos projets Symfony ?

Les experts Symfony et PHP de SensioLabs vous aident à créer un projet efficace en matière de structure et avec une analyse basée sur le domaine.

Cela pourrait aussi vous intéresser

PHP 8.5 URI extension
Oskar Stark

La nouvelle extension URI de PHP 8.5 : Une révolution pour l'analyse des URL

PHP 8.5 introduit une nouvelle extension URI puissante qui modernise la gestion des URL. Grâce au support des standards RFC 3986 et WHATWG, la nouvelle classe Uri fournit des objets immuables, des interfaces fluides et une validation appropriée, résolvant ainsi toutes les limites de la fonction historique parse_url(). Cet articl présente des exemples pratiques avant/après et explique quand utiliser chaque standard.

En savoir plus
Open in new tab
Silas Joisten

Le piège des onglets: pourquoi forcer l'ouverture de nouveaux onglets est une mauvaise pratique en UX

Nous l'avons tous fait — ajouter target="_blank" à un lien pour « aider les utilisateurs » à rester sur notre site. Mais ce qui semble être une commodité inoffensive crée souvent de la confusion, diminue l'accessibilité et introduit des risques de sécurité cachés.

En savoir plus
3 dog heads
Mathieu Santostefano

Venez avec votre propre client HTTP

Libérez-vous des dépendances rigides de vos SDK PHP. Dans cet article, apprenez à utiliser les normes PSR-7, PSR-17 et PSR-18, ainsi que la bibliothèque php-http/discovery, pour permettre à vos utilisateurs d'utiliser le client HTTP de leur choix, qu'il s'agisse de Guzzle, de Symfony HttpClient ou d'un autre. Un incontournable pour les développeurs PHP et Symfony.

En savoir plus
Blue sign on a building with several Now What? letters
Thibaut Chieux

Comment prioriser les messages lors du développement d'applications asynchrones avec Symfony Messenger

Le traitement asynchrone offre des avantages tels que la découplage des processus et des temps de réponse plus rapides, mais la gestion des priorités des messages peut s'avérer complexe. Pour traiter des tâches allant de la réinitialisation de mot de passe à des exports complexes, il est essentiel de garantir la livraison rapide des messages critiques. Cet article examine les problèmes fréquents liés au traitement asynchrone et propose des solutions avec Symfony Messenger pour optimiser votre application sans refonte majeure.

En savoir plus
Two images: on the left many cars stuck in a traffic jam with the sign "All directions" above, on the right a blue car moving forward alone on the highway with the sign "Service Subscriber" and a Symfony logo above
Steven Renaux

Les Lazy Services de Symfony : Boostez votre DX en utilisant les Service Subscribers

Optimisez la performance de votre application Symfony et l'expérience développeur ! Apprenez à utiliser les Service Subscribers et les attributs de chargement différé des services afin de réduire l'instanciation rapide, de simplifier les dépendances et de créer un code modulaire et maintenable.

En savoir plus
the surface of the earth seen from the space with city lights forming networks
Imen Ezzine

Les verbes HTTP : votre Guide Complet

Apprenez les bases des verbes HTTP : GET, POST, PUT, DELETE, et plus encore. Cet article vous explique leur fonctionnement, leurs utilisations et les conséquences en matière de sécurité.

En savoir plus
Toy factory production line
Silas Joisten

Boostez vos tests Symfony avec Zenstruck Foundry

Zenstruck Foundry a révolutionné notre manière d’écrire des tests dans Symfony. Dans cet article, vous apprendrez comment des fabriques expressives, des données de test isolées et une expérience développeur plus fluide nous ont permis d’optimiser nos flux de tests et d’améliorer la productivité.

En savoir plus
Domain Driven Design practical approach
Silas Joisten

Appliquer le Domain-Driven Design à PHP et Symfony : Un Guide Pratique

Le Domain-Driven Design (DDD) s'applique à Symfony grâce à des Value Objects, des dépôts et des contextes bornés. Dans cet article, découvrez les étapes concrètes pour construire des applications PHP évolutives.

En savoir plus
Photo speaker meetup AI Symfony
Jules Daunay

Symfony et l’IA : la vidéo de l’événement est disponible

Et si on parlait de Symfony et l’intelligence artificielle (IA) ? C’était le thème de l’événement exclusif organisé le 3 octobre dernier par SensioLabs en partenariat avec Codéin. Avec en prime un retour d’expérience d’un projet de développement combinant Symfony et l’IA. Si vous avez manqué l’événement, retrouvez la vidéo, aujourd’hui disponible en accès libre sur notre chaîne Youtube.

En savoir plus
Blue ElePHPant on a computer
Imen Ezzine

Optimisez Votre Code PHP : 8 Fonctions à Connaître pour Manipuler les Tableaux avec Efficacité

Devenir un excellent développeur PHP nécessite une maîtrise parfaite de la manipulation des tableaux. Ces structures sont incontournables en PHP, que ce soit pour stocker temporairement des données, les organiser ou les traiter avant leur enregistrement dans une base de données. En maîtrisant leur fonctionnement, vous serez en mesure de gérer et de manipuler vos informations de manière plus efficace et optimisée.

En savoir plus
Grey Cargo Plane with a Blue Sky
Rémi Brière

L'Agilité en entreprise - 1. Le Culte du Cargo

L'agilité ne se résume pas à des rituels et à des outils. Dans ce premier article de notre série Scrum, nous explorons le phénomène du culte du cargo et la manière dont l'imitation aveugle peut entraver la véritable transformation Agile.

En savoir plus
SemVer vs. CalVer
Silas Joisten

SemVer vs. CalVer : Quelle stratégie de versioning choisir ?

SemVer garantit la stabilité des bibliothèques, tandis que CalVer synchronise les projets avec les cycles de publication. Découvrez les principales différences et les meilleurs cas d’utilisation pour optimiser votre stratégie de versioning.

En savoir plus
ibexa
Elise Hamimi

SensioLabs et Symfony à Majorque pour la conférence d’Ibexa 2024

La semaine dernière, les équipes de SensioLabs & Symfony étaient à Palma de Majorque lors de l’Ibexa Global Partner Conference pour 2 jours de conférence.

En savoir plus
Crowd raising hands in the main auditorium at SymfonyCon Brussels 2023
Elise Hamimi

Direction Bruxelles pour notre récap de la SymfonyCon 2023

Les 7 et 8 décembre derniers, nous étions à Bruxelles pour la tant attendue SymfonyCon Brussels 2023. Cette année, la fantastique communauté internationale de Symfony s’est réunie dans la capitale Belge pour une nouvelle conférence remplie de talks inspirants et de deux jours de fun. Revivez-la avec nous!

En savoir plus
Interview Symfony 7 with Nicolas Grekas and a radio mic illustration on a clear background
Jules Daunay

L’essentiel sur Symfony 7 avec Nicolas Grekas

Symfony 7 sort aujourd’hui. Comme à chaque nouvelle version majeure de Symfony, SensioLabs a eu la chance d’interviewer en exclusivité Nicolas Grekas, l’un des principaux contributeurs de la Core Team de Symfony. Découvrez au fil de l’interview les principales nouveautés techniques de Symfony 7 et les informations à connaître pour vous préparer à Symfony 7.

En savoir plus
Image