Aunque es una pregunta general, mi alcance es más bien C #, ya que soy consciente de que lenguajes como C ++ tienen una semántica diferente con respecto a la ejecución del constructor, la gestión de la memoria, el comportamiento indefinido, etc.
Alguien me hizo una pregunta interesante que para mí no fue respondida fácilmente.
¿Por qué (o se considera que es) un mal diseño permitir que un constructor de una clase inicie un ciclo sin fin (es decir, un ciclo de juego)?
Hay algunos conceptos que se rompen por esto:
- Al igual que el principio de menor asombro, el usuario no espera que el constructor se comporte así.
- Las pruebas unitarias son más difíciles ya que no puede crear esta clase o inyectarla, ya que nunca sale del bucle.
- El final del ciclo (final del juego) es, conceptualmente, el momento en que termina el constructor, que también es extraño.
- Técnicamente, tal clase no tiene miembros públicos, excepto el constructor, lo que hace que sea más difícil de entender (especialmente para los lenguajes donde no hay implementación disponible)
Y luego están los problemas técnicos:
- El constructor en realidad nunca termina, entonces, ¿qué pasa con GC aquí? ¿Este objeto ya está en Gen 0?
- Derivar de tal clase es imposible o al menos muy complicado debido al hecho de que el constructor base nunca regresa
¿Hay algo más obviamente malo o tortuoso con este enfoque?
while(true)
bucle en un montador de propiedad: new Game().RunNow = true
?
var g = new Game {...}; g.MainLoop();