# Review Bodio Oleg
Перед виконанням рефакторингу подивіться лекцію про принципи Чистого коду.
https://youtu.be/otrfSgeK3JI
Візуальна складова і логіка гри
-----------
Гра трохи дивно виглядає. Немає візуальної динаміки руху корабля. Після попадання в космічне сміття вікно закривається і відкривається нове, це потрібно виправити. Вікно гри повинне бути одне під час всієї гри.
Рішення
1. Задати умови гри.
Наприклад:
- додати параметр health для корабля. При попаданні в космічне сміття віднімати життя.
- задати час протягом якого корабель повинен залишитися вцілілим, якщо виконана умова - переходимо на новий рівень
- додати візуальне відображення поточного рівня, рівня життя, і скільки часу залишилось до переходу на новий рівень
- додати повідомлення при переході на новий рівень
2. Додати візуальне переміщення зірок заднього фону щоб була динаміка руху корабля. Зменшити кількість сміття і пришвидшити його рух.
3. Не можу закрити вікно гри, відразу відкривається нове - потрібно виправити
Зауваження по коду
-------
1. Винести класи в окремі файли - 1 клас = 2 файли (hpp, cpp). Для організації коду можна використати папки та фільтри в солюшені.
2. Винести логіку з main в окремий клас Game.
3. Відокремити логіку відмальовки, обробки івентів і основної логіки гри.
4. Чому деякі параметри класів публічні? в цьому немає порушення інкапсуляції?

5. Винести глобальні змінні в окремий файл
6. Варази з "магічними" числами винести в іменовані константи.
7. collided.size() > 0 - познайомитися з методом collided.empty().
8. Перед розмінуванням вказівника перевіряти його на валідність.
9. Почистити зайві інклуди (ті що не використовуються), можна ознайомитися з ReSharper, якщо буде час. Він значно допомагає при розробці.
10. Передивитися яким чином передаються параметри, наприклад, передавати int за посиланням не найкраща практика.
11. Подумати як ми можемо зробити класи BulletManager і AsteroidManager не сінглтонами, а членами класу Game.
Наприклад
- в BulletManager передати ColliderManager як вказівник (бажано розумний, подумати який краще);
- там де ми використовуюємо виклик сінглтона можна використати паттерн Спостерігач, або передати обробник у вигляді функтора, тощо.
12. При створенні плеера, краще ініціалізувати текстуру поза конструктором, в білдері (можна використати метод білдер в класі Game) і координати передавати як параметр конструктора, або навіть краще зробити Set метод.
13. Тут можна використати квадрат відстані для оптимізації
