Anche se una domanda generale il mio scopo è piuttosto C # poiché sono consapevole che linguaggi come C ++ hanno semantiche diverse per quanto riguarda l'esecuzione del costruttore, la gestione della memoria, il comportamento indefinito, ecc.
Qualcuno mi ha fatto una domanda interessante alla quale non è stato facile rispondere per me.
Perché (o lo è affatto?) Considerato come un cattivo design per consentire a un costruttore di una classe di iniziare un ciclo infinito (cioè un circuito di gioco)?
Ci sono alcuni concetti che sono rotti da questo:
- come il principio del minimo stupore, l'utente non si aspetta che il costruttore si comporti in questo modo.
- I test unitari sono più difficili in quanto non è possibile creare questa classe o iniettarla poiché non esce mai dal ciclo.
- La fine del ciclo (fine del gioco) è quindi concettualmente il momento in cui termina il costruttore, il che è anche strano.
- Tecnicamente tale classe non ha membri pubblici tranne il costruttore, il che rende più difficile la comprensione (specialmente per le lingue in cui non è disponibile alcuna implementazione)
E poi ci sono problemi tecnici:
- Il costruttore in realtà non finisce mai, quindi cosa succede qui con GC? Questo oggetto è già in Gen 0?
- Derivare da una tale classe è impossibile o almeno molto complicato a causa del fatto che il costruttore di base non ritorna mai
C'è qualcosa di più evidentemente cattivo o subdolo con un simile approccio?
while(true)
loop in un setter di proprietà: new Game().RunNow = true
?
var g = new Game {...}; g.MainLoop();