51 votes

Combien de travail devrait être fait dans un constructeur?

Les opérations pouvant durer un certain temps doivent-elles être effectuées dans un constructeur ou l'objet doit-il être construit puis initialisé ultérieurement?

Par exemple, lors de la construction d'un objet qui représente une structure de répertoire, la population de l'objet et de ses enfants doit être effectuée dans le constructeur. Clairement, un répertoire peut contenir des répertoires et qui à leur tour peuvent contenir des répertoires, etc.

Quelle est la solution élégante à cela?

52voto

Oddthinking Points 8946

Pour résumer:

  • Au minimum, votre constructeur doit obtenir l'objet configuré au point que ses invariants sont remplies.

  • Votre choix d'invariants peuvent affecter vos clients.(L'objet de la promesse d'être prêt pour l'accès en tout temps? Ou seulement dans certains états?) Un constructeur qui prend soin de tous les set-up-front peut rendre la vie plus simple pour la classe de clients.

  • Longue les constructeurs ne sont pas mauvaises en soi, mais peut-être mauvais dans certains contextes.

  • Pour les systèmes impliquant une interaction utilisateur, longue méthodes de n'importe quel type peut conduire à une mauvaise réactivité, et doit être évitée.

  • Retarder le calcul jusqu'à après le constructeur peut être un moyen efficace d'optimisation; il est peut-être inutile d'effectuer tout le travail. Cela dépend de l'application, et ne devrait pas être déterminé de façon prématurée.

  • Dans l'ensemble, ça dépend.

26voto

SoapBox Points 14183

Vous ne souhaitez généralement pas le constructeur à faire n'importe quel calcul. Quelqu'un d'autre en utilisant le code ne sera pas s'attendre à ce que il n'a plus de base.

Pour une arborescence de répertoires que vous êtes en train de parler, le "élégant" la solution est probablement de ne pas construire un arbre complet lorsque l'objet est construit. Au lieu de cela, construire à la demande. Quelqu'un à l'aide de votre objet ne peut pas vraiment attention à ce qui est dans les sous-répertoires, donc commencez par avoir votre constructeur de liste le premier niveau, et puis si quelqu'un veut descendre dans un répertoire spécifique, puis de construire la partie de l'arbre lorsqu'ils en font la demande.

13voto

Le temps nécessaire ne doit pas être une raison de ne pas mettre quelque chose dans un constructeur. Pourrais-tu mettre le code dans une fonction privée, et l'appeler de votre constructeur, juste pour garder le code dans le constructeur clair.

Cependant, si les choses que vous voulez faire n'est pas tenu de donner à l'objet une condition définie, et vous pourriez faire tout ça plus tard lors de la première utilisation, ce serait un argument raisonnable de le sortir et de le faire plus tard. Mais n'en faites pas la personne à charge sur les utilisateurs de votre classe: Ces choses (à la demande de l'initialisation) doit être complètement transparent pour les utilisateurs de votre classe. Sinon, important invariants de votre objet pourrait facilement se casser.

10voto

KeithB Points 9459

Elle dépend (typique CS de réponse). Si vous êtes à la construction d'objets au démarrage pour un long programme en cours d'exécution, alors il n'y a pas de problème à faire beaucoup de travail dans les constructeurs. Si cela fait partie d'une interface graphique où la rapidité de la réponse est attendue, il pourrait ne pas être appropriée. Comme toujours, la meilleure réponse est d'essayer de la façon la plus simple d'abord, de profil, et d'optimiser, à partir de là.

Pour ce cas précis, vous pouvez faire paresseux construction de la sous-objets de l'annuaire. Seulement de créer des entrées pour les noms de haut niveau répertoires. Si elles sont accessibles, puis de charger le contenu de ce répertoire. Faire encore une fois que l'utilisateur expolres la structure de répertoire.

8voto

Hugo Points 2156

Le travail le plus important d'un constructeur consiste à donner à l'objet un état initial valide. À mon avis, l'attente la plus importante à l'endroit du constructeur est que le constructeur ne devrait avoir AUCUN EFFET SECONDAIRE.

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