28 votes

Combien de variables un constructeur devrait-il avoir?

Je me rends compte c'est plutôt une question ouverte et pourrait obtenir une variété de réponses, mais voilà.

À l'aide de C# (ou Java, ou de tout langage OO), est-il une règle générale selon laquelle les états du nombre de variables doit être passé dans le constructeur? Le nombre de variables, je suis de passage dans le constructeur de l'étendue des classes semblent sortir de la main.

Dans un effort pour encapsuler les données d'une classe, je déclare les membres du privé, les initialiser dans mon constructeur, et d'utiliser les accesseurs.

Voici un exemple:

public class A
{
  private int var1;
  private int var2;
  private int var3;

  //3 variables passed in
  public A(int v1, int v2, int v3)
  {
    var1 = v1;
    var2 = v2;
    var3 = v3;
  }

  //Properties (accessors) here
}

public class B : A
{
  private int var4;
  private int var5;

  //5 variables passed in
  public B(int v1, int v2, int v3, int v4, int v5)
  : base(v1,v2,v3)
  {
    var4 = v4;
    var5 = v5;
  }

  //Properties (accessors) here
}

public class C : B
{
  private int var6;
  private int var7;

  //7 variables passed in !!!
  public C(int v1, int v2, int v3, int v4, int v5, int v6, int v7)
  : base(v1,v2,v3,v4,v5)
  {
    var6 = v6;
    var7 = v7;
  }

  //Properties (accessors) here
}

Ma constructeurs sont généralement en passant les différents objets, pas seulement les ints. J'ai commencé à questionner mon dessin quand j'ai commencé à passer dans les 7 variables au constructeur de la classe fille, mais j'ai aussi eu de la difficulté à trouver un autre moyen pour ce faire.

Est-ce considéré comme une mauvaise pratique? Est-il une limite générale pour le nombre de variables que vous devriez passer à un constructeur?

36voto

Reed Copsey Points 315315

Pour moi, la bonne réponse est:

Vous devez passer dans autant de variables que nécessaire pour configurer l'objet dans un état qui n'est pas invalide.

Tout ce qui est "option", je préfère laisser comme propriétés, surtout maintenant que C fournit des initialisateurs d'objets.

30voto

Rex M Points 80372

En général, j'ai trouvé, si il n'y a plus que 3, c'est un signe pour faire un rapide test de cohérence sur le design. Si il n'y a plus de 5, c'est un grand avertissement que quelque chose est probablement mal avec le design.

Cependant, notez que le mot "probablement" en fin de compte, la seule règle est d'utiliser autant que nécessaire pour la fonction, pas plus et pas moins. Il y a toujours des exceptions et des cas où plus de paramètres qui fait le plus de sens.

Si les paramètres sont liés d'une certaine manière, vous devez encapsuler dans une classe de conteneur.

Si les paramètres ne sont pas liés - par exemple, il ne fait aucun sens de les regrouper dans une classe de conteneur - votre classe est sans doute trop de choses. Il n'y a généralement pas de raison à une seule classe doivent être conscients de 7 totalement des morceaux disparates de l'information. Casser votre classe à part dans des classes séparées. Il pourrait être judicieux de déléguer les paramètres 3 et 4 pour une sous-classe et les 5, 6 et 7 dans une autre classe, par exemple - et vos parents de la classe tout simplement coordonne les activités entre eux.

5voto

Brian Genisio Points 30777

Il est difficile de mettre un nombre dur et rapide à ce qui est "trop". La vraie question est la suivante: Que fait votre classe? Est-ce que la classe en fait trop? Si c'est le cas, il est temps de briser la classe en classes plus petites et plus concises.

Les paramètres du constructeur doivent inclure autant que nécessaire pour définir les dépendances/entrées pour la classe. Si la classe est réduite à avoir un emploi dans la vie, alors vos paramètres de constructeur seront probablement corrects.

2voto

JRL Points 36674

Comme d'autres l'ont dit, il n'y a pas de règle dure à ce sujet, cela dépend vraiment. Cependant, il existe des preuves concrètes quant au nombre de choses que le cerveau d'une personne peut saisir à la fois: c'est la règle des 7 ou - 2.

Ce type de question est très bien répondu dans Code Complete par Steve McConnell. Je vous recommande de lire ce livre si vous n'avez pas déjà.

1voto

Jagd Points 2677

Une chose que j'aime sur le cadre 3.5 ...

Plus besoin de s'inquiéter de trop de constructeurs, ou trop de constructeurs avec trop de paramètres.

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