J'ai une classe d'usine qui prend actuellement 6 paramètres dans son constructeur et je viens de frapper un besoin d'ajouter un autre. p>
Normalement, cela me crierait "hé, votre classe a trop de dépendances, donc cela fait trop!" p>
Cependant, étant donné que cette classe est strictement une usine, est-ce vraiment le cas? Devrais-je m'inquiéter du nombre croissant de dépendances? Si oui, quelles stratégies devrais-je envisager de refléter cela? p>
(c.-à-d., En outre, je ne comprends pas comment un constructeur atteste vraiment mes dépendances - cela les déplace simplement du constructeur aux méthodes - qui semble obscurcir des choses plus - cependant cela pourrait être à une mauvaise compréhension de la manière de postuler le modèle de constructeur dans cette situation. P>
J'avais envisagé le motif de constructeur, mais pour une usine, n'est-ce pas sur dingue? p>
widgetsfactorybuilder code>, qui construit une usine qui construit des widgets.). p>
3 Réponses :
Je ne suis pas sûr que le modèle de constructeur soit un bon ajustement, car ma classe est une usine. Peut-être que c'est ma mauvaise compréhension - cela vous dérangerait-il de développer comment vous utiliseriez un constructeur ici?
Usine f = nouvel usine.builder (). Avecparam1 (). Avecparam2 (). Avecparam3 (). CRE a mangé ();
+1 Grea Répondez à propos de l'objet contextuel!
Ceci est particulièrement un problème lorsque bon nombre des paramètres sont facultatifs. Dans de tels cas, Considérez le modèle de constructeur . P>
En outre, déterminez si votre constructeur a vraiment besoin de chacune des classes spécifiques que vous fournissez. Par exemple, s'il a besoin d'un concernant votre mise à jour: strong> Les réponses de la mine et @ ILUXA se concentrent principalement sur un autre inconvénient de méthodes avec plusieurs paramètres, ce qui est difficile à lire et à entretenir. Le constructeur dans ce contexte est un alternative em> à votre usine. Voir Cette réponse . p>
Le problème de dépendance ne peut être répondu qu'avec une autre question: votre usine véritablement em> dépend de chaque param? Essayez de penser aux façons dont il pourrait ne pas. P> URL code>, puis transmettez-le un URL code>, pas un WebPage code> Objet qui se trouve avoir un URL < / code> propriété. Cela ne réduira pas le nombre de paramètres, mais il limitera la surface des dépendances externes. P>
Tout d'abord, je devrais mentionner que je ne pense pas nécessairement que six paramètres sont trop nombreux. Mais si vous insistez ... p>
Je ne pense pas que le problème réside du tout dans le nombre de paramètres au constructeur. P>
Le modèle de constructeur que les autres recommandent est utile pour les classes contenant beaucoup d'état. C'est rarement le cas pour une usine. Je vais plutôt supposer que les paramètres dont vous parlez sont des dépendances sur d'autres classes. Le vrai problème est que votre usine a trop de dépendances - et non que son constructeur prend trop d'arguments. P>
Au lieu de cela, vous devez regarder le design. Pourquoi l'usine a-t-elle tellement de dépendances? Est-il possible de réduire ce nombre en quelque sorte? Peut-être que les objets créés par l'usine sont eux-mêmes trop complexes? P>
Qu'est-ce que c'est exactement l'odeur de code? Première fois que j'entends parler de ça
@Chuck Code Soulations Sont une indication qu'il y a quelque chose qui ne va pas avec votre code. Je ne suis pas sûr que cela a été inventé par Bob Martin, mais c'était dans ses livres que je lisais d'abord à ce sujet. en.wikipedia.org/wiki/code_smell
@Chuck Birkin, une odeur de code est fondamentalement lorsqu'un code ne contient pas explicitement des bugs, mais pourrait être considéré comme un indicateur que l'application était mal conçue / reconstituée et contient donc probablement des bugs. en.wikipedia.org/wiki/code_smell
Pitt, @tim bender merci les gars
Kent Beck a inventé le terme "odeur de code". Il a créé une programmation extrême à Chrysler. Big Time Refactoring et TDD auteur, etc.
Trop de paramètres primitifs associés représentent souvent une odeur de code appelée "obsession primitive". Vous devriez envisager de les combiner dans une classe. Trop de paramètres d'objet de domaine non liés suggèrent que votre classe ou votre objet fait trop. Envisagez de briser ses répétitions.