Je participe à un projet qui prend très au sérieux le principe de la Responsabilité Unique. Nous avons beaucoup de petites classes et les choses sont assez simples. Cependant, nous avons un modèle de domaine anémique - il n'y a pas de comportement dans aucune de nos classes de modèle, ce ne sont que des sacs de propriétés. Ce n'est pas une plainte concernant notre conception - en fait, cela semble fonctionner assez bien
Lors de la revue de conception, la Responsabilité Unique est souvent évoquée chaque fois qu'un nouveau comportement est ajouté au système, et donc le nouveau comportement se retrouve généralement dans une nouvelle classe. Cela rend les choses très facilement testables unitairement, mais je suis parfois perplexe car cela semble signifier le retrait du comportement de l'endroit où il est pertinent.
J'essaie d'améliorer ma compréhension de la manière d'appliquer correctement la Responsabilité Unique. Il me semble que la Responsabilité Unique s'oppose à l'ajout de comportements modélisant les affaires qui partagent le même contexte dans un objet, car l'objet finit inévitablement par faire plus d'une chose liée, ou faisant une chose mais connaissant plusieurs règles métier qui modifient la forme de ses sorties.
Si c'est le cas, il semble que le résultat final soit un Modèle de Domaine Anémique, ce qui est certainement le cas dans notre projet. Pourtant, le Modèle de Domaine Anémique est un anti-patron.
Ces deux idées peuvent-elles coexister?
EDIT: Quelques liens liés au contexte:
SRP - http://www.objectmentor.com/resources/articles/srp.pdf
Modèle de Domaine Anémique - http://martinfowler.com/bliki/AnemicDomainModel.html
Je ne suis pas le genre de développeur qui aime juste trouver un prophète et suivre ce qu'il dit comme une vérité absolue. Donc je ne fournis pas ces liens comme un moyen de dire "ce sont les règles", juste comme une source de définition des deux concepts.
0 votes
Avez-vous beaucoup appris depuis que vous avez posté ceci? J'ai quelques années d'expérience en développement et je suis dans une situation similaire à celle que vous avez décrite, où je vois que le projet montre des signes du modèle de domaine anémique, mais je ne sais pas comment équilibrer OOD avec SRP.
0 votes
Wow, cela fait un moment. Je pense que cela reflète où OO en est arrivé - bien loin de ses débuts. À l'université (il y a des années), j'ai appris que OO consistait à encapsuler des données avec des actions liées dans des classes, et le partage du comportement via l'héritage. Maintenant, il s'agit de classes de données légères avec d'autres classes pour agir sur elles, liées ensemble via des motifs de conception et de l'injection de dépendances, et l'héritage est un mot de quatre lettres. Le SRP fonctionne beaucoup mieux avec ce dernier style de OO que le précédent.
0 votes
Que ai-je appris? L'idée originale de modéliser les entités en tant que classes riches peut conduire à un désordre de hiérarchies et de trous percés dans l'encapsulation pour permettre au modèle de se fléchir de nouvelles manières. Cela ne fonctionne pas bien avec le TDD, qui a en partie conduit au SRP et au DI. Dans l'ensemble, c'est bien. Nous avons perdu le fait d'avoir des endroits intuitifs dans le code où vous pouvez rechercher comment votre système fait fonctionner certaines fonctionnalités. Maintenant, vous devez connaître toutes les classes d'acteurs impliquées ou parcourir la base de code. Nous nous appuyons sur les IDE pour trouver des utilisations, des implémentations d'interfaces, etc. Ce sont en partie des moyens de faire face à ce que le SRP et le DI nous ont apporté.
0 votes
À un niveau élevé, en passant des modèles de domaine riches vers SRP, nous avons échangé des modèles propres qui évoluent en monstres difficilement divisibles pour des ensembles propres de petites classes qui évoluent finalement en un désordre que personne ne peut entièrement suivre. Les modèles de domaine riches sont tentants, surtout au début, mais finalement vous vous rendez compte que vous ne pouvez jamais modéliser parfaitement le problème, et les choses peuvent vite mal tourner. L'approche SRP est probablement plus flexible à long terme, mais aucune des deux ne vous garantira un bonheur éternel.
0 votes
Merci d'avoir répondu si rapidement. Il semble qu'il n'y ait pas de solution miracle. Je comprends les compromis que vous soulignez.
0 votes
Oui, il n'y a jamais de solution miracle. J'ajouterais cependant ceci : si vous optez pour le SRP, travaillez dur pour garder les motifs de conception compréhensibles, et réduisez les couches/classes redondantes quand elles ne sont plus nécessaires, ou trop confuses pour comprendre comment elles interagissent. Si vous optez pour des classes de modèle de domaine riches, assurez-vous de les tester, pour forcer le comportement qui y est contenu à être piloté par l'interface publique. Si cela ne fonctionne pas bien pour le rendre public pour les tests, c'est probablement le moment idéal pour créer une nouvelle classe.