Je travaille actuellement sur une base de code qui a de nombreuses classes qui implémentent une méthode Start. Cela me semble être une construction en deux phases, que j'avais toujours considérée comme une mauvaise pratique. Je ne peux pas faire la différence entre cela et un constructeur.
Quand est-il approprié d'utiliser une méthode de démarrage au lieu d'une construction d'objet normale?
Quand devrais-je préférer utiliser le constructeur?
Edit: Je ne pense pas que ce soit pertinent mais le langage de programmation est C #, il pourrait également s'appliquer à Java ou C ++
object-oriented-design
construction
constructors
Dave Hillier
la source
la source
start
et le constructeur? etc ...init
méthode quelconque en dehors de lanew
fonction - perldoc.perl.org/perlobj.html . Les idiomes d'une langue peuvent bien fonctionner là-bas et pas dans d'autres langues.Start
méthodes dans les API communes incluent les threads et les chronomètres.Réponses:
Une
Start()
méthode (commeRun()
,Execute()
ou quelque chose de similaire) est appropriée lorsque le coût de construction de l'objet est faible, mais le coût de l' utilisation est élevée. Par exemple: Une classe qui encapsule un algorithme d'optimisation du meilleur chemin. Il est trivial de le configurer avec un ensemble de paramètres (X
carrés parY
carrés, avec une telle méthode d'évaluation), mais son exécution peut prendre un certain temps. Si vous souhaitez créer 20 de ces objets, vous souhaiterez peut-être retarder l'exécution jusqu'à ce qu'ils soient tous créés - cela vous permet par exemple de les paralléliser plus facilement.Alternativement, cela pourrait être utile lorsque vous ne savez pas quand l'objet sera nécessaire pour démarrer - peut-être parce qu'il est basé sur une entrée utilisateur ou une logique qui sélectionne dans une liste de possibilités.
Cela suppose, bien sûr, que
Start()
c'est la méthode utile sur l'objet, et non l'équivalent d'uneInitialize()
méthode. Si c'est juste un moyen supplémentaire de définir plus de paramètres, cela ne devrait pas exister.la source
Code Complete (et de nombreuses autres ressources d'ingénierie logicielle) met l'accent sur la correspondance de vos classes avec des objets du monde réel. Je crois que la raison fondamentale de cela est qu'il rend plus probable que vous compreniez vraiment ce que vous mettez en œuvre, plutôt que de pirater une idée intangible.
Si vous êtes abonné à cette théorie, je ne vois rien de mal à ajouter une
Start()
méthode à une classe qui devrait, si elle était un véritable objet, avoir également un état de repos. Si cela n'a aucun sens que votre objet existe lorsqu'il n'est pas en cours d'exécution (ou n'a aucun sens pour que votre objet fonctionne), je dirais que c'est une mauvaise pratique.la source
Start()
pourrait correspondre à un interrupteur marche / arrêt (comme un interrupteur) qui devrait alors avoir unStop()
, ou à un bouton-poussoir (comme le bouton Imprimer sur une photocopieuse) où il démarre et s'exécute jusqu'à ce qu'il soit terminé.Vous pouvez utiliser l' initialisation paresseuse.
De cette façon, vous évitez le couplage temporel, ce qui signifie que le consommateur de votre classe doit appeler certaines méthodes dans un certain ordre. Avoir à appeler en
start()
premier est un moyen de savoir comment fonctionne la classe en interne, ce qui est mauvais car vous pourriez changer cela à l'avenir.Retardez l'initialisation coûteuse jusqu'à ce qu'elle soit nécessaire.
Exemple:
la source