Bien que la question soit générale, mon domaine d’application est plutôt C #, étant donné que des langages tels que C ++ ont une sémantique différente en ce qui concerne l’exécution des constructeurs, la gestion de la mémoire, le comportement non défini, etc.
Quelqu'un m'a posé une question intéressante à laquelle il n'a pas été facile de répondre.
Pourquoi (ou est-ce du tout?) Considéré comme une mauvaise conception permettant à un constructeur de classe de commencer une boucle sans fin (c.-à-d. Une boucle de jeu)?
Il y a quelques concepts qui sont cassés par ceci:
- Comme pour le principe du moindre étonnement, l'utilisateur ne s'attend pas à ce que le constructeur se comporte de la sorte.
- Les tests unitaires sont plus difficiles car vous ne pouvez pas créer cette classe ni l'injecter car elle ne quitte jamais la boucle.
- La fin de la boucle (fin du jeu) est alors conceptuellement l'heure à laquelle le constructeur se termine, ce qui est également étrange.
- Techniquement, une telle classe n'a aucun membre public, à l'exception du constructeur, ce qui rend la compréhension plus difficile (en particulier pour les langues où aucune implémentation n'est disponible).
Et puis il y a des problèmes techniques:
- Le constructeur ne finit jamais, alors que se passe-t-il avec GC ici? Cet objet est-il déjà dans la génération 0?
- Dériver d'une telle classe est impossible ou du moins très compliqué car le constructeur de base ne renvoie jamais
Y a-t-il quelque chose de plus manifestement mauvais ou sournois avec une telle approche?
while(true)
boucle dans un setter de propriété: new Game().RunNow = true
?
var g = new Game {...}; g.MainLoop();