Сбор монет в Unity: 3 способа на C#

Задача: игрок (Player) собирает монеты на уровне. Рассмотрим три варианта реализации на C# в Unity и сравним их преимущества и недостатки.

Вариант 1: Смешанный подход

Класс Player содержит логику сбора монет и другие аспекты поведения (движение, прыжки и т.д.). Он хранит счётчик монет и генерирует события о подборе каждой монеты. Класс Coin — активный элемент, инициирующий событие при взаимодействии с игроком.

Этот подход характеризуется смешением ответственности в одном классе. Технически допустим, но может привести к запутанному коду, затрудняющему тестирование и сопровождение.

Вариант 2: Применение принципа разделения ответственности

Применяется принцип разделения ответственности (SOLID). Отдельный класс Кошелёк хранит количество монет и генерирует события об изменении количества. Класс Player взаимодействует с Кошелёком, но не содержит логики подсчёта монет.

Этот подход улучшает читаемость, тестируемость и обслуживаемость кода. Система подсчёта монет изолирована, что упрощает её независимое тестирование. Достаточно создать экземпляр класса Кошелёк и имитировать добавление монет без инициализации всего игрового персонажа.

Вариант 3: Интеграция логики подбора монет в класс «Кошелёк»

Метод подбора монеты перемещается в класс Кошелёк. Класс Coin сохраняется для маркировки взаимодействующих объектов. Логика взаимодействия с Unity (триггеры и события сцены) также переносится в класс Кошелёк.

По сравнению со вторым вариантом, тестирование усложняется из-за интеграции связи с Unity в модель. Это затрудняет создание unit-тестов для класса Кошелёк.

Сравнение вариантов

Вариант 2 (применение принципа разделения ответственности) предпочтительнее. Он обеспечивает лучшую тестируемость и разделение компонентов модели и компонентов, взаимодействующих со сценой Unity. Вариант 3 наименее удачен из-за усложнения тестирования. Вариант 1, несмотря на простоту, может привести к плохо структурированному и трудно поддерживаемому коду.

Выбор варианта демонстрирует разницу в подходах джуниор и сеньор программистов. Сеньор-разработчик учитывает принципы проектирования, тестируемость и долгосрочную перспективу проекта.

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