35 votes

Le nombre de paramètres d'un constructeur

J'ai une classe qui a besoin de 12 paramètres à transmettre à son constructeur. Donc, je pense qu'il ya quelque chose de mal avec la conception de cette classe.

Je voudrais demander si il n'y a aucun motif de conception ou d'une collection générale des règles relatives à la conception d'une classe, en particulier de son constructeur.

37voto

Péter Török Points 72981

12 paramètres certainement son trop nombreux pour moi. Options pour réduire ce nombre sont:

  1. Introduire le Paramètre de l'Objet par le regroupement logique des paramètres d'un objet et de passage de l'objet au lieu des paramètres individuels.

  2. Introduire un Générateur (en option avec la méthode de chaînage). Ce n'est pas de réduire la liste de paramètres réels, mais elle rend le code plus lisible, et est particulièrement utile si vous avez plusieurs de création de scénarios avec différents paramètres. Ainsi, au lieu de

    MyClass someObject = new MyClass(aFoo, aBar, aBlah, aBaz, aBorp, aFlirp, 
            andAGoo);
    MyClass anotherObject = new MyClass(aFoo, null, null, aBaz, null, null, 
            andAGoo);
    

    vous pouvez avoir

    MyClass someObject = new MyClassBuilder().withFoo(aFoo).withBar(aBar)
            .withBlah(aBlah).withBaz(aBaz).withBorp(aBorp).withFlirp(aFlirp)
            .withGoo(aGoo).build();
    MyClass anotherObject = new MyClassBuilder().withFoo(aFoo).withBaz(aBaz)
            .withGoo(aGoo).build();
    
  3. (Je devrais peut-être commencé avec cela ;-) Analyser les paramètres - est tous vraiment nécessaire dans le constructeur (c'est à dire obligatoire)? Si un paramètre est facultatif, vous pouvez le configurer via son examen régulier de la setter à la place du constructeur.

10voto

Stephane Rolland Points 8110

"Si votre fonction prend onze paramètres, vous avez probablement oublié un de plus"

EDIT: comme je l'ai été downvoted ;-) je vais juste expliquer.

J'adore cette phrase, car il résume le tout: Mauvaise conception des appels de mauvaise conception.

Je pense que j'ai cité cette phrase est à partir de C++ les Normes de Codage: 101 Règles, des lignes Directrices Et des Meilleures Pratiques par Herb Sutter, Andrei Alexandrescu

Fonctions avec tant de paramètres sont un symtom de mauvaise conception. L'une des possibilité est d'essayer d'encapsuler une partie de ces paramètres dans une entité ou à une catégorie qui a un objectif défini. (pas une poubelle la catégorie qui liste tous les paramètres sans sens).

EDIT2: ne Jamais oublier le Principe de Responsabilité Unique En conséquence, les classes restent limités en taille, et en conséquence, d'un nombre limité de membres paramétrée, et donc limité dans la taille des paramètres nécessaires pour ses constructeurs. Comme l'un des commentaires ci-dessous indique, la classe avec autant de paramètres du constructeur peut gérer trop de futiles détails, indépendamment de son objectif principal.

6voto

daramarak Points 3662

12 Paramètres, quelque chose est probablement plus de mal avec le design.

Ce qui est fait avec les paramètres?

  • Les étudiants de la classe il suffit de les envoyer dans d'autres constructeurs? Alors peut-être qu'il faut juste accepter les interfaces de prêt objets construits.
  • Est la grande classe et fait beaucoup de choses avec tous ces paramètres? Puis la classe a beaucoup plus de responsabilité et d'accepter les classes qui prend soin des détails à la place.
  • Existe-il des "clusters" dans les paramètres? Peut-être sont quelques-uns des paramètres d'une classe dans la création. Encapsuler et de leur donner de la responsabilité qui leur incombe.

L'alternative est que c'est les paramètres d'un bas niveau, la performance de construction, auquel cas le design tout simplement prendre un siège arrière, mais c'est rarement le cas.

4voto

Arseny Points 4270

si c'est possible, vous pouvez grouper les paramètres en cours et passer leurs instances pour le constructeur.

2voto

Dartoxian Points 307

Je pense que cela peut être acceptable lors de l'utilisation de l'État de modèle par exemple. Cependant, pourrais-je vous suggérer de passage de l'objet (le cas échéant) que ces paramètres proviennent de la place? Et puis dans le constructeur de charger les données à partir d'elle?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X