Анализ кода игры на C# и Unity: заказ, UI и JSON

Анализируется код мини-игры, разработанной одним из трёх Senior C# и Unity разработчиков. Задача заключалась в создании игры с игровым ресурсом (например, деньги, уголь, дерево), отображаемым в UI. Изменение значения ресурса в модели должно обновлять UI. Требовалось продемонстрировать понимание активных и пассивных компонентов, а также обработки обновлений из внешних сервисов (JSON). Локальный сервер для симуляции обновлений обязателен. Использование сторонних плагинов и библиотек разрешено.

Решение: упрощённый вариант

Рассмотрим упрощённый вариант от одного разработчика.

Моделирование ресурсов

Ресурсы смоделированы грамотно, разделены модель и представление. Вместо добавления ссылок на иконки и другие атрибуты в модель ресурса, используется immutable объект, предотвращая чрезмерную связанность. Хранение ресурсов реализовано через Immutable объект, обновление — через реактивный словарь, используя события для обновления системы. Reactive Property обновляет UI при изменении значения ресурса.

Для повышения производительности словарь можно заменить массивом для линейного размещения данных в памяти.

Обработка событий и инициализация сервисов

Класс ResourceData предоставляет методы для изменения значений ресурсов с проверкой на отрицательные значения. Инициализация сервисов и компонентов выполняется компонентом GameServices, перечисляющим все необходимые сервисы и обеспечивающим их упорядоченную инициализацию. GameServices включает корректный flow инициализации, учитывающий зависимости между сервисами.

Локальный сервер реализован как абстракция, использующая интерфейсы INetwork, INetworkReceiver, и IResourceUpdater, обеспечивая гибкость и расширяемость. Это позволяет легко заменять реализации (например, для подключения к реальному серверу).

Структура проекта

В упрощённом варианте присутствует разделение на ResourcePresenter (связывающий модель и представление) и ResourceView (визуализация). Ассоциация между ресурсом и его представлением реализована через ResourceView, получающий ID ресурса и отображающий информацию.

Анализ показал использование эффективных паттернов проектирования: immutable объекты, реактивное программирование и абстракции. Структура кода понятна и хорошо документирована. Существуют возможности для улучшения производительности и надёжности. Анализ кода других разработчиков позволит сравнить различные подходы.

Что будем искать? Например,программа