Embora seja uma pergunta geral, meu escopo é bastante C #, pois sei que linguagens como C ++ têm semânticas diferentes em relação à execução de construtores, gerenciamento de memória, comportamento indefinido etc.
Alguém me fez uma pergunta interessante que para mim não foi facilmente respondida.
Por que (ou é mesmo?) Considerado um projeto ruim para permitir que um construtor de uma classe inicie um loop sem fim (ou seja, loop de jogo)?
Existem alguns conceitos que são quebrados por isso:
- como o princípio de menor espanto, o usuário não espera que o construtor se comporte dessa maneira.
- Os testes de unidade são mais difíceis, pois você não pode criar ou injetar essa classe, pois ela nunca sai do loop.
- O final do loop (final do jogo) é então conceitualmente o tempo em que o construtor termina, o que também é estranho.
- Tecnicamente, essa classe não tem membros públicos, exceto o construtor, o que dificulta a compreensão (especialmente para idiomas em que nenhuma implementação está disponível)
E depois há problemas técnicos:
- O construtor realmente nunca termina, então o que acontece com o GC aqui? Esse objeto já está na geração 0?
- Derivar de tal classe é impossível ou pelo menos muito complicado devido ao fato de o construtor base nunca retornar
Existe algo mais obviamente ruim ou desonesto com essa abordagem?
while(true)
loop em um configurador de propriedades new Game().RunNow = true
:?
var g = new Game {...}; g.MainLoop();