Domain model, séparation des couches: le grand mélange
Par Jean-Baptiste le lundi 14 janvier 2008, 09:53 - Code - Lien permanent
NOTE DU 30/01/2009: Je vois que vous êtes assez nombreux à faire une recherche sur domain model sur google et à tomber sur mon blog. Si vous cherchez des informations sur le sujet, nous créons doucement avec des amis ddd france. Nous comptons beaucoup sur la participation de la communauté pour le faire avancer, donc n'hésitez pas à laisser une trace.
Je vous laisse maintenant lire le billet original.
Bon ce message va sans doute faire partie de la grande série "je me crois assez fort pour corriger la terre entière"; mais je sais mes lecteurs très tolérant vis à vis de mon égo démesuré
De quoi vais-je causer? Et bien tout est dans le titre pratiquement. Domain model et séparation des couches, sont des termes très à la mode que l'on rencontre de nos jours aux quatre coins du web.
Je devrais être heureux, mais je remarque souvent qu'ils ont l'air bien mal employé.
Je vous laisse maintenant lire le billet original.
Bon ce message va sans doute faire partie de la grande série "je me crois assez fort pour corriger la terre entière"; mais je sais mes lecteurs très tolérant vis à vis de mon égo démesuré
De quoi vais-je causer? Et bien tout est dans le titre pratiquement. Domain model et séparation des couches, sont des termes très à la mode que l'on rencontre de nos jours aux quatre coins du web.
Je devrais être heureux, mais je remarque souvent qu'ils ont l'air bien mal employé.
Quant on parle de Domain model, bien souvent c'est tout de même en rapport avec la notion d'architecture en couche, avec séparation du métier dans une couche à part. Soit, mais le "pattern" domain model est à la fois beaucoup plus et beaucoup moins.
Un discoure que je vois souvent revenir est de dire que les objets métiers doivent être très bêtes, en n'ayant pratiquement que des accesseurs sur les attributs, et que la couche métier elle, prenait ces objets en entrée. Une couche d'accès aux données les prend pour les faire persister. Finalement ces objets deviennent de bêtes structures de liaison entre une couche métier et une couche d'accès aux données. .
Cette approche est très procédurale, et ne tire finalement en rien partie de la richesse de l'objet, à savoir réunir données et comportement au même endroit. Le pire pourtant, c'est que vu de loin, une telle architecture parait propre puisque le métier est détaché de la persistence. On me répond du coup que c'est nécessaire dans les gros système pour pouvoir exposer des services. Les services peuvent avoir leur utilité, mais ils doivent rester bête et s'appuyer sur un domaine riche de sens. Ils peuvent recevoir et émettre des DTO soit, mais ce n'est pas une raison pour centrer toute notre application autour d'eux. Parce que finalement, un objet qui n'a que des données et pas de comportement, c'est un DTO. Ceux qui les utilisent à outrance ont du oublier la signification du T de DTO: data TRANSFER object. Ils servent à transmettre nos objets d'un système à un autre, mais à l'intérieur même du système, ils n'ont aucun sens.
Fowler pour décrire ce phénomène parle "d'Anemic Domain Model"
Le tout est finalement est de bien imaginer ce qu'est un modèle du domaine. Ce n'est pas une sorte de pool de DTO dans lesquels on peut piocher en fonction de ce qu'on veut faire persister ou transmettre, mais c'est une forme de réalité. Un objet vit dans le domaine du moment que l'on fait un new, et il y restera jusqu'à qu'on fasse appel à un delete sur sa repository. Entre temps, le fait qu'il soit déshydraté et réhydraté depuis une base est purement technique et secondaire. Le modèle est une sorte de réalité vivante riche de sens où les objets interagissent entre eux, vivent, se modifient. Pour des raisons purement technique, nous synchronisons de temps temps l'état dans une base, mais dans un monde utopique, le model pourrait vivre en mémoire éternellement. Toute la philosophie d'un mapper O/R justement est de réussir cette synchronisation, en convertissant des concepts objets en concepts relationnels. J'ai tendance à penser que toute autre utilisation est finalement un détournement de la philosophie d'origine d'un mapper. C'est non seulement un détournement, mais en plus de la complexité pour rien. Un model du style "une classe une table" ne nécessite en rien un mapper dont tout l'intérêt réside justement dans sa capacité à nous permettre d'utiliser la puissance de l'objet tout en le faisant persister en base. Pour être plus précis, je devrais parler de MetaData mapping, qui consiste donc à décrire ailleurs que dans la classe comment la faire persister. C'est ce que font notamment les fichiers mapping d'hibernate (et du coup, utiliser hibernate sans utiliser les fichiers mapping est également dans la majorité des cas une mauvaise compréhension de l'intérêt de l'outil).
La séparation en couche ne suffit pas, pour pouvoir réellement écrire un tel modèle, il faut qu'il soit ignorant de sa persistance, qu'il y ait le moins d'intrusions possible du monde extérieure. Pourtant nombre de framework que ce soit de mapping O/R, d'IoC, MVC sont très intrusifs, et leur emploi conditionne la manière dont nous écrivons le métier. Pire, certains d'entre eux réduisent la testabilité de notre modèle en couplant tellement tout au runtime qu'il devient très difficile d'introduire des mocks. Ces frameworks pourtant vantent leur approche par couche. Je dis que ceux sont de faux amis. Prenez par exemple ActiveRecord. Il faut non seulement inclure une référence dans notre model à ActiveRecord pour s'en servir, mais en plus tout le système d'attributs que l'on place dans nos classes couple énormément notre model à ce système de persistance tant philosophiquement que physiquement. Nous ne sommes pas du tout abstrait de la persistence avec un tel système, et il sera relativement difficile à l'avenir de libérer notre model d'ActiveRecord.
C'est pourquoi je m'insurge quand j'entends dire que l'architecture d'une application est forcée par la technique. Ce n'est pas parce que je fais du .net que j'utilise ces immondices de DataSet et que je fais du rad. Il devrait en être de même en java. Après explications j'ai vraiment l'impression que les EJB malgré leur apparente propreté ne sont finalement qu'un moyen de faire du rad, et ils ont donc tous les problèmes qu'engendre cette approche (j'en parlais là)
Bon pour conclure, je tiens à rappeler un fait que j'oublie souvent trop moi-même, à savoir que l'approche par domaine n'est pas LA silver bullet. Il existe d'autres approches avec leurs avantages et leurs inconvénient tout comme l'approche par domaine. Je me permettais juste ici de souligner quelques fausses vérités que j'ai pu croiser.
Un discoure que je vois souvent revenir est de dire que les objets métiers doivent être très bêtes, en n'ayant pratiquement que des accesseurs sur les attributs, et que la couche métier elle, prenait ces objets en entrée. Une couche d'accès aux données les prend pour les faire persister. Finalement ces objets deviennent de bêtes structures de liaison entre une couche métier et une couche d'accès aux données. .
Cette approche est très procédurale, et ne tire finalement en rien partie de la richesse de l'objet, à savoir réunir données et comportement au même endroit. Le pire pourtant, c'est que vu de loin, une telle architecture parait propre puisque le métier est détaché de la persistence. On me répond du coup que c'est nécessaire dans les gros système pour pouvoir exposer des services. Les services peuvent avoir leur utilité, mais ils doivent rester bête et s'appuyer sur un domaine riche de sens. Ils peuvent recevoir et émettre des DTO soit, mais ce n'est pas une raison pour centrer toute notre application autour d'eux. Parce que finalement, un objet qui n'a que des données et pas de comportement, c'est un DTO. Ceux qui les utilisent à outrance ont du oublier la signification du T de DTO: data TRANSFER object. Ils servent à transmettre nos objets d'un système à un autre, mais à l'intérieur même du système, ils n'ont aucun sens.
Fowler pour décrire ce phénomène parle "d'Anemic Domain Model"
Le tout est finalement est de bien imaginer ce qu'est un modèle du domaine. Ce n'est pas une sorte de pool de DTO dans lesquels on peut piocher en fonction de ce qu'on veut faire persister ou transmettre, mais c'est une forme de réalité. Un objet vit dans le domaine du moment que l'on fait un new, et il y restera jusqu'à qu'on fasse appel à un delete sur sa repository. Entre temps, le fait qu'il soit déshydraté et réhydraté depuis une base est purement technique et secondaire. Le modèle est une sorte de réalité vivante riche de sens où les objets interagissent entre eux, vivent, se modifient. Pour des raisons purement technique, nous synchronisons de temps temps l'état dans une base, mais dans un monde utopique, le model pourrait vivre en mémoire éternellement. Toute la philosophie d'un mapper O/R justement est de réussir cette synchronisation, en convertissant des concepts objets en concepts relationnels. J'ai tendance à penser que toute autre utilisation est finalement un détournement de la philosophie d'origine d'un mapper. C'est non seulement un détournement, mais en plus de la complexité pour rien. Un model du style "une classe une table" ne nécessite en rien un mapper dont tout l'intérêt réside justement dans sa capacité à nous permettre d'utiliser la puissance de l'objet tout en le faisant persister en base. Pour être plus précis, je devrais parler de MetaData mapping, qui consiste donc à décrire ailleurs que dans la classe comment la faire persister. C'est ce que font notamment les fichiers mapping d'hibernate (et du coup, utiliser hibernate sans utiliser les fichiers mapping est également dans la majorité des cas une mauvaise compréhension de l'intérêt de l'outil).
La séparation en couche ne suffit pas, pour pouvoir réellement écrire un tel modèle, il faut qu'il soit ignorant de sa persistance, qu'il y ait le moins d'intrusions possible du monde extérieure. Pourtant nombre de framework que ce soit de mapping O/R, d'IoC, MVC sont très intrusifs, et leur emploi conditionne la manière dont nous écrivons le métier. Pire, certains d'entre eux réduisent la testabilité de notre modèle en couplant tellement tout au runtime qu'il devient très difficile d'introduire des mocks. Ces frameworks pourtant vantent leur approche par couche. Je dis que ceux sont de faux amis. Prenez par exemple ActiveRecord. Il faut non seulement inclure une référence dans notre model à ActiveRecord pour s'en servir, mais en plus tout le système d'attributs que l'on place dans nos classes couple énormément notre model à ce système de persistance tant philosophiquement que physiquement. Nous ne sommes pas du tout abstrait de la persistence avec un tel système, et il sera relativement difficile à l'avenir de libérer notre model d'ActiveRecord.
C'est pourquoi je m'insurge quand j'entends dire que l'architecture d'une application est forcée par la technique. Ce n'est pas parce que je fais du .net que j'utilise ces immondices de DataSet et que je fais du rad. Il devrait en être de même en java. Après explications j'ai vraiment l'impression que les EJB malgré leur apparente propreté ne sont finalement qu'un moyen de faire du rad, et ils ont donc tous les problèmes qu'engendre cette approche (j'en parlais là)
Bon pour conclure, je tiens à rappeler un fait que j'oublie souvent trop moi-même, à savoir que l'approche par domaine n'est pas LA silver bullet. Il existe d'autres approches avec leurs avantages et leurs inconvénient tout comme l'approche par domaine. Je me permettais juste ici de souligner quelques fausses vérités que j'ai pu croiser.



Commentaires
Formidable article!
Et bien merci
Des commentaires aussi dithyrambiques ça fait toujours plaisir
Hello ! Billet très peryinent
cependant j'ai du mal à compfrendre : domain model et separation des couches ... bone continuation ! 
Article intéressant mais un exemple de ce qu'il faut faire ou ne pas faire aurait été bienvenu
Merci pour le commentaire Korrigan. Ce billet je l'accorde est loin d'être parfait, étant donné que je l'avais plus tourné sous la forme d'un coup de gueule que d'une réelle volonté d'expliquer dans les détails. Je m'appuie beaucoup dedans sur le fait que le lecteur doit être familiarisé avec pas mal de concepts. Ceci dit, ceci reste unn blog pour donner rapidement mon avis ou mes coups de gueules sur mon travail, et n'a sans doute pas encore vocation à être didactique. dddfrance est plus dans cette idée, mais pour le moment je dois avouer un complet manque de temps pour le faire vivire.
Bonjour,
Je suis pas tout à fait d'accord. Je m'explique, ça fait quelques temps (pour ne pas dire quelques années) maintenant que j'effectue des recherches dans ce domaine, et j'en suis venu à la conclusion suivante, même si je sais qu'il n'y a pas de solution parfaite et qu'elle dépend des besoins et du domaine de mise en place :
Un objet métier ne doit pas contenir de règle de gestion, car selon moi , les règles de gestion ne sont propres à l'objet que dans un " contexte d'application".
Si l'on fourni les règles de gestion avec l'objet, chaque application qui utilisera cet objet, aura les règles de gestion de toutes les autres applications.
Pour moi, il est nécessaire d'avoir une couche de Gestion Métier, qui se charge elle de définir les régles métiers et les traitements à appliqué à ces objets. Ce qui fait que cette couche pourra être aisément changé dans une nieme application utilisant les mêmes objets métier et pas les même règles de gestion. Ou dans le cas ou une application utilisérai ses règles et les regles d'une autre, il suffirait d'ajouter les deux gestionnaires.
Je sais pas si je suis vraiment clair. Mais si vous avez une opinion sur ma façon de voir les choses, ou si vous trouvez une faille, ou une quelconque remarque. Je suis preneur.
Mais je le repete, je ne pense vraiment pas qu'il y la solution ultime à ce problème de séparation des couches.
En espérant avoir une réponse.
Je vais tenter d'apporter un modeste élément de réponse. Ce que l'on met dans la logique métier est une partie du domaine de l'entreprise concernée par l'application.
Alors je vois deux situations. Le modèle du domaine est établi pour l'application est n'a pas pour vocation d'être partagé ce qui 'est très souvent le cas. Alors, si ce que tu appelles règle de gestion dépend du contexte, il se peut que sa fasse partie de la couche applicative et non de la couche métier. \o/
Rapidement, le modèle du domaine n'étant qu'une abstraction sélective du domaine ne visant qu'à répondre au besoin ciblé, on peut très bien trouver des applications causant du même domaine mais avec un modèle très différent.
Si on a donc du métier qui change en fonction du contexte, c'est qu'il n'existe sans doute pas en fait de modèle commun, et ces différentes applications hébergent leur propre modèle. L'effort de vouloir conserver que la "structure" des objets métiers quelque part pour pouvoir les partager entre plusieurs applications me semble très largement dépasser le peu de valeur que ça a, d'autant plus que d'une application à l'autre, il n'y a aucune garantité qu'on ait besoin des mêmes informations. L'idée serait sans doute de pouvoir partager des informations entres ces applications, mais dans ce cas je préfère très largement qu'il existe des passerelles (ETL/Web Services, qu'importe), plutôt que de risquer qu'une application mette les données dans un état que ne supporte pas une autre.
J'ajoute également que je suis assez d'accord avec Michael pour dire que je trouve dangereux d'utiliser les mêmes termes/objets dans des contextes différents: par exemple, dans une application de e-commerce, un produit du point de vue du site marchant n'a rien à voir avec le produit d'un point de vue logistique : l'un sert à porter un prix et une description, l'autre sert à connaître son emplacement dans les entrepôts. Encore une fois, vouloir rassembler des concepts aussi éloignés me semble très dangereux pour bien peu de valeur ajouté, voir aucune.
J'ettofe ma pensée.
Si l'on pense dans le cas d'un ERP Générique et paramétrable, avec pour principe une base de données unique commune entre toutes les applications. Qui permet au service de ventes de partager le même produit avec le service Réappro.
1) Il est possible qu'entre les informations du produit e-commece (Service Vente) et du produit logistique (Service Réappro), il y est des informations différentes cependant, il y a un commun le nom du produit, le code du produit ... Mais c'est pas pour autant aussi que les regles de gestion soit toutes différentes. Je dirai qu'il peut y avoir une partie commune par exemple sur la gestion des calculs de stocks (stocks limites, alerte, rupture...) Informations utiles pour les deux services et des partie bien distinctes propres aux services ventes (ex :Gestion des remises client en fonction du produit) et propre aux service réappro (ex : Gestion des conditions de réappro...). dans ce cas il parait inconcevable de fourni les méthode de gestion propre au service réappro dans la l'application de e-commerce. Hors si c'est l'objet qui contient toutes ces informations, elle seront donc diffusé. Et si l'on considére que c'est deux domaines d'application différente et qui doivent donc jouer avec des objets métiers différents (comportant des régles de gestion différentes), Eh bien on se retrouve avec notre commun de calcul des stocks en double, donc niveau maintenance on ne peut pas dire que ce soit génial.
J'ai travaillé sur un ERP générique et paramétrable et l'on a été confronté à ce problème, en mettant tous notre code dans les objets métiers, on empeche un niveau de paramétrage et en plus on diffuse les régles dans toutes les applications, hors tous n'est pas commun.
2) Concernant le paramétrage, si l'on considére que la société puisse paramétré à tous niveau l'application, que ce soit au niveau des régles de gestion, au niveau des calculs (par exemple de gestion des stocks); il est nécessaire que cette couche soit accessible pour être modifiée aisément par les informaticiens de la société sans pour autant pouvoir modifier la structure de l'objet-métier.
On avait choisi une solution (aprés une multitude de débat, mais ceci n'est pas la question du jour) qui consisté à décrire le code métier dans des fichiers xml à l'aide de SPRING. En fait on avait un controleur qui était charger de lire ces fichiers et qui exécutait les méthodes, procédures ... selon le graphe d'execution définit dans le fichier xml. Et dans ces fichier XMl était contenu une logique métier (ordre d'execution des processus métiers, mais aussi des formules de calculs,réinjection de code(programmation dynamique), ....)
De ce fait notre couche métier étant séparé de tous le reste, elle devenait paramétrable et adapte selon la société cliente.(pour info on avait aussi du paramétrage stockés en BDD!! lol En fait y avait du paramétrage partout)
Je sais pas si je me fait comprendre, ou si vous comprenez pourquoi, j'ai envie de tendre vers cette solution plutôt que l'autre.
Aprés il est évident qu'il y a plusieur méthodes pour pouvoir rendre accés à son code source sans tout fourni à l'utilisateur-informaticien.
Je veux que vous compreniez que je ne viens pas contredire votre solution, ni vendre ma solution, car je pense que chacune des solutions est a utilisé en fonction des besoins.
Mais j'attend vos remarques!!! lol
A bientot
Petite précision sur :
" par exemple, dans une application de e-commerce, un produit du point de vue du site marchant n'a rien à voir avec le produit d'un point de vue logistique : l'un sert à porter un prix et une description, l'autre sert à connaître son emplacement dans les entrepôts"
Lorsque le client va valider sa commande, il va falloir que ton produit génére, par exemple, une demande de commande automatique adressé au service Réappro et à ce niveau la tes régles de gestion des stocks sont nécessairement communes aux deux services.
enfin je pense!! lol
Pour revenir rapidement sur l'exemple du produit, non il n'y a pas de duplication de règle métier vu que le web et la logistique gère différemment le stock. Vu qu'en plus, c'est de toute manière la logistique qui a de grandes chances d'avoir le bon chiffre, on peut synchroniser l'état des stockes entres les deux applications à la demande.
Tu te contredis un peu dans ton exemple ceci dit. Tu parles de maintenabilité, mais entre un peu de duplication entre quelques applications, ou devoir gérer du xml et de la configuration au kilomètre, surtout si du coup on se met à devoir faire de réflexion partout, je choisis largement la première solution. Le code est refactorable, testable facilement, évolutif, compilé; la configuration beaucoup moins.
Dans les cas que j'ai pu observer en plus, la mise en place d'un ERP entièrement configurable chez un client revenait plus cher que de faire un développement maison maîtrisé, donc cet exemple est plutôt l'exception que la règle.
Ceci dit, même si je devais développer moi même un ERP entièrement générique, je pense que vu la complexité outrancière de la chose, je m'appuierai justement encore plus sur un modèle du domaine riche de sens, et comme disait Michael, la configurabilité de la chose vivrait peut être plus du côté applicatif, avec un système de workflow peut être.
Bref pour conclure, je pense Touty que le seul exemple du développement d'un ERP ne suffit pas à dire qu'il faut tendre vers des domaines anémiques, car en plus comme nous le venons de le voir, un ERP générique devrait encore plus s'appuyer des objets riches, car leur utilité est révélé encore plus dans des métiers complexes. Alors oui, je comprends ou tu veux en venir, mais en terme de choix d'architecture, je ne suis juste pas d'accord, voilà
"la mise en place d'un ERP entièrement configurable chez un client revenait plus cher que de faire un développement maison maîtrisé"
Pourtant la demande est présente, les entreprise n'ayant pas de service informatique, il leur est nécessaire d'avoir un ERP entièrement paramétrable.
J'ai pas dit que la solution du XML était la meilleur loin de la, On aurait pu se baser sur des principe de surcharge de code,... (Mais j'ai pas été maitre de ces choix, j'étais un bleu!!!lol...) J'ai le cas d'une banque française (dont je ne siterai pas le nom) qui a tout ces appli basé sur un ERP C#/ASP fourni par une entreprise tiers, et qui utilise la surcharge de code, la réinjection de code pour paramétrer l'ERP en fonction de ces règles et cas d'utilisation métier.
Au niveau de la logisitique et le web, je ne suis pas sur qu'il gère tout différement, et une chose est sur, c'est que vaut mieu que la base de donnés dérrière soit unique, sinon tu t'oblige à fournir des mécanisme qui fusionne les infos entre elle, ... ou autre principe. Le principe de l'ERP étant d'avoir une seule base de données.
Pour avoir une seule instance d'un client par exemple et non pas autant d'instance que de service qui traite les clients. De ce fait le SAV, le service Commerciale, ... voit les même informations sur le client TOTO.
Si le web et la logistique n'ont pas pas la même gestion du stock d'alerte d'un produit, je vois mal comment les réappro peuvent s'effectuer. Si la commande web est confirmé, alors automatiquement si le stock d'alerte ou de sécurité est atteint il y a une commande fournisseur qui doit être déclenché, ou une demande auprés du service Achat qui jugera nécessaire ou non de commander.
En fait faut voir l'ERP générique et paramétrable, comme un moteur, prêt a accepté que chacun des clients utilise ses régles métiers, peut importe la façon de faire, le moteur doit s'avoir quand utilisé les régles générique et quand utilisé la spécialisation du client.
On s'éloigne du sujet, mais la vision "base unique" est un anti pattern assez connu décrit ici. Croire qu'il est possible d'avoir une vue unique satisfaisant toutes les applications, et qui en plus va rester consistante malgré des modifications concurrentes d'outils n'ayant pas les mêmes besoins est assez utopique. Il y a fort à parier que l'effort d'avoir une base unique n'apportera jamais réellement de valeur, et favorisera l'émergence d'un BigBallOfMud non refactorable par définition. De plus, penser en terme de base de données plutôt qu'en terme de modèle du domaine est aux antipodes du sujet de mon billet, à savoir le Domain Driven Design. Je conseil de lire cet article pour bien saisir le problème que je décrivais. Un autre anti-pattern proche est décrit dans cet article également
Je ne vais pas revenir sur les ERP, car à mon sens dans l'énorme majorité des cas du vol: l'entreprise aurait pu faire développer un outil répondant à ses propres besoins pour beaucoup moins cher, mais souvent elles ne sont tout simplement pas assez bien conseillés pour savoir que c'est possible, ou alors elles ont été refroidis par des expériences passées avec des SSII peu scrupuleuses fournissant des logiciels mal foutus, ne répondant à rien, et trop chers.
La magie de l'informatique finalement, c'est que nous avons réussi à convaincre pas mal de nos clients de nous payer à ne pas produire de valeur.
Je ne suis pas d'accord.
aujourd'hui le probleme dans les entreprises
C'est que j'ai un client X avec N°siret 001, dans le service Aprés vente j'ai ce client avec le téléphone 010101010 et au service vente le client Y N°siret 001 avec le même numéro (soit une instance du client en SAV et une instance en Vente). Si on considére que l'on a plusieurs base, soit une base par domaine. si le client dit au SAV qu'il a changé de Téléphone comment le service Vente sera au courant. Eh bien aujourd'hui, c'est le problème de toutes les entreprise, l'informations ne circule pas. Et les données de certains service sont souvent obsoletes.(X et Y sont les même client, mais la personne était une femme et s'est marié, elle a changé de nom, un service est pas à jour)
Alors que dans l'utilisation d'une base unique, c'est à dire avec une seul instance du client y a pas a se soucier de ça, l'information sera visible par tous le monde et sera commune.
Big Ball of Mud si j'ai bien compris c'est quand c'est le gros bordel dans un objet. Mais justement. Et bien c'est la que je revien avec le fait, qu'il y ai un commun minimum entre tous les domaines pour la gestion du client. Et des régles propres à chaque domaine.
Un exemple, j'ai eu un probleme avec mon FAI. Au service technique, ils ont noté dans mon dossier mon problème, ...Sur l'appli du hotliner, il a acces à tous ce qui touche à la technique, lancement du reboot de ta box,(et d'autre options).
J'ai du contacter ensuite le service Financier, et là sur leur interface il avait accés à mon dossier avec le suivi de mon problème (détaillé par le service technique).(Ce qui correspond au commun). Sur l'inteface du Service Financier apparait cependant d'autre option qui leur permettent par exemple d'éffectuer une réctification sur ta facture (fonctionnalité non accessible par le hotliner technique, n'étant pas du même domaine)
Et pourtant les applications sont bien différentes, mais les données sont les mêmes. Et je ne pense pas qu'il s'amuse à recopier les informations de la base SAV technique à la base SAV Financier à la base SAV commerciale, ...
C'est peut être considéré comme un anti pattern par certain, mais aujourd'hui, le regroupement des informations (tout en gardant la notion de confidentialité selon les données sensibles et de vue associé à un domaine) apportent beaucoup à une entreprise. Et à ma connaissance, je ne vois pas quelle autre solution répond à ce problème sans devenir un vrai tas de spagheti. Mais si quelqu'un en a une je suis preneur.
Et puis de toute façon la séparation des couches son but est de pouvoir faire changer une couche sans impacter les autres, ce qui veut dire que si le choix de stockage des informations se trouve dans un base unique elle ne va pa venir impacter la couche métier, puisque l'on va définir les régles métier d'un point de vue des application et non pas en BDD. Alors on peut passer d'une base de données à plusieurs base de donnés sans problème. (Euh bon d'accord c'est vrai que tout ça c'est de la théorie!!)
Pour finir :
"La magie de l'informatique finalement, c'est que nous avons réussi à convaincre pas mal de nos clients de nous payer à ne pas produire de valeur."
je suis assez d'accord, je dirais même "de nous payer à ne pas produire".(petite allusion à mon ancien taf!!)
Je vais arrêter là car tu ne vois visiblement pas de quoi je parle, et les débats sans fin sur l'architecture sont d'une manière générale très stériles, mais :
- Il ne faut pas confondre le problème et la solution : le soucis d'avoir des infos communes ne justifie une seule énorme base commune qui contient toutes les informations de toutes les applications possibles. Rien qu'en terme de disponibilité, ça ne fonctionne pas. Une plus petite base centrale avec des interfaces ciblées et beaucoup plus réalisables.
- Si c'est considéré comme un anti-pattern par un paquet de gens qui ont 20 fois plus d'expérience, c'est pour une bonne raison. Je sais bien qu'on retient réellement les choses quand on s'est soit même déjà brûlé, mais un peu de confiance parfois ne fait pas de mal. De plus, le cadre dans lequel j'ai rencontré ce problème était une énorme multinationale née de plusieurs fusions de sociétés très différentes, donc je connais bien le soucis.
- Le sujet n'était pas la manière de stocker le modèle du domaine, mais si oui ou non le métier devait être dans les objets métiers.
Ce qui est dommage c'est que moi je suis ouvert à ta solution, et comprend bien justement pourquoi dans certains cas ta solution est préférable à la mienne. Mais toi tu restes campés sur ta solution. Je pense que chacune des solutions à ces avantages et inconvénients reste juste à faire la part des choses en fonction du contexte.
Disons que tu travails dans le cadre d'une société, qui a des serveurs d'agence et un central, le central réplique sur les serveurs d'agences les données.
Toutes les instructions Insert et Update (Traitement pur SQL) sont envoyé a un web service qui se charge de les diffuser sur les serveurs d'agences.
Les select sont directement effectués sur les serveurs d'agences.
C'est architecture est non modifiable car c'est un serveur Mysql 4.1 qui est utilisé et il ne sait pas faire de réplication Maitre à Maitre. (Bref on ne peut pas modifier l'architecture)
En te demande d'utiliser un ORM linq, nhibernate, peu importe et tu dois utiliser le web service mise en place.
Tu te rajoute une petite web méthode qui fait SaveOrUpdate(Object _o) ton web service doit donc connaitre tes objets métiers.
Tu lui passes donc ta librairie d'objet métier. Et lui n'a pas besoin de ta logique métier.
Voici un exemple de pourquoi le code métier pourrait (et je dis bien pourrait) être séparé de la description de l'objet.
De cette façon quand tu distribues tes objets tu ne distribues pas ta logique métier avec!! Et tu peux te permettre d'utiliser la même librairie dans toutes les applications que tu veux sans avoir à maintenir plusieurs librairies d'objet.
Je me répète encore car apparemment toi non plus tu ne me comprends pas, il est évident que cette solution, n'est pas la solution à tous les problématiques. Chaque problématique a sa solution et tout dépend de tes contraintes.
Tu peux t'appuyer sur l'exemple du Petshop version 3.5 pour la séparation de l'objet métier et du code métier.
Comme le métier se noie dans tant de technique.