Когда применять паттерн Singleton, мой взгляд 👀
Паттерн Singleton (Одиночка) один из самых распространенных паттернов в архитектуре разработки ПО, которые я встречал. "У класса есть только один глобальный экземпляр, который можно получить из любой точки программы".
Основная проблема использования синглтона часто сводится к тому, что класс, который реализует этот паттерн, вызывается в других классах где-то в середине кода (в методах). Такое использование "одиночек" порождает неявные зависимости в коде между компонентами системы, что может привести к внезапным багам в процессе работы программы.
Предположим, что на проекте командная разработка, и одному разработчику нужно поработать с классом EnemySystem, который писал другой (рис. 1 постом ниже). При такой архитектуре разработчик, который впервые открывает EnemySystem, не может гарантировать корректность работы класса, поскольку сразу не может определить, какие зависимости нужны EnemySystem. Поэтому, перед тем, как правильно встроить EnemySystem в проект, ему нужно прочесать весь класс и определить, какие зависимости в виде синглтонов он имеет. А это доп. время...
Поэтому лучше сделать так, чтобы все зависимости класса были видны сразу (рис. 2 постом ниже). Если объекты Player.Instance или EnemySpawner.Instance будут отсутствовать, то это сразу всплывет на этапе загрузки игры. К тому же, если в будущем команда примет решение уйти от синглтонов, то это легче будет сделать, если передать аргументы через конструктор (рис. 3 постом ниже).
Паттерн Singleton (Одиночка) один из самых распространенных паттернов в архитектуре разработки ПО, которые я встречал. "У класса есть только один глобальный экземпляр, который можно получить из любой точки программы".
Основная проблема использования синглтона часто сводится к тому, что класс, который реализует этот паттерн, вызывается в других классах где-то в середине кода (в методах). Такое использование "одиночек" порождает неявные зависимости в коде между компонентами системы, что может привести к внезапным багам в процессе работы программы.
Предположим, что на проекте командная разработка, и одному разработчику нужно поработать с классом EnemySystem, который писал другой (рис. 1 постом ниже). При такой архитектуре разработчик, который впервые открывает EnemySystem, не может гарантировать корректность работы класса, поскольку сразу не может определить, какие зависимости нужны EnemySystem. Поэтому, перед тем, как правильно встроить EnemySystem в проект, ему нужно прочесать весь класс и определить, какие зависимости в виде синглтонов он имеет. А это доп. время...
Поэтому лучше сделать так, чтобы все зависимости класса были видны сразу (рис. 2 постом ниже). Если объекты Player.Instance или EnemySpawner.Instance будут отсутствовать, то это сразу всплывет на этапе загрузки игры. К тому же, если в будущем команда примет решение уйти от синглтонов, то это легче будет сделать, если передать аргументы через конструктор (рис. 3 постом ниже).
Другие недостатки паттерна, которые я вижу:
1. Нельзя вынести интерфейс и подменить одну реализацию синглтона на другой (нарушение DIP)
2. Паттерн синглтон нарушает SRP, потому что отвечает дополнительно за создание и удаление самого себя. Это может усложнить разработку, если жизненный цикл синглтона не соответствует жизненному циклу программы
3. Использование синглтонов, усложняет тестирование, поскольку классы, использующие синглтоны, имеют неявные зависимости
Но это не означает, что его нужно избегать. На мой взгляд синглтоны нужно применять в правильных ситуациях, когда к объекту нужно обращаться из абсолютно разных точек программы.
Например, это может быть плагин аналитики, в которую нужно отправлять данные или универсальная аудиосистема, которая отыгрывает звуки, но не EnemySpawner, который используется только для EnemySystem.
Еще обязательным условием использованием синглтона является то, что синглтон должен существовать весь жизненный цикл работы программы, и к нему всегда должен быть доступ.
Таким образом, для работы с бизнес-логикой рекомендую использовать паттерн Dependency Injection (фреймворк Zenject/VContainer). Это даст возможность переиспользовать, тестировать и подменять реализации классов, фокусируясь на решении задач, а не выстраивании архитектуры (рис. 3). А синглтоны использовать только в тех случаях, когда нужно получать универсальный модуль из разных точек программы, и этот "волк" живет все время приложения.
1. Нельзя вынести интерфейс и подменить одну реализацию синглтона на другой (нарушение DIP)
2. Паттерн синглтон нарушает SRP, потому что отвечает дополнительно за создание и удаление самого себя. Это может усложнить разработку, если жизненный цикл синглтона не соответствует жизненному циклу программы
3. Использование синглтонов, усложняет тестирование, поскольку классы, использующие синглтоны, имеют неявные зависимости
Но это не означает, что его нужно избегать. На мой взгляд синглтоны нужно применять в правильных ситуациях, когда к объекту нужно обращаться из абсолютно разных точек программы.
Например, это может быть плагин аналитики, в которую нужно отправлять данные или универсальная аудиосистема, которая отыгрывает звуки, но не EnemySpawner, который используется только для EnemySystem.
Еще обязательным условием использованием синглтона является то, что синглтон должен существовать весь жизненный цикл работы программы, и к нему всегда должен быть доступ.
Таким образом, для работы с бизнес-логикой рекомендую использовать паттерн Dependency Injection (фреймворк Zenject/VContainer). Это даст возможность переиспользовать, тестировать и подменять реализации классов, фокусируясь на решении задач, а не выстраивании архитектуры (рис. 3). А синглтоны использовать только в тех случаях, когда нужно получать универсальный модуль из разных точек программы, и этот "волк" живет все время приложения.
Принцип SRP vs принцип KISS. Как найти золотую середину?🤔
Сегодня я вам расскажу что делаю именно я)
🔥/🤯
Жмите на посмотреть ↓
Сегодня я вам расскажу что делаю именно я)
🔥/🤯
Жмите на посмотреть ↓
Teletype
Принцип SRP vs Принцип KISS. Как найти баланс?
Всем привет, сегодня я хотел бы поделиться опытом, как писать код так, чтобы система была с одной стороны гибкой, а с другой...
Ребята, всем привет👋
Поздравляю вас с наступающим новым годом и хочу поделиться интересной информацией, которую вы можете глянуть в этом ролике
Вкратце, 20го числа в 19 00 по мск я провожу открытый урок по атомарному подходу, поэтому если вам интересно узнать что-то новое и улучшить свои навыки в программировании, то welcome😎
Помимо этого, я также разработал специальный курс, в котором мы будем разбирать механики и атомарный подход на примере разработанной мной игры - Top-Down Zombie Shooter.
Ссылку на сайт с курсом также прикрепляю
Поздравляю вас с наступающим новым годом и хочу поделиться интересной информацией, которую вы можете глянуть в этом ролике
Вкратце, 20го числа в 19 00 по мск я провожу открытый урок по атомарному подходу, поэтому если вам интересно узнать что-то новое и улучшить свои навыки в программировании, то welcome😎
Помимо этого, я также разработал специальный курс, в котором мы будем разбирать механики и атомарный подход на примере разработанной мной игры - Top-Down Zombie Shooter.
Ссылку на сайт с курсом также прикрепляю
YouTube
Атомарный подход в Unity
Друзья, всем привет!
Это видео для тех, кто хочет в Новом Году еще больше прокачать свои скилы в Unity. А именно - узнать, понять и полюбить атомарный подход.
Всех с наступающим Новым Годом!
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru…
Это видео для тех, кто хочет в Новом Году еще больше прокачать свои скилы в Unity. А именно - узнать, понять и полюбить атомарный подход.
Всех с наступающим Новым Годом!
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru…
Закрепляю ссылку на стрим по атомарному подходу 🤗
20-го декабря в 19 00 по мск
https://www.youtube.com/live/BB8tgIX9AXY?si=JmP7ydYhmto7lL37
20-го декабря в 19 00 по мск
https://www.youtube.com/live/BB8tgIX9AXY?si=JmP7ydYhmto7lL37
YouTube
Введение в Атомарный подход (Часть 1)
На данном открытом уроке мы разберем, что такое атомарный подход и рассмотрим, как можно реализовать и повторно использовать механики персонажа в Unity!
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru
Телеграм канал: https://t.me/unitycodecraft…
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru
Телеграм канал: https://t.me/unitycodecraft…
Unity Craft pinned «Закрепляю ссылку на стрим по атомарному подходу 🤗 20-го декабря в 19 00 по мск https://www.youtube.com/live/BB8tgIX9AXY?si=JmP7ydYhmto7lL37»
Ребята, написал статью. Надеюсь, вам будет интересно ознакомиться перед стримом
Хабр
Атомарный подход в Unity
Привет, Хабр! 👋 Меня зовут Игорь, и я Unity Developer. Последние несколько месяцев я разрабатываю зомби шутер в Unity на атомарном подходе. Несмотря на то, что подход оказался достаточно удобным и...
Ребята, спасибо большое за стрим, было приятно провести с вами время! ☺️
Прикрепляю ссылку на запись стрима, как и обещал. Для удобства добавил тайм-коды 😎
Прикрепляю ссылку на запись стрима, как и обещал. Для удобства добавил тайм-коды 😎
YouTube
Введение в Атомарный подход (Часть 1)
На данном открытом уроке мы разберем, что такое атомарный подход и рассмотрим, как можно реализовать и повторно использовать механики персонажа в Unity!
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru
Телеграм канал: https://t.me/unitycodecraft…
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru
Телеграм канал: https://t.me/unitycodecraft…
Ребята, всем большое спасибо за совместно проведенное время!🔥
Добавил тайм-коды в финальный третий стрим на случай, если появится желание посмотреть/пересмотреть
https://youtube.com/live/lIX9ryGy7mo
Добавил тайм-коды в финальный третий стрим на случай, если появится желание посмотреть/пересмотреть
https://youtube.com/live/lIX9ryGy7mo
YouTube
Динамические Объекты. Атомарный подход (Часть 3)
В третьем открытом уроке рассмотрим динамические поведения игровых объектов. Сделаем подключение механики перемещения и поворота в Run-time. Реализуем временные эффекты яда и заморозки.
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru…
Всю информацию о курсе можно узнать на сайте: https://unitycodecraft.ru…
🎁 А здесь вы сможете ручками пощупать демо-пример на Unity, который делали в видео
GitHub
GitHub - StarKRE/unity-atomic-sample: Пример механик на атомарном подходе на Unity
Пример механик на атомарном подходе на Unity. Contribute to StarKRE/unity-atomic-sample development by creating an account on GitHub.
Forwarded from Igor Gulkin
This media is not supported in your browser
VIEW IN TELEGRAM