# Review Bodio Oleg Перед виконанням рефакторингу подивіться лекцію про принципи Чистого коду. https://youtu.be/otrfSgeK3JI Візуальна складова і логіка гри ----------- Гра трохи дивно виглядає. Немає візуальної динаміки руху корабля. Після попадання в космічне сміття вікно закривається і відкривається нове, це потрібно виправити. Вікно гри повинне бути одне під час всієї гри. Рішення 1. Задати умови гри. Наприклад: - додати параметр health для корабля. При попаданні в космічне сміття віднімати життя. - задати час протягом якого корабель повинен залишитися вцілілим, якщо виконана умова - переходимо на новий рівень - додати візуальне відображення поточного рівня, рівня життя, і скільки часу залишилось до переходу на новий рівень - додати повідомлення при переході на новий рівень 2. Додати візуальне переміщення зірок заднього фону щоб була динаміка руху корабля. Зменшити кількість сміття і пришвидшити його рух. 3. Не можу закрити вікно гри, відразу відкривається нове - потрібно виправити Зауваження по коду ------- 1. Винести класи в окремі файли - 1 клас = 2 файли (hpp, cpp). Для організації коду можна використати папки та фільтри в солюшені. 2. Винести логіку з main в окремий клас Game. 3. Відокремити логіку відмальовки, обробки івентів і основної логіки гри. 4. Чому деякі параметри класів публічні? в цьому немає порушення інкапсуляції? ![](https://i.imgur.com/68y2UnC.png) 5. Винести глобальні змінні в окремий файл 6. Варази з "магічними" числами винести в іменовані константи. 7. collided.size() > 0 - познайомитися з методом collided.empty(). 8. Перед розмінуванням вказівника перевіряти його на валідність. 9. Почистити зайві інклуди (ті що не використовуються), можна ознайомитися з ReSharper, якщо буде час. Він значно допомагає при розробці. 10. Передивитися яким чином передаються параметри, наприклад, передавати int за посиланням не найкраща практика. 11. Подумати як ми можемо зробити класи BulletManager і AsteroidManager не сінглтонами, а членами класу Game. Наприклад - в BulletManager передати ColliderManager як вказівник (бажано розумний, подумати який краще); - там де ми використовуюємо виклик сінглтона можна використати паттерн Спостерігач, або передати обробник у вигляді функтора, тощо. 12. При створенні плеера, краще ініціалізувати текстуру поза конструктором, в білдері (можна використати метод білдер в класі Game) і координати передавати як параметр конструктора, або навіть краще зробити Set метод. 13. Тут можна використати квадрат відстані для оптимізації ![](https://i.imgur.com/wY9cdLe.png)