Хоча загальним питанням, мій обсяг є скоріше C #, оскільки я знаю, що такі мови, як C ++, мають різну семантику щодо виконання конструктора, керування пам'яттю, невизначеної поведінки тощо
Хтось задав мені цікаве запитання, на яке мені було нелегко відповісти.
Чому (або це взагалі?) Вважають поганим дизайном, щоб дозволити конструктору класу запустити нескінченний цикл (тобто цикл гри)?
Є кілька понять, які порушені цим:
- як принцип найменшого здивування, користувач не сподівається, що конструктор поводиться так.
- Тестові одиниці складніше, оскільки ви не можете створити цей клас або ввести його, оскільки він ніколи не виходить з циклу.
- Тоді кінець циклу (кінець гри) концептуально - це час закінчення конструктора, що також є дивним.
- Технічно такий клас не має публічних членів, крім конструктора, що ускладнює його розуміння (особливо це стосується мов, де немає можливості реалізації)
А тут є технічні питання:
- Конструктор насправді ніколи не закінчується, так що ж відбувається з GC тут? Цей об’єкт вже в Gen 0?
- Виведення з такого класу неможливе або, принаймні, дуже складне через те, що базовий конструктор ніколи не повертається
Чи є щось більш очевидно погане чи хитре при такому підході?
while(true)
цикл у програмі налаштування властивостей new Game().RunNow = true
:?
var g = new Game {...}; g.MainLoop();