MVC без контроллера

от автора

Прошло уже лет 25 со дня изобретения концепции Model-View-Controller, а споры и её модификации не завершаются по сей день. Хотя очевидно, что в изначальном виде эта концепция ужасна, не объектно-ориентирована и избыточна. А избыточно именно наличие контроллера, в то время как разделение визуализации и бизнес-логики является сердцем этой концепции, из-за чего и живет эта идея до сих пор. Но вопрос контроллера замыливается, хотя понятно, что на его месте должна быть реализация биндинга. Особенно, когда в игровом движке Unity это биндинг уже есть изначально, хотя и появился косвенно. Об этом подробно рассказываю в следующем видео.

0:00 Мы не будем делать полноценное MVC

1:40 Пример визуализации (View) и задачи

3:46 Специфика Unity

5:00 Создание класса визуализации PersonUI и префабов PersonSlot и PersonSlotExt

12:15 Биндинг реализуется через связь визуальных элементов в префабах со свойствами класса PersonUI

15:50 Пример создания объекта на сцене через префаб, заполнение свойств класса PersonUI из класс Person, выполняющего роль модели

17:00 Класс визуализации PersonUI агрегируется в классе модели Person как часть

18:00 Создаем реакцию на событие нажатия кнопки — метод OnClick()

24:00 В визуальном классе PersonUI создаем событие Click, которое произойдет в методе OnClick() в момент нажатия пользователем на кнопку

28:00 В невизуальном классе Person создаем метод ViewPersonInfo(), который синхронизирует свойства визуального класса с невизуальным

37:15 В классе Society (старшая в иерархии модель) агрегируем класс PersonUI, который будет использоваться для разных Person

45:10 Подписываемся на событие Click в классе Society

46:40 Добавляем параметр в делегат события, который позволит узнать Id персоны на которой кликнули (нажали кнопку)

54:20 Тестируем, исправляем баги

1:01:40 Заработало

1:06:00 Дополнительная доработка, рефакторинг и т.д.


ссылка на оригинал статьи https://habr.com/ru/post/721774/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *