Анализируется код мини-игры, разработанной одним из трёх Senior C# и Unity разработчиков. Задача заключалась в создании игры с игровым ресурсом (например, деньги, уголь, дерево), отображаемым в UI. Изменение значения ресурса в модели должно обновлять UI. Требовалось продемонстрировать понимание активных и пассивных компонентов, а также обработки обновлений из внешних сервисов (JSON). Локальный сервер для симуляции обновлений обязателен. Использование сторонних плагинов и библиотек разрешено.
Решение: упрощённый вариант
Рассмотрим упрощённый вариант от одного разработчика.
Моделирование ресурсов
Ресурсы смоделированы грамотно, разделены модель и представление. Вместо добавления ссылок на иконки и другие атрибуты в модель ресурса, используется immutable объект, предотвращая чрезмерную связанность. Хранение ресурсов реализовано через Immutable объект, обновление — через реактивный словарь, используя события для обновления системы. Reactive Property обновляет UI при изменении значения ресурса.
Для повышения производительности словарь можно заменить массивом для линейного размещения данных в памяти.
Обработка событий и инициализация сервисов
Класс ResourceData предоставляет методы для изменения значений ресурсов с проверкой на отрицательные значения. Инициализация сервисов и компонентов выполняется компонентом GameServices, перечисляющим все необходимые сервисы и обеспечивающим их упорядоченную инициализацию. GameServices включает корректный flow инициализации, учитывающий зависимости между сервисами.
Локальный сервер реализован как абстракция, использующая интерфейсы INetwork, INetworkReceiver, и IResourceUpdater, обеспечивая гибкость и расширяемость. Это позволяет легко заменять реализации (например, для подключения к реальному серверу).
Структура проекта
В упрощённом варианте присутствует разделение на ResourcePresenter (связывающий модель и представление) и ResourceView (визуализация). Ассоциация между ресурсом и его представлением реализована через ResourceView, получающий ID ресурса и отображающий информацию.
Анализ показал использование эффективных паттернов проектирования: immutable объекты, реактивное программирование и абстракции. Структура кода понятна и хорошо документирована. Существуют возможности для улучшения производительности и надёжности. Анализ кода других разработчиков позволит сравнить различные подходы.