Уменьшаем хаос в UI: Паттерн MVP
Разделяем код и властвуем в разработке интерфейсов!
Общая информация
MVP (Model, View, Presenter)- это шаблон проектирования графических интерфейсов из семейства MV* (к ним также относятся MVC и MVVM).
Особенностью таких подходов является строгое разделение логики, данных и визуальных представлений друг от друга, что позволяет легко масштабировать и разрабатывать интерфейсы.
Я думаю, если вы как-то сопричастны к созданию интерфейсов и программированию их логики, то скорее всего что-то да и слышали о них.
Мотивация
Важным вопросом который нужно задать, когда начинаешь использовать тот или иной шаблон проектирования, является – "Зачем? Что это даст?"
Я считаю, что шаблоны проектирования решают важную задачу в долгосрочной перспективе— уменьшение хаоса и увеличение детерминированности проекта.
Когда ты начинаешь работу над новым блоком интерфейса, например профиль игрока (имя, статистика по матчам, итд) , ты будешь знать как ты его будешь строить, так как у тебя есть единый регламент/шаблон создания новых интерфейсов (также будут делать твои коллеги по команде) .
В качестве примера интерфейса, будем проектировать профиль игрока, где хотим отображать имя игрока и его уровень.
Я решил написать статью, чтобы максимально наглядно и доходчиво рассказать об этом (с примерами кода, с диаграммами) . Буду рад, если кто-то заинтересуется и попробует его использовать в своих проектах.
Подготовка
Для простоты понимания и наглядности, я построил подобие диаграммы классов, чтобы отобразить взаимосвязь сущностей в нашем примере.
Так, например, мы видим, что ProfilePresenter является связующим звеном между ProfileModel и ProfileView.
Ниже будет более подробно расписана каждая часть шаблона, описание задач и приложен пример кода на языке C#.
Model
Концепция Model’и заключается в игровых данных, а если говорить точнее — хранение, предоставление и изменение (это геттеры, сеттеры и ивенты/события).
Если перефразировать, модель отвечает за состояние игры в данный момент времени и предоставляет актуальную информацию.
Например, мы можем создать модель данных для хранения информации о профиле игрока, который будет содержать имя игрока и его уровень.
В нашей модели хранится два значения и для каждой из них есть GET/SET методы, также событие на их изменение.
При желание, в каждое из событий можно прокидывать обновленное значение:
View
Концепция View’шки — заключается в отображение информации/данных, это непосредственно информация про внутреннее содержание интерфейса (ссылки на текстовые/графические элементы и систем ввода/вывода)
Кроме ссылок, View также может иметь события на различные пользователя действия, такие как: нажатие кнопки, перелистывание страницы, ввод значений в текстовые поля
В примере кода интерфейсы и сам класс объединил для наглядности (в реальности они лежат раздельно)
Presenter
Presenter является связующим звеном между данными (Model) и отображением (View).
Его главной задачей является инициализация начальных значений, подпись на изменения данных и обновления в интерфейсах.
Back to Unity
С устройством и логикой MVP разобрались, а как это будет выглядеть на движке Unity?
Все достаточно просто, нужные нам элементы мы будем создавать ленивым методом, т. е когда будем обращаться к ним первый раз.
Изначально, на сцене нет никаких интерфейсов и логики, они создаются через класс Starter. cs (который прикреплен к одноименному объекту на сцене)
Этот скрипт обращается к ProfileManager. cs и легким движением руки создает ProfilePresenter (который внутри конструктора создает ProfileModel и ProfileView)
Ниже сам код, создание/получение нужных ссылок.
Теперь посмотрим, как выглядит ProfileView, который мы достаем из папки Resources.
Что в итоге?
При запуске игры, у нас на сцене создается ProfileView и отображается на сцену наши данные из ProfileModel.
Также оставлю ссылку на репозиторий с кодом
Надеюсь, эта статья оказалась интересной и полезной.
Буду рад замечаниям, обратной связи, лайкам, репостам, скачиваниям.
Спасибо за внимание.