9
votes

Est trop nombreux paramètres dans un constructeur pour une usine une odeur de code?

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.

Normalement, cela me crierait "hé, votre classe a trop de dépendances, donc cela fait trop!"

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?

mise à jour:

J'avais envisagé le motif de constructeur, mais pour une usine, n'est-ce pas sur dingue?

(c.-à-d., widgetsfactorybuilder , qui construit une usine qui construit des widgets.).

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.


6 commentaires

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.


3 Réponses :


11
votes
  • envisagez de regrouper vos paramètres (tout ce qui est logique) dans FactoryConfigurationObject d'une sorte de type
  • Si cela échoue, envisagez d'utiliser le modèle Builder
  • mais généralement oui, au-dessus de 3 paramètres commence à sentir ...

3 commentaires

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!



1
votes

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 .

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 URL , puis transmettez-le un URL , pas un WebPage 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.

concernant votre mise à jour: 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 à votre usine. Voir Cette réponse .

Le problème de dépendance ne peut être répondu qu'avec une autre question: votre usine véritablement dépend de chaque param? Essayez de penser aux façons dont il pourrait ne pas.


0 commentaires

7
votes

Tout d'abord, je devrais mentionner que je ne pense pas nécessairement que six paramètres sont trop nombreux. Mais si vous insistez ...

Je ne pense pas que le problème réside du tout dans le nombre de paramètres au constructeur.

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.

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?


0 commentaires