Unity Craft
460 subscribers
14 photos
38 links
Download Telegram
Пример MVP для сундуков
Когда применять паттерн Singleton, мой взгляд 👀

Паттерн Singleton (Одиночка) один из самых распространенных паттернов в архитектуре разработки ПО, которые я встречал. "У класса есть только один глобальный экземпляр, который можно получить из любой точки программы".

Основная проблема использования синглтона часто сводится к тому, что класс, который реализует этот паттерн, вызывается в других классах где-то в середине кода (в методах). Такое использование "одиночек" порождает неявные зависимости в коде между компонентами системы, что может привести к внезапным багам в процессе работы программы.

Предположим, что на проекте командная разработка, и одному разработчику нужно поработать с классом EnemySystem, который писал другой (рис. 1 постом ниже). При такой архитектуре разработчик, который впервые открывает EnemySystem, не может гарантировать корректность работы класса, поскольку сразу не может определить, какие зависимости нужны EnemySystem. Поэтому, перед тем, как правильно встроить EnemySystem в проект, ему нужно прочесать весь класс и определить, какие зависимости в виде синглтонов он имеет. А это доп. время...

Поэтому лучше сделать так, чтобы все зависимости класса были видны сразу (рис. 2 постом ниже). Если объекты Player.Instance или EnemySpawner.Instance будут отсутствовать, то это сразу всплывет на этапе загрузки игры. К тому же, если в будущем команда примет решение уйти от синглтонов, то это легче будет сделать, если передать аргументы через конструктор (рис. 3 постом ниже).
Другие недостатки паттерна, которые я вижу:

1. Нельзя вынести интерфейс и подменить одну реализацию синглтона на другой (нарушение DIP)

2. Паттерн синглтон нарушает SRP, потому что отвечает дополнительно за создание и удаление самого себя. Это может усложнить разработку, если жизненный цикл синглтона не соответствует жизненному циклу программы

3. Использование синглтонов, усложняет тестирование, поскольку классы, использующие синглтоны, имеют неявные зависимости

Но это не означает, что его нужно избегать. На мой взгляд синглтоны нужно применять в правильных ситуациях, когда к объекту нужно обращаться из абсолютно разных точек программы.

Например, это может быть плагин аналитики, в которую нужно отправлять данные или универсальная аудиосистема, которая отыгрывает звуки, но не EnemySpawner, который используется только для EnemySystem.

Еще обязательным условием использованием синглтона является то, что синглтон должен существовать весь жизненный цикл работы программы, и к нему всегда должен быть доступ.

Таким образом, для работы с бизнес-логикой рекомендую использовать паттерн Dependency Injection (фреймворк Zenject/VContainer). Это даст возможность переиспользовать, тестировать и подменять реализации классов, фокусируясь на решении задач, а не выстраивании архитектуры (рис. 3). А синглтоны использовать только в тех случаях, когда нужно получать универсальный модуль из разных точек программы, и этот "волк" живет все время приложения.
Ребята, всем привет👋
Поздравляю вас с наступающим новым годом и хочу поделиться интересной информацией, которую вы можете глянуть в этом ролике

Вкратце, 20го числа в 19 00 по мск я провожу открытый урок по атомарному подходу, поэтому если вам интересно узнать что-то новое и улучшить свои навыки в программировании, то welcome😎

Помимо этого, я также разработал специальный курс, в котором мы будем разбирать механики и атомарный подход на примере разработанной мной игры - Top-Down Zombie Shooter.
Ссылку на сайт с курсом также прикрепляю
Unity Craft pinned «Закрепляю ссылку на стрим по атомарному подходу 🤗 20-го декабря в 19 00 по мск https://www.youtube.com/live/BB8tgIX9AXY?si=JmP7ydYhmto7lL37»