J'entends parfois que le fait d'avoir trop de classes "manager" dans la conception de votre programme est une odeur de code et ajoute une couche de complexité inutile. Pour moi, il est logique que les gens veuillent utiliser des classes de gestion pour manipuler et contrôler des objets à partir d'un contexte qui leur semble logique, mais trouver comment faire fonctionner une solution sans eux peut être déroutant.
Faut-il vraiment éviter autant que possible les cours de manager? De plus, quels articles / articles devrais-je lire sur la façon de mettre en œuvre une solution alternative pour les cas généraux / courants où ces gestionnaires peuvent être supprimés?
Réponses:
Il y a peut-être deux raisons pour lesquelles il s'agit d'une odeur de code. L'une des raisons est que cela peut signifier que vous n'avez pas d'objets de domaine mais que vous avez à la place des objets de valeur qui stockent simplement des données pour la manipulation par des classes de contrôleur ou de gestionnaire. C'est en fait assez courant et équivaut à une programmation procédurale dans un langage OO. Les «lots de gestionnaires» peuvent être un indice dont vous avez besoin pour intégrer la logique d'état, la validation et d'autres préoccupations directes dans les objets de domaine afin qu'ils encapsulent réellement quelque chose. Bien sûr, il y a des indices plus importants tels que le fait que vous n'avez pas d'autres méthodes que les getter / setters.
L'autre raison pour laquelle une odeur de code est que cela peut signifier que vos objets de domaine ne se relient pas très bien les uns aux autres. Par exemple, si vous avez une classe Account qui ne sait vraiment rien de la classe Transaction, sauf qu'elle est nommée Transaction et qu'il peut y en avoir plusieurs, alors vous n'avez pas vraiment d'implémentation de domaine métier très dynamique. Par exemple, SavingsAccount doit peut-être savoir qu'il ne peut pas accepter une DebitTransaction si le accountStatus est fermé. Beaucoup d'implémentations laisseraient cela au gestionnaire.
la source
Le fait d'avoir beaucoup de classes "manager" est souvent le symptôme d'un modèle de domaine anémique , où la logique de domaine est hissée hors du modèle de domaine et placée à la place dans des classes manager, qui correspondent plus ou moins à des scripts de transaction . Le danger ici est que vous revenez essentiellement à la programmation procédurale - qui en soi peut ou non être une bonne chose en fonction de votre projet - mais le fait qu'elle n'a pas été prise en compte ou envisagée est l'imo "odeur de code".
Suivant le principe de "l'expert en information" , une opération logique devrait résider au plus près des données dont elle a besoin. Cela impliquerait de replacer la logique du domaine dans le modèle de domaine, de sorte que ce sont ces opérations logiques qui ont un effet observable sur l'état du modèle de domaine, plutôt que des scripts de transaction modifiant l'état du modèle de domaine de l'extérieur.
la source
Le plus gros problème avec les classes de gestionnaire est qu'elles ne représentent que cette vague idée de ce que la classe est censée faire. Si vous appelez quelque chose un Manager, il peut faire tout et tout ce qui est en rapport avec ce qu'il gère. Je suppose que dans certains contextes, cela pourrait être correct, mais je dirais que dans presque tous les cas, ce n'est pas ce que vous voulez. Vous voulez que quelqu'un puisse regarder le nom de la classe et avoir non seulement une bonne idée de ce que la classe fait mais aussi de ce qu'elle ne fait pas.
Un autre problème avec les classes de gestionnaire est qu'il est très difficile de décider où la fonctionnalité doit aller. Lorsqu'il y a beaucoup de classes de gestionnaire, il y a souvent beaucoup de chevauchements de fonctionnalités entre les classes de gestionnaire. Vous devez ensuite déterminer quelle classe doit implémenter cette fonctionnalité qui se chevauchent et bien sûr, quelqu'un d'autre aurait choisi différemment. Ainsi, lorsqu'ils recherchent la fonctionnalité et ne la voient pas là où ils l'attendent, ils vont de l'avant et la réimplémentent là où ils pensent qu'elle appartient, car ils ne sont pas conscients de l'existence de l'autre implémentation. En d'autres termes, les classes de gestionnaire conduisent à des conceptions difficiles à comprendre et souvent compliquées.
la source