Этот обзор посвящен анализу кода проекта Space Invaders, представляющего собой минимальную реализацию одноименной игры. Игра включает передвижение корабля, стрельбу по врагам, возрождение врагов и подсчет очков.
Организация проекта и уровень владения C#
Организация проекта удовлетворительная. Графические элементы (например, взрывы) находятся в отдельной папке. Исходный код расположен в папке «Исходники». Файл LevelCS служит точкой входа. Код выглядит хорошо структурированным и содержит минимальное количество директив using. Наблюдается понимание принципов написания кода. Используется объектный пул для пуль.
Объектный пул
Применение объектного пула – эффективная практика, предотвращающая постоянное создание и удаление объектов. Однако, он требует больше памяти, что может быть критично на слабых устройствах. В контексте разработки сетевых игр, использование объектного пула требует тщательного анализа.
Архитектура проекта
Проект использует три основных объекта: игрок, армия противников и зона поражения, а также пул пуль. Расположение пула пуль на более высоком уровне абстракции, чем следовало бы, является незначительным недостатком. Наблюдается попытка разделения модели и представления, но реализация требует улучшения.
Обработка событий и использование магических чисел
Обработка событий в целом корректна. Однако, событие «все противники умерли» следует заменить на «окончание игры». Использование магических чисел (например, «-4» при позиционировании игрока) затрудняет понимание и настройку кода. В данном случае их использование неоправданно.
Класс PlayerShip
Класс PlayerShip не содержит публичных полей. Использование событий корректно. Поле protector следует заменить на шаблонный метод. В методе Wake неправильно используется исключение ArgumentException. Запрос на ShipAudio в классе не используется, что указывает на ошибку проектирования. Метод TakeDamage в базовом классе избыточен и должен быть переопределен в производных классах или реализован через интерфейс. Метод стрельбы содержит некорректное обработку отсутствия пуль в пуле.
Базовый класс корабля и наследование
Базовый класс Ship содержит избыточную функциональность. Функционал стрельбы лучше вынести в отдельный класс («Gun»). Абстрактный метод TakeDamage не реализован в одном из производных классов. PlayerShip и вражеский корабль содержат дублирующийся код. PlayerShip можно удалить, используя стандартный Ship.
Код написан неплохо, но содержит проблемы в проектировании и иерархии классов. Автор демонстрирует понимание объектно-ориентированного программирования, но ему не хватает опыта работы с наследованием и шаблонами проектирования. После доработки проекта и накопления опыта, автор сможет претендовать на позицию с зарплатой около 65 000 рублей в месяц.