2010-12-02 4 views
2

Ces deux méthodes fonctionnent pour moi, mais je ne suis pas sûr de ce que serait la recommandation du point de vue des «bonnes pratiques».Constructeurs lourds ou utiliser une méthode

J'ai une classe qui exécute diverses fonctions de contrôle dans ma bibliothèque, donc j'ai besoin d'initialiser toutes sortes d'objets et de propriétés.

Est-il correct de mettre toute cette logique dans le constructeur pour la classe, ou devrais-je le mettre dans une méthode "Initialiser".

public MyClass() 
{ 
    mSubObjectA = new mSubObjectA(); 
    mSubObjectA.DoStuff(); 
    mSubObjectA.DoMoreStuff(); 

    mSubObjectB = new mSubObjectB(); 
    mSubObjectC = new mSubObjectC(); 

    if (something) 
    { 
     DoStuff(); 
    } 
    else 
    { 
     MagicHappens(); 
    } 
} 

Répondre

0

Cela dépend du nombre de constructeurs que vous pensez avoir. Ne répétez pas le code. Si toutes ces étapes ne se produisent que dans votre constructeur, ce n'est pas un problème. Si vous cherchez à faire quelque chose de plus sophistiqué, arranger intelligemment votre code.

+0

Je ne savais pas quelle réponse accepter, car la discussion en Usine était très utile, mais comme je ne l'ai pas vraiment utilisé dans ce cas, mais que j'ai mieux arrangé mon code, je suppose que c'est ça. :) – Cylindric

1

Il existe une alternative à la fois - utiliser une classe factory ou factory method.

La construction de graphes d'objets complexes est ce à quoi sert le motif d'usine - cela sonne comme un très bon ajustement à votre situation.

6

Personnellement, j'aime qu'un objet soit complètement opérationnel au moment où je le reçois. D'autre part, faire beaucoup de travail dans le constructeur sentir quelque peu.

Une alternative consiste à écrire une méthode statique d'usine (ou une classe d'usine *) qui peut faire tout le travail qu'il doit avant appeler le constructeur, puis faire le constructeur lui-même assez simple. Vous pouvez choisir d'exposer le constructeur simple ou non, selon vos besoins.

* Une classe d'usine peut faire pour une meilleure testabilité, et permet potentiellement différentes implémentations d'usine. D'un autre côté, à ce moment-là, vous avez un niveau d'abstraction assez élevé, ce qui peut être une distraction.

+0

Testabilité est exactement d'où cela vient - J'ai commencé avec NUnit et j'ai toutes sortes de problèmes pour isoler les pièces à tester - si cela ne sent pas mauvais alors je ne sais pas ce que fait! En ce moment, beaucoup de choses doivent être configurées avant que la classe puisse fonctionner. – Cylindric

+0

@Cylindric: Cela dépend en partie de qui est vraiment responsable de cette configuration. Est-ce que ça doit être cette classe? Cette partie de configuration devrait-elle être accessible? –

+0

@Jon Skeet Je suis d'accord avec la Factory Class à 100%, mais je voudrais dire que la distraction de l'abstraction supplémentaire peut être une bonne chose car elle vous fait remarquer que quelque chose se passe autre que «nouveau». Nous utilisons un peu d'AAPC là où je travaille et il y a beaucoup de travail en cours pendant l'instanciation et c'est bien que vous ne puissiez pas simplement appeler nouveau. – msarchet