Хотя это и общий вопрос, моя сфера - скорее C #, так как я знаю, что языки, подобные C ++, имеют различную семантику в отношении выполнения конструктора, управления памятью, неопределенного поведения и т. Д.
Кто-то задал мне интересный вопрос, на который мне было нелегко ответить.
Почему (или это вообще?) Считается плохим проектом, позволяющим конструктору класса запускать бесконечный цикл (т. Е. Игровой цикл)?
Есть некоторые концепции, которые нарушаются этим:
- Как и принцип наименьшего удивления, пользователь не ожидает, что конструктор будет вести себя так.
- Модульные тесты сложнее, так как вы не можете создать этот класс или внедрить его, так как он никогда не выходит из цикла.
- Конец цикла (конец игры) - это концептуально время окончания конструктора, что тоже странно.
- Технически такой класс не имеет открытых членов, кроме конструктора, что усложняет понимание (особенно для языков, где реализация недоступна)
И тут возникают технические проблемы:
- Конструктор фактически никогда не заканчивается, так что же здесь происходит с GC? Этот объект уже в Gen 0?
- Вывод из такого класса невозможен или, по крайней мере, очень сложен из-за того, что базовый конструктор никогда не возвращается
Есть ли что-то более очевидно плохое или коварное с таким подходом?
while(true)
петлю в собственность сеттер: new Game().RunNow = true
?
var g = new Game {...}; g.MainLoop();