Обновление электронной книги: Больше шаблонов проектирования и принципов SOLID

Еще осенью 2022 года мы выпустили электронную книгу Level up your code with game programming patternsвместе с репозиторием GitHub с примерами кода. Мы также выпустили серию видеоуроков из пяти частей, сопровождающих электронную книгу и примерный проект.
Мы получили от вас отличные отзывы об этих ресурсах, и многие из вас просили нас рассказать о дополнительных шаблонах дизайна. Спасибо, что поделились своим отзывом. Я и моя команда внимательно следим за вашими комментариями и очень ценим их.
Сегодня я рад сообщить, что вышло обновленное издание электронной книги " Level up your code with design patterns and SOLID", а также обновленная версия проекта с примерами паттернов проектирования, которую вы можете скачать в Unity Asset Store.
Электронная книга и пример проекта теперь основаны на Unity 6 и включают больше примеров и шаблонов. Пример проекта также включает в себя дополнительные возможности UI Toolkit, в том числе пример, демонстрирующий привязку к базе данных - популярный запрос сообщества.
Примечание: Unity 6 будет доступна позже в этом году. Если вы хотите следовать приведенным в руководстве примерам и прилагаемому демо-проекту, обязательно загрузите Unity 6 Preview.

Прежде чем погрузиться в новые материалы электронной книги, некоторые из вас, кто не очень хорошо знаком с этими понятиями, могут задаться вопросом: Почему я должен узнать о паттернах проектирования и как они используются при разработке игр в Unity?
Возвращаясь к вашему отзыву, скажу, что хотя основы объектно-ориентированного программирования знакомы многим, применение этих принципов в собственном коде иногда может показаться абстрактным и слишком академичным.
Подумайте об этом так: С каждой проблемой, с которой вы столкнулись при разработке программного обеспечения, сталкивались бесчисленные разработчики. Хотя вы не всегда можете напрямую обратиться к ним за советом, вы можете изучить их решения с помощью паттернов проектирования.
Паттерны проектирования предлагают общие решения распространенных проблем в программной инженерии. Это не готовые шаблоны, которые нужно скопировать и вставить в код, а скорее инструменты в вашем арсенале, которые можно использовать при необходимости. Некоторые шаблоны более интуитивны, чем другие, но каждый из них может быть полезен в любом контексте.
Мы создали это руководство для тех, кто только начинает знакомиться с паттернами проектирования или просто нуждается в освежении. В нем описаны общие сценарии разработки игр, в которых можно применить эти паттерны. Если вы переходите с другого объектно-ориентированного языка, например Java или C++, на C#, вы найдете практические примеры того, как адаптировать эти паттерны специально для Unity.
По своей сути паттерны проектирования - это просто идеи. Они не применимы в любой ситуации, но при правильном использовании могут помочь вам создать масштабируемые приложения. Их внедрение в ваши проекты улучшит читаемость и сопровождаемость кода. По мере того как вы будете знакомиться с этими паттернами, вы будете находить возможности для оптимизации процесса разработки.
Одним словом, наше руководство призвано повысить ваши навыки кодирования и создания лучших проектов Unity, а также сформировать понимание лучших практик индустрии, которые вы сможете использовать на протяжении всей своей карьеры.

Давайте рассмотрим основные новые дополнения к ресурсам по паттернам проектирования:
Расширенный раздел о том, как внедрить принципы SOLID
Пять основных принципов SOLID теперь имеют практические примеры кода, реализованные в проекте-образце, который объясняется в электронной книге. Напомним, что SOLID - это мнемоническая аббревиатура, обозначающая пять основных принципов проектирования программного обеспечения. Считайте их пятью основными правилами, которые помогут вам сохранить объектно-ориентированные проекты понятными, гибкими и удобными для сопровождения.
Небольшое напоминание: SOLID означает:
- Принцип единой ответственности: У класса должна быть только одна причина для изменения, а значит, у него должна быть только одна работа или ответственность.
- Принцип "открыто-закрыто": Классы должны быть открыты для расширения, но закрыты для модификации, что позволяет расширять их без изменения существующего кода.
- Принцип замещения Лискова: Объекты суперкласса должны иметь возможность быть заменены объектами его подклассов без ущерба для корректности программы.
- Принцип разделения интерфейсов: Клиенты не должны быть вынуждены зависеть от интерфейсов, которые они не используют. Это способствует созданию специальных интерфейсов вместо единого интерфейса общего назначения.
- Принцип инверсии зависимостей: Модули высокого уровня не должны зависеть от модулей низкого уровня, но и те, и другие должны зависеть от абстракций.

Главное, что можно извлечь из этих примеров, - это то, что следование этим принципам поможет вам добиться следующих преимуществ в разработке игр:
- Читабельность: Четкий и хорошо организованный код способствует эффективному пониманию функциональности проекта. Придерживаясь принципов SOLID, можно улучшить читаемость кода; когда стандарты кода согласованы, вы повышаете вероятность слаженной работы между игровыми программистами в команде.
- Масштабируемость: Внедрение принципов SOLID способствует поддержке кода, что очень важно для проектов, которые вы хотите масштабировать. Придерживаясь этих принципов, изменения, внесенные в одну часть кодовой базы, с меньшей вероятностью приведут к неожиданным проблемам в других частях. Такой подход обеспечивает гибкость кода и его адаптацию к изменяющимся требованиям.
- Скорость: В конечном итоге принципы SOLID способствуют улучшению рабочих процессов разработки игр. Модульный код, ключевой аспект SOLID, предполагает разбиение систем на более мелкие, управляемые компоненты. Такой модульный подход облегчает тестирование, отладку и повторное использование кода в разных проектах, сокращая время разработки и повышая производительность.

В обновленную электронную книгу и проект вошли четыре новых узора, в результате чего общее количество узоров достигло 11. Вот краткая информация о каждом из них:
- Фабричный узор: Классический случай - когда у вас есть бонусы (например, прибавки к скорости, щиты или дополнительные жизни), которые имеют несколько общих атрибутов, но при этом обладают разной функциональностью. Здесь паттерн фабрики может быть использован для создания экземпляров различных классов бонусов, полученных из общего интерфейса или базового класса, что позволяет гибко добавлять новые бонусы без изменения существующего клиентского кода.
- Объединение объектов: Некоторые называют это скорее техникой оптимизации производительности, чем паттерном проектирования. В любом случае, думайте об этом как о способе повысить производительность за счет повторного использования объектов вместо их частого создания и уничтожения. В нашем примере сцены вы найдете пример орудийной башни, стреляющей большим количеством пуль с высокой скоростью. Вместо того чтобы каждый раз инстанцировать их (и очищать после того, как они отработали свое назначение с существенными затратами производительности), мы используем паттерн для их повторного использования снова и снова.
- Синглтон: Синглтон, вероятно, является одним из распространенных паттернов в разработке игр - скорее всего, вы уже используете его сегодня. Это полезно, если вам нужно иметь один объект, который координирует действия во всей сцене. Например, вам может понадобиться один игровой менеджер, который будет управлять основным циклом игры. Однако при использовании паттерна singleton есть некоторые подводные камни, о которых мы расскажем в этом руководстве.
- Командный шаблон: Вы наверняка видели, как работает шаблон команд, если играли в игры, использующие функции отмены/повтора или сохраняющие историю ввода в виде списка. Этот паттерн можно использовать, например, в стратегической игре, где пользователь может спланировать несколько ходов, прежде чем выполнить их в том порядке, в котором они были заданы.
- Государственный узор: Это позволяет объекту менять свое поведение при изменении его внутреннего состояния, что упрощает управление сложным поведением игровых персонажей или элементов пользовательского интерфейса, зависящим от состояния. Представьте себе вражеского NPC, который ведет себя по-разному: "бездействует", "патрулирует" или "атакует", что зависит от различных сценариев игры, например, от того, где игрок находится на карте.
- Узор наблюдателя: Этот паттерн помогает реализовать эффективную систему событий, в которой объекты могут динамически подписываться на события и реагировать на них. Один из примеров использования - игрок, собирающий патроны в экшен-игре, который вызывает различные события, такие как воспроизведение звука, обновление пользовательского интерфейса и анимация.
- Представитель модельного представления (MVP): По своей сути этот паттерн отделяет отображение состояния от фактического состояния, позволяя реализовать реактивный дизайн, в котором представления автоматически обновляются в ответ на изменения модели, что делает его распространенным паттерном в программировании пользовательского интерфейса. Модель- это данные, представление- пользовательский интерфейс, а ведущий- посредник, который обрабатывает логику представления и синхронизирует данные с моделью.
- Model-View-ViewModel (New): Как видно из названия, этот паттерн связан с паттерном MVP, но расширяет его, добавляя привязку данных во время выполнения, что упрощает процесс обновления элементов пользовательского интерфейса. В нашем примере мы используем новую функцию привязки данных в UI Toolkit и Unity 6 Preview.
- Стратегический паттерн (новый): Этот паттерн определяет семейство алгоритмов, инкапсулируя каждый из них, чтобы сделать их взаимозаменяемыми, позволяя алгоритму меняться независимо от клиентов, которые его используют. Это полезный паттерн для реализации различных моделей поведения при движении, например, в игровом ИИ.
- Узор Flyweight (новый): Используйте этот паттерн для оптимизации использования памяти, разделяя как можно больше данных с похожими объектами. Основная идея заключается в том, что вы централизуете общие данные между объектами.
- Грязный флаг (новый): Этот паттерн полезен для оптимизации производительности за счет пометки объектов как "грязных" при их изменении, так что они пересчитываются или обновляются только при необходимости. Этот паттерн может помочь вам управлять дорогостоящими обновлениями в игровых циклах или в некоторых случаях рендеринга пользовательского интерфейса.

Проект-пример повторяет электронную книгу, демонстрируя каждый из 11 паттернов в действии. Вы можете загрузить проект из The Asset Store и проследить за соответствующими сценами, чтобы увидеть, как эти паттерны применяются в реальных сценариях. Обратите внимание, что для проекта требуется Unity 6 Preview или более поздняя версия.
Прежде чем приступить к реализации проекта, следует запомнить несколько полезных советов.

Начните со сцены Bootstrap. Эта сцена настраивает демо-версию и предоставляет доступ к главному меню (подробнее о концепции SceneBootStrapper вы можете узнать в электронной книге). Из главного меню вы можете перейти к соответствующему образцу. Каждая сцена демонстрирует различные принципы SOLID или паттерны проектирования.

Обратите внимание, что между проектом-образцом и примерами кода в руководстве могут быть незначительные различия. Для большей ясности и удобочитаемости в некоторых примерах используется упрощенный код, например, публичные поля.
Возможно, ваша команда предпочитает стиль кодирования, отличный от принятого в этом руководстве или в примере проекта. Мы рекомендуем создать руководство по стилю C#, соответствующее вашим конкретным потребностям, и последовательно следовать ему во всей команде. Ознакомьтесь с нашей электронной книгой о том, как создать собственное руководство по стилю, чтобы узнать больше.
Рассмотрите приведенные примеры и определите, какой шаблон проектирования лучше всего соответствует потребностям вашего проекта. Ознакомившись с этими паттернами, вы обнаружите их потенциал для оптимизации и улучшения рабочего процесса разработки.
Электронную книгу и пример проекта по использованию паттернов проектирования можно скачать бесплатно:
Счастливого кодирования!
