Взаимодействие Вида с Контроллером
Я представляю это так:
Команды
- Вьюшка позволяет пользователю отдавать приложению определенные команды:
Примеры команд: "включить звук", "выключить звук", "перейти к биографии", "перейти к портфолио", "перейти к контактам"
- На уровне пользователя команды описываются в терминах бизнес-логики, и никак не связаны с реализацией.
Правильно: "показать портфолио", неправильно: "активировать модуль портфолио"
Правильно: "отправить сообщение", неправильно: "сформировать и отправить запрос на сервер"
- На уровне реализации некоторые команды объединяются в одну с вынесением параметра.
Команды "перейти к биографии", "перейти к портфолио", "перейти к контактам" объединяются в команду "перейти к модулю", где модуль является параметром.
Контроллер
- Контроллер знает, кто отвечает за выполнение каждой команды.
За команду может отвечать сам контроллер, один из его дочерних контроллеров, либо кто-то наверху.
- Контроллер знает, как реагировать на каждую команду.
Отвечает сам - выполнить, отвечает ребенок - напрячь его, отвечает кто-то сверху - сообщить родителю.
Вид
- Вью содержит элементы управления и знает, какие события могут от них придти.
Примеры элементов управления: кнопки, крутилки, переключатели.
Примеры событий: MouseEvent.CLICK, Event.CHANGE.
- Вью знает, как пользователь может отдать команду при помощи элементов управления.
Простейший способ отдать команду: "кликнуть по красной кнопке".
Продвинутые способы: "повернуть крутилку на 45 градусов", "нажать кнопку, подержать минимум 2 секунды и отпустить".
Выполнение
1. Юзер совершает действие
2. Элемент управления посылает событие
3. Вью ловит это событие
4. Вью интерпретирует событие как пользовательскую команду
5. Вью посылает событие с информацией о команде
6. Контроллер ловит это событие
7. Контроллер обрабатывает команду
Пример с меню
Меню позволяет выполнить следующие команды:
- перейти к биографии
- перейти к портфолио
- перейти к контактам
Как уже было сказано выше, эти команды объединяются в команду "перейти к модулю" с модулем в качестве параметра.
Если реализовывать их на основе Event, то у нас получится 2 класса:
1. SiteNavigationEvent, в котором определен дополнительный тип события SWITCH_MODULE и параметр module
2. Modules со списком модулей в виде констант: BIO, PORTFOLIO, CONTACTS
Итак, у нас есть SiteMenuView с кнопками btnBio, btnPortfolio и btnContacts. SiteMenuView слушает MouseEvent.CLICK.
Когда юзер нажимает на кнопку, в SiteMenuView исполняется примерно такой код:
var requestedModule:String; switch(event.target){ case this.btnBio: requestedModule = Modules.BIO; break; case this.btnPortfolio: requestedModule = Modules.PORTFOLIO; break; case this.btnContacts: requestedModule = Modules.CONTACTS; break; default: throw new Error("Разработчик - криворукая макака!"); }//switch super.dispatchEvent(new SiteNavigationEvent(SiteNavigationEvent.SWITCH_MODULE, requestedModule));
Польза
А теперь поиздеваемся над юзером, оставив ему всего одну кнопку для перехода между разделами.
Вариантов масса:
- нажать и отпустить сразу - биография, отпустить через секунду - портфолио, через 2 и больше - контакты
- потащить вверх или вниз - биография, влево - портфолио, вправо - контакты
- каждую секунду кнопка меняет цвет, вместе с ним - раздел, который она открывает
Пользователю скучно с одной кнопкой? Не вопрос, нарисуем ему кодовый замок с десятью разрядами, пускай ищет 3 комбинации, открывающие доступ к разделам сайта!
Польза всего этого в том, что как бы мы не извращались с интерфейсом, все изменения останутся только в коде вью, не затронув ни строчки контроллера.
Всего комментариев 13
Комментарии
31.03.2011 10:10 | |
тема сисек не раскрыта)
а где же моделька? |
31.03.2011 10:16 | |
Все просто и понятно, спасибо.
ЗЫ Мои поздравления и велкоме ту блогс =) |
31.03.2011 14:54 | |
То есть данные сами по себе не бывают? =)
|
01.04.2011 13:45 | |
Psycho Tiger ты когда напишешь заключительную статью про мвс, народ в ожидании)
|
02.04.2011 13:42 | |
У меня настолько изменился взгляд на парадигму MVC, что стоит, наверное, вообще написать всё сначала.
А вообще просто нет времени) |
Последние записи от Gaen
- Взаимодействие Вида с Контроллером (31.03.2011)