Le Domain Driven Design Une conception pilotée par le domaine pour l’entreprise  Page     Sami Jaber (webmaster du site D...
Le Symposium DNG <ul><li>4 ème édition, plus de 2000 inscriptions  </li></ul><ul><ul><li>Présence de Bill Gates en 2005 </...
Pourquoi encore parler d’architecture en 2008 ? <ul><li>De nouveaux Frameworks/API apportent une abstraction supplémentair...
Evans, Eric.  Domain-Driven Design: Tackling Complexity in the Heart of Software.  Addison-Wesley Professional, 2004.
Avram, Abel et Marinescu, Floyd.  Domain-Driven Design Quickly.  Disponible gratuitement :  http://www.infoq.com/minibooks...
Page     L’architecture n-tiers traditionnelle Couche d’accès aux données Couche  d’objets du domaine L’architecture n-ti...
Exemple de service « traditionnel »  <ul><li>namespace  MyApplication.Services </li></ul><ul><li>{ </li></ul><ul><li>[Serv...
…  et le domaine  <ul><li>namespace  MyApplication.Domain </li></ul><ul><li>{ </li></ul><ul><li>public   class  Account </...
Avantages / Inconvénients <ul><li>Le métier est essentiellement basé sur les services </li></ul><ul><li>Inconvénients : </...
Page     L’architecture n-tiers traditionnelle Couche Infrastructure Couche applicative L’architecture DDD Couche du doma...
Page  L’ubiquitous Language et DSL Exemple Account Holder withdraws cash  I want to  withdraw   cash  from an  ATM   I can...
Domain Driven Development <ul><li>Multi-couches </li></ul><ul><ul><li>Couche de présentation </li></ul></ul><ul><ul><li>Co...
Les Mots-clé de l’univers DDD <ul><li>Focalisé sur le domaine </li></ul><ul><li>Un langage unifié </li></ul><ul><li>Une ar...
Les agrégats <ul><li>Plusieurs préceptes connus volent en éclat </li></ul><ul><ul><li>One to many, many to many, trop comp...
Exemple d’agrégat Page     <ul><li>Fonctionnel : une facture est associée à un client </li></ul><ul><ul><li>Un client pos...
Les Factories <ul><li>La création d’un objet est parfois complexe, spécialement pour les agrégats </li></ul><ul><ul><li>Ut...
Et la couche de services ? <ul><li>Certains concepts ne sont pas naturel à un domaine en particulier, exemple : </li></ul>...
Les Value Objects <ul><li>Utilisés lorsqu’il est important de maîtriser le contenu d’un objet et non son identité </li></u...
Les repositories Page     <ul><li>Le DDD comme toute philosophie multi-couches ne couple pas l’infrastructure technique a...
Exemple avec Linq <ul><li>public interface  IOrderRepository  :  IRepository<Order> </li></ul><ul><li>{ </li></ul><ul><li>...
Les DSL à la rescousse  (exemple réalisé avec Boo) <ul><li>Les DSL peuvent apporter énormément sur la partie « statique » ...
La big picture DDD Page  
DDD, l’architecture idéale ? <ul><li>Non. Le design idéal n’existe pas.  </li></ul><ul><li>La force et le principal défaut...
La couche de présentation Un des enjeux majeurs de demain
La couche de présentation coûte cher <ul><li>On estime en moyenne que la répartition budget/couches pour une application d...
La couche de présentation coûte cher <ul><li>Et pourtant, de nombreux progrès ont été réalisés sur la partie designer :  <...
Le trio gagnant <ul><li>Data Binding + Validation + Converter </li></ul>Page     <ul><li>80% du code induit par la couche...
Le binding <ul><li>Le Binding peut être Uni ou  Bi-directionnel </li></ul><ul><ul><li>Le bidirectionnel améliore la mainte...
La validation et la conversion <ul><li>La validation est opérée dès lors qu’une valeur convertie dans son format destinati...
Ce type d’architecture existe-t-elle ? <ul><li>Certaines parties existent déjà en tant que telles dans : </li></ul><ul><ul...
Conclusion <ul><li>Le développement pilotée par le domaine ou centré sur le domaine est en plein essor </li></ul><ul><li>D...
Annexes Page  
Sites et liens … <ul><li>Validation Application Block  (Patterns & Practices)  http://blogs.msdn.com/tomholl/archive/2006/...
Prochain SlideShare
Chargement dans…5
×

Introduction au Domain Driven Design

11 374 vues

Publié le

Introduction au Domain Driven Design

Publié dans : Business

Introduction au Domain Driven Design

  1. 1. Le Domain Driven Design Une conception pilotée par le domaine pour l’entreprise Page  Sami Jaber (webmaster du site DotNetGuru.org et fondateur de DNG-Consulting)
  2. 2. Le Symposium DNG <ul><li>4 ème édition, plus de 2000 inscriptions </li></ul><ul><ul><li>Présence de Bill Gates en 2005 </li></ul></ul><ul><ul><li>Erik Meijer en 2008 </li></ul></ul><ul><li>Partenariat de longue date avec Microsoft (avec d’abord Marc Gardette et aujourd’hui François Merand) </li></ul><ul><li>Objectifs </li></ul><ul><ul><li>Développer des sujets d’entreprise </li></ul></ul><ul><ul><li>Anticiper les évolutions des architectures de demain </li></ul></ul><ul><ul><li>Prendre du recul sur le marketing des éditeurs </li></ul></ul><ul><li>Le Symposium a contribué à : </li></ul><ul><ul><li>Démocratiser les architectures en couches </li></ul></ul><ul><ul><li>Faire connaître le mapping O/R, l’AOP, SOA, les pratiques agiles… </li></ul></ul>
  3. 3. Pourquoi encore parler d’architecture en 2008 ? <ul><li>De nouveaux Frameworks/API apportent une abstraction supplémentaire </li></ul><ul><ul><li>Linq est une révolution « architecturale » qui produit de manière native une abstraction de la couche d’accès aux données (Linq2SQL, Linq2Entities, Linq2XML, etc …) </li></ul></ul><ul><li>Mais d’autres techniques aussi </li></ul><ul><ul><li>Les générateurs dynamique de codes (DynamicProxies, IL, …) </li></ul></ul><ul><ul><li>L’injection de dépendance </li></ul></ul><ul><ul><li>L’AOP </li></ul></ul>Page  Les outils évoluent, le Design aussi Modifie la manière de penser n-tiers
  4. 4. Evans, Eric. Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley Professional, 2004.
  5. 5. Avram, Abel et Marinescu, Floyd. Domain-Driven Design Quickly. Disponible gratuitement : http://www.infoq.com/minibooks/domain-driven-design-quickly .
  6. 6. Page  L’architecture n-tiers traditionnelle Couche d’accès aux données Couche d’objets du domaine L’architecture n-tiers « traditionnelle » Couche de service Présentation Partenaire Base de données Base de données BLL DAL Collections (…) XSL Données WebServices Domaine WebForms WinForms ASP.NET (…) Enterprise Services WebServices Remoting Threading Reflection Serialization Reflection XML ADO.NET Services
  7. 7. Exemple de service « traditionnel » <ul><li>namespace MyApplication.Services </li></ul><ul><li>{ </li></ul><ul><li>[ServiceContract] </li></ul><ul><li>public interface IAccountService </li></ul><ul><li>{ </li></ul><ul><li>[OperationContract] </li></ul><ul><li>public void Credit( Account account, double amount); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>Page  public class AccountService { [OperationBehavior(TransactionRequired=true)] public void Credit( Account account, double amount) { 1) Vérification autorisation 2) Récupérer DAL et réaliser opération 3) commiter } } } Avec l’émergence des Framework type Linq, l’intérêt d’une couche DAL est de plus en plus discutable
  8. 8. … et le domaine <ul><li>namespace MyApplication.Domain </li></ul><ul><li>{ </li></ul><ul><li>public class Account </li></ul><ul><li>{ </li></ul><ul><li>public Client Client { </li></ul><ul><li>get { return this.client; } </li></ul><ul><li>set {this.client = value ;} </li></ul><ul><li>} </li></ul><ul><li>public List EcrituresComptable {} … </li></ul><ul><li>} </li></ul>public class EcritureComptable { public DateTime DateEcriture { get { return this.dateEcriture; } set {this.dateEcriture = value ;} public int MontantEcriture{} } } De simples structures ? Syndrome du modèle anémique
  9. 9. Avantages / Inconvénients <ul><li>Le métier est essentiellement basé sur les services </li></ul><ul><li>Inconvénients : </li></ul><ul><ul><li>Duplication et copier/coller dans les couches de services </li></ul></ul><ul><ul><li>Difficile parfois de mettre en place des tests unitaires </li></ul></ul><ul><ul><li>Le code des services est finalement très procédural, peu objet </li></ul></ul><ul><ul><li>La couche de service est polluée par l’infrastructure (accès aux DAO, requêtes Linq, etc ..) </li></ul></ul><ul><li>Avantages : </li></ul><ul><ul><li>Simple à mettre en oeuvre, mature et respecte les dépendances binaires inter-couches (aucune assembly technique à déployer côté client) </li></ul></ul>
  10. 10. Page  L’architecture n-tiers traditionnelle Couche Infrastructure Couche applicative L’architecture DDD Couche du domaine Base de données Base de données Collections (…) XSL Repositories Présentation Partenaire Domaine WebForms WinForms ASP.NET (…) Enterprise Services WebServices Remoting Threading Reflection Serialization Reflection XML ADO.NET Factories Services
  11. 11. Page L’ubiquitous Language et DSL Exemple Account Holder withdraws cash I want to withdraw cash from an ATM I can get money when the bank is closed Scenario 1 : Account has sufficient funds Given the account balance is $100 And the card is valid And the machine contains enough money When the Account Holder requests $20 Then the ATM should dispense $20 And the account balance should be $80 And the card should be returned Scenario 2 : Account has insufficient funds Given the account balance is $10 And the card is valid And the machine contains enough money When the Account Holder requests $20 The ATM should not dispense any money <ul><li>L’ubiquitous language est à la base du DDD </li></ul><ul><ul><li>C’est un language pseudo-technique compréhensible par la MOA et les développeurs </li></ul></ul><ul><ul><li>Les verbes sont les méthodes, les sujets sont les objets </li></ul></ul><ul><ul><li>Tout changement dans l’UL induit un changement dans le modèle </li></ul></ul><ul><li>La démarche DDD est pilotée par </li></ul><ul><ul><li>Les tests (TDD) </li></ul></ul><ul><ul><li>Le refactoring </li></ul></ul>
  12. 12. Domain Driven Development <ul><li>Multi-couches </li></ul><ul><ul><li>Couche de présentation </li></ul></ul><ul><ul><li>Couche Application (appelée aussi couche de services) </li></ul></ul><ul><ul><ul><li>Aucune logique métier </li></ul></ul></ul><ul><ul><ul><li>Ne porte pas l’état des objets du domaine </li></ul></ul></ul><ul><ul><ul><li>Porte l’état d’une tâche applicative </li></ul></ul></ul><ul><ul><li>La couche du domaine </li></ul></ul><ul><ul><ul><li>Contient toute l’information du domaine </li></ul></ul></ul><ul><ul><ul><li>L’état du domaine est ici </li></ul></ul></ul><ul><ul><li>La couche d’infrastructure </li></ul></ul><ul><ul><ul><li>Assure la communication entre les couches </li></ul></ul></ul><ul><ul><ul><li>Assure la persistence des objets métier </li></ul></ul></ul><ul><ul><ul><li>Contient les librairies ou Framework externes </li></ul></ul></ul>
  13. 13. Les Mots-clé de l’univers DDD <ul><li>Focalisé sur le domaine </li></ul><ul><li>Un langage unifié </li></ul><ul><li>Une architecture multi-couches </li></ul><ul><li>Entités et Value object </li></ul><ul><li>Services </li></ul><ul><li>Les modules </li></ul><ul><li>Agrégats (Aggregates) </li></ul><ul><li>Factories </li></ul><ul><li>Repositories </li></ul>
  14. 14. Les agrégats <ul><li>Plusieurs préceptes connus volent en éclat </li></ul><ul><ul><li>One to many, many to many, trop complexe ! </li></ul></ul><ul><ul><li>Supprimer les relations inutiles, trop de relations tuent la relation </li></ul></ul><ul><ul><li>Réduire les multiplicités et direction (éviter le bidirectionnel) </li></ul></ul><ul><ul><li>Laisser la base de données gérer les opérations de Cascade et update/delete </li></ul></ul><ul><li>Utiliser les agrégats ( aka aggregate) </li></ul><ul><ul><li>Assure la gestion des relations entre objets </li></ul></ul><ul><ul><li>Un agrégat possède une entité comme élément racine </li></ul></ul><ul><ul><li>Seule la racine peut être obtenue à partir des requêtes objets </li></ul></ul><ul><ul><li>L’entité est responsable de maintenir les invariants (règles non liées à la modification de données) </li></ul></ul>
  15. 15. Exemple d’agrégat Page  <ul><li>Fonctionnel : une facture est associée à un client </li></ul><ul><ul><li>Un client possède une adresse </li></ul></ul><ul><ul><li>Une facture contient des lignes, associées à un produit </li></ul></ul>Racines
  16. 16. Les Factories <ul><li>La création d’un objet est parfois complexe, spécialement pour les agrégats </li></ul><ul><ul><li>Utiliser des factories </li></ul></ul><ul><ul><li>Créer la racine de l’agrégat et l’ensemble des objets qui le contiennent </li></ul></ul><ul><ul><li>Création atomique </li></ul></ul><ul><ul><li>Attention à veiller à ne pas violer l’encapsulation </li></ul></ul><ul><li>Possibilité d’utiliser l’ordre New() dans certains cas : </li></ul><ul><ul><li>Bénéfices : </li></ul></ul><ul><ul><ul><li>Simplicité </li></ul></ul></ul><ul><ul><ul><li>Tous les attributs peuvent être passés au constructeur </li></ul></ul></ul><ul><ul><ul><li>Aucun besoin de changer d’implémentation </li></ul></ul></ul>
  17. 17. Et la couche de services ? <ul><li>Certains concepts ne sont pas naturel à un domaine en particulier, exemple : </li></ul><ul><ul><li>Exporter au format CSV le contenu d’une facture </li></ul></ul><ul><ul><li>Accéder à plusieurs comptes pour réaliser un transfert de fond </li></ul></ul><ul><li>Tout ce qui n’est pas de l’ordre d’un traitement lié à un objet du domaine ou à un traitement lié à l’infrastructure </li></ul><ul><li>La couche du domaine s’appuie sur les services (l’inverse est aussi possible) </li></ul>Page 
  18. 18. Les Value Objects <ul><li>Utilisés lorsqu’il est important de maîtriser le contenu d’un objet et non son identité </li></ul><ul><li>Quand écrire un VO ? </li></ul><ul><ul><li>Lorsque le VO n’est pas une Entity ! </li></ul></ul><ul><ul><li>Encore mieux si le VO est immuable (son contenu n’évolue pas) </li></ul></ul><ul><ul><li>Pour les performances </li></ul></ul><ul><ul><li>Pour l’intégrité des données (pas de risque de modification par erreur) </li></ul></ul><ul><ul><li>Si les VO sont partageables, ils doivent être immuables </li></ul></ul><ul><ul><li>Garder les VO “petits” et simples </li></ul></ul><ul><ul><li>Un VO peut contenir des références vers d’autres VO ou des entités </li></ul></ul>
  19. 19. Les repositories Page  <ul><li>Le DDD comme toute philosophie multi-couches ne couple pas l’infrastructure technique au modèle du domaine </li></ul><ul><li>Le repository encapsule la logique permettant d’obtenir des références d’objets </li></ul><ul><ul><li>Les méthodes doivent rester simples (généralement des recherches) </li></ul></ul><ul><li>Une factory crée, un repository recherche. </li></ul><ul><li>« A factory is pure domain, a repository communicates with the infrastructure » (E. Evans) </li></ul>
  20. 20. Exemple avec Linq <ul><li>public interface IOrderRepository : IRepository<Order> </li></ul><ul><li>{ </li></ul><ul><li>Order FindWithId (string orderId ); </li></ul><ul><li>ICollection<Order> FindAllOrders(); </li></ul><ul><li>ICollection<Order> FindAllValidOrders(); </li></ul><ul><li>bool IsUniqueOrder( string orderId); </li></ul><ul><li>bool IsValidOrder( string orderId); </li></ul><ul><li>} </li></ul>public class OrderRepositoryImpl : IOrderRepository { ICollection FindAllValidOrders (string orderId ); ICollection<Order> orders = Repository<Order> .FindAll(Where.Order.Id == orderId && Where.Order.Status == OrderStatus.ReadyToShip && Where.Order.Date >= DateTime.Today); return orders; }
  21. 21. Les DSL à la rescousse (exemple réalisé avec Boo) <ul><li>Les DSL peuvent apporter énormément sur la partie « statique » du modèle architectural </li></ul><ul><li>La partie dynamique reste complexe à modéliser sans recourir au code </li></ul>Page 
  22. 22. La big picture DDD Page 
  23. 23. DDD, l’architecture idéale ? <ul><li>Non. Le design idéal n’existe pas. </li></ul><ul><li>La force et le principal défaut du DDD est de s’appuyer sur le libre choix du concepteur </li></ul><ul><ul><li>On hésite souvent entre couche de service et couche du domaine </li></ul></ul><ul><ul><li>Le lien entre couche du domaine et Repository (persistence) prête à discussion </li></ul></ul><ul><ul><li>Patterns possédant les même défauts que ceux d’Active Record </li></ul></ul><ul><ul><ul><li>granularité fine des services entraîne une granularité fine des requêtes SQL). Problème de N+1 (performances) </li></ul></ul></ul><ul><li>Mais la formalisation du fonctionnel par le domaine est un concept en devenir, encore peu exploité par les architecture n-tiers traditionnelles </li></ul>Page 
  24. 24. La couche de présentation Un des enjeux majeurs de demain
  25. 25. La couche de présentation coûte cher <ul><li>On estime en moyenne que la répartition budget/couches pour une application de gestion classique coûte : </li></ul><ul><ul><li>Couche d’accès aux données : 30 à 50 % </li></ul></ul><ul><ul><li>Couche de services (règles de gestion) : 30 à 50 % </li></ul></ul><ul><ul><li>Couche de présentation : 30 à 50 % </li></ul></ul><ul><li>Les fourchettes s’expliquent par le type d’outils employées (générateurs de code DAL, O/R Mapping, générateur d’écrans, etc …) </li></ul><ul><li>Ces dernières années, énormément de progrès ont été fait pour augmenter la productivité de la couche d’accès aux données et la couche de service </li></ul><ul><li>Mais la couche de présentation reste à la traîne ! </li></ul>
  26. 26. La couche de présentation coûte cher <ul><li>Et pourtant, de nombreux progrès ont été réalisés sur la partie designer : </li></ul><ul><ul><li>Les éditeurs WYSIWYG (WPF Designer, WinForms Designer, ASP.NET Designer) </li></ul></ul><ul><ul><li>Des Framework de composants plus riches (vectoriels, …) </li></ul></ul><ul><li>Pourquoi une telle différence ? </li></ul><ul><ul><li>Encore trop de code pour réaliser le lien entre les interfaces graphiques et les objets du domaine </li></ul></ul><ul><ul><li>Historiquement, .NET a toujours privilégié le lien interfaces graphiques vers bases de données (DataSet, DataAdapter, …) </li></ul></ul><ul><li>Le Binding avec les objets est en plein essor </li></ul><ul><ul><ul><li>WPF et Adobe Flex sont les plus avancés dans ce domaine </li></ul></ul></ul>
  27. 27. Le trio gagnant <ul><li>Data Binding + Validation + Converter </li></ul>Page  <ul><li>80% du code induit par la couche de présentation relève de : </li></ul><ul><ul><li>la validation des champs de surface (les contrôles référentiels et d’intégrité sont dans la couche de services) </li></ul></ul><ul><ul><li>la conversion des formats (date, intervalles, textes spécifiques, …) </li></ul></ul><ul><ul><li>la gestion des messages d’erreurs </li></ul></ul>
  28. 28. Le binding <ul><li>Le Binding peut être Uni ou Bi-directionnel </li></ul><ul><ul><li>Le bidirectionnel améliore la maintenabilité du code </li></ul></ul>Page  Bindé sur le détail d’une Facture Propriété : Id Facture Ligne Ligne
  29. 29. La validation et la conversion <ul><li>La validation est opérée dès lors qu’une valeur convertie dans son format destination est considérée correcte </li></ul><ul><li>Il suffit d’annoter avec des custom Attributes le modèle du domaine pour disposer d’une puissance redoutable en terme de productivité </li></ul>
  30. 30. Ce type d’architecture existe-t-elle ? <ul><li>Certaines parties existent déjà en tant que telles dans : </li></ul><ul><ul><li>WPF (Windows Presentation Foundation) </li></ul></ul><ul><ul><li>Adobe Flex </li></ul></ul><ul><ul><li>Windows Forms et Java Swing (Norme Beans Binding) avec un support moindre de l’autobinding (la possibilité de placer des Binding Path sur des widgets) </li></ul></ul><ul><li>Les Framework Web sont plutôt à la traîne même s’ils intègrent tous des Framework de validation ou de binding (ASP.NET) </li></ul><ul><ul><li>L’apport d’AJAX permet de simuler des sortes de Master/Detail réactifs </li></ul></ul><ul><li>Le développement d’un (mini) Framework est nécessaire </li></ul>
  31. 31. Conclusion <ul><li>Le développement pilotée par le domaine ou centré sur le domaine est en plein essor </li></ul><ul><li>Dans l’univers .NET les outils sont prêts pour intégrer ce mode de développement </li></ul><ul><ul><li>WCF pour la partie services techniques (transaction, sécurité, montée en charge) </li></ul></ul><ul><ul><li>Linq pour l’accès aux données </li></ul></ul><ul><ul><li>WPF et WinForms pour l’autobinding </li></ul></ul><ul><li>Jamais la productivité du développeur n’aura été autant au centre des préoccupations des éditeurs </li></ul><ul><li>Après le quick & dirty, voici venu le temps du clean RAD </li></ul>Page 
  32. 32. Annexes Page 
  33. 33. Sites et liens … <ul><li>Validation Application Block (Patterns & Practices) http://blogs.msdn.com/tomholl/archive/2006/11/27/validation-application-block-revealed.aspx </li></ul><ul><li>Microsoft Data Access blog http://blogs.msdn.com/adonet </li></ul><ul><li>Domain Driven Design http://www.domaindrivendesign.org/ </li></ul><ul><li>DotNetGuru.org (actualité, articles techniques, etc …) http://www.dotnetguru.org </li></ul><ul><li>DDD avec .NET (Livre Applying Domain-Driven Design) Jimmy Nilsson </li></ul>Page 

×