DDD – Modèle de persistance et modèle de domaine

J’essaie d’apprendre la conception pilotée par le domaine (DDD) et je pense avoir eu l’idée de base. Mais il y a quelque chose qui m’embrouille.

Dans DDD, le modèle de persistance et le modèle de domaine sont-ils différents? Je veux dire, nous concevons notre domaine et nos classes avec seulement des préoccupations de domaine en tête; c’est bon. Mais après cela, lorsque nous construisons nos référentiels ou tout autre système de persistance de données, devrions-nous créer une autre représentation de notre modèle à utiliser dans la couche de persistance?

Je pensais que notre modèle de domaine est également utilisé dans la persistance, ce qui signifie que nos repositorys renvoient nos objects de domaine à partir de requêtes. Mais aujourd’hui, j’ai lu cet article et je suis un peu confus:

Arrêtez ça! Le modèle de domaine n’est pas le modèle de persistance

Si cela est vrai, quel serait l’avantage d’avoir des objects de persistance séparés des objects de domaine?

    Pensez-y de cette façon, le modèle de domaine ne doit dépendre de rien et ne contient aucun code d’infrastructure. Le modèle de domaine ne doit pas être sérialisable ni hériter de certains objects ORM ou même les partager. Ce sont toutes des préoccupations d’infrastructure et doivent être définies séparément du modèle de domaine.

    Mais, si vous recherchez une solution DDD pure et que votre projet valorise l’évolutivité et les performances par rapport à la rapidité du développement initial. Souvent, le fait de mélanger les problèmes d’infrastructure avec votre «modèle de domaine» peut vous aider à réaliser de grands progrès en termes de vitesse au désortingment de l’évolutivité. Le point est, vous devez vous demander, “Les avantages de la DDD pure valent-ils le coût dans la vitesse de développement?”. Si votre réponse est oui, alors voici la réponse à votre question.

    Commençons par un exemple où votre application commence par un modèle de domaine et il se trouve que les tables de la firebase database correspondent exactement à votre modèle de domaine. Désormais, votre application se développe à pas de géant et vous commencez à rencontrer des problèmes de performances lorsque vous interrogez la firebase database. Vous avez appliqué quelques index bien pensés, mais vos tables augmentent si rapidement qu’il semble que vous ayez besoin de dé-normaliser votre firebase database juste pour vous tenir au courant. Donc, avec l’aide d’un dba, vous créez une nouvelle conception de firebase database qui répondra à vos besoins en performances, mais maintenant les tables sont très différentes de la manière dont elles étaient auparavant. que ce soit une table pour chaque entité.

    Ceci n’est qu’un exemple, mais il montre pourquoi votre modèle de domaine doit être distinct de votre modèle de persistance. Dans cet exemple, vous ne souhaitez pas séparer les classes de votre modèle de domaine pour correspondre aux modifications apscopes à la conception du modèle de persistance et modifier essentiellement la signification de votre modèle de domaine. Au lieu de cela, vous souhaitez modifier le mappage entre votre nouveau modèle de persistance et le modèle de domaine.

    Il y a plusieurs avantages à séparer ces conceptions, tels que l’évolutivité, les performances et le temps de réaction aux modifications de la firebase database d’urgence, mais vous devez les comparer au coût et à la rapidité du développement initial. Généralement, les projets qui bénéficieront le plus de ce niveau de séparation sont les applications d’entreprise à grande échelle.

    Mise à jour des commentaires

    Dans le monde du développement de logiciels, il existe Nième nombre de solutions possibles. De ce fait, il existe une relation inverse indirecte entre la flexibilité et la vitesse initiale de développement. Comme exemple simple, je pourrais coder de la logique dans une classe ou écrire une classe permettant d’y introduire des règles de logique dynamic. La première option aurait une vitesse de développement plus rapide, mais au prix d’un degré de flexibilité moindre. Cette dernière option aurait un degré de flexibilité plus élevé, mais au désortingment d’un ralentissement du développement. Cela est vrai dans tous les langages de codage car il existe toujours le Nième nombre de solutions possibles.

    De nombreux outils sont disponibles pour vous aider à augmenter votre vitesse de développement et votre flexibilité. Par exemple, un outil ORM peut accélérer le développement de votre code d’access à la firebase database tout en vous offrant la possibilité de choisir les implémentations de firebase database spécifiques sockets en charge par ORM. De votre sharepoint vue, il s’agit d’un gain net en temps et en flexibilité moins le coût de l’outil (dont certains sont gratuits) qui peut ou non en valoir la peine en fonction du coût du développement par rapport à la valeur du besoin commercial.

    Mais, pour cette conversation sur les styles de codage, qui est essentiellement celle de Domain Driven Design, vous devez tenir compte du temps nécessaire pour écrire cet outil. Si vous deviez écrire cet outil ORM ou même écrire votre logique d’access à la firebase database de manière à prendre en charge toutes les implémentations que cet outil vous offre, cela prendrait beaucoup plus de temps que de coder en dur l’implémentation spécifique que vous prévoyez. sur l’utilisation.

    En résumé, les outils peuvent vous aider à compenser votre temps de production et le prix de la flexibilité, souvent en répartissant le coût de cette période entre tous ceux qui achètent l’outil. Cependant, tout code incluant le code qui utilise un outil restra affecté par la relation vitesse / flexibilité. De cette manière, la conception orientée domaine permet une plus grande flexibilité que si vous étiez tous les deux liés par votre logique métier, l’access aux bases de données, l’access aux services et le code de l’interface utilisateur, mais au désortingment du temps de production. Domain Driven Design est plus efficace que les petites applications pour les applications de niveau entreprise, car les applications de niveau entreprise ont généralement un coût de développement initial plus élevé par rapport à la valeur métier et sont plus complexes et nécessitent une plus grande flexibilité. coût réduit dans le temps.

    Dans DDD, le modèle de persistance et le modèle de domaine sont-ils différents?

    Oui, mais cela n’implique pas nécessairement un ensemble de classes différent pour représenter explicitement le modèle de persistance.

    Si vous utilisez une firebase database relationnelle pour la persistance, un ORM tel que NHibernate peut prendre en charge la représentation du modèle de persistance via des mappages vers des classes de domaine. Dans ce cas, il n’y a pas de classes de modèles de persistance explicites. Le succès de cette approche dépend des capacités de cartographie de l’ORM. NHibernate, par exemple, peut prendre en charge une classe de mappage intermédiaire via des mappages de composants . Cela permet d’utiliser une classe de modèle de persistance explicite en cas de besoin.

    Si vous utilisez une firebase database de documents pour la persistance, vous avez généralement besoin d’un modèle de persistance, car le modèle de domaine doit uniquement être sérialisable pour pouvoir être conservé.

    Par conséquent, utilisez une classe de modèle de persistance explicite lorsqu’il existe un mappage complexe qui ne peut pas être atteint avec les mappages ORM au modèle de domaine. La différence entre le modèle de domaine et le modèle de persistance demeure quelle que soit l’implémentation.

    Dans DDD, le modèle de persistance et le modèle de domaine sont-ils différents?

    Dans DDD, vous avez le modèle de domaine et le référentiel . C’est tout. Si à l’intérieur du référentiel vous allez conserver votre modèle de domaine directement ou le convertir en un modèle de persistance avant de le persister, c’est à vous de décider! C’est une question de design, de design.

    Comme d’autres ont indiqué que chaque option a ses avantages et ses inconvénients. Jetez un oeil à cette réponse où je détaille certains d’entre eux.