Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Gaen

Рейтинг: 4.00. Голосов: 4.

Взаимодействие Вида с Контроллером

Запись от Gaen размещена 31.03.2011 в 04:42
Обновил(-а) Gaen 15.04.2011 в 01:23

Я представляю это так:

Команды

- Вьюшка позволяет пользователю отдавать приложению определенные команды:
Примеры команд: "включить звук", "выключить звук", "перейти к биографии", "перейти к портфолио", "перейти к контактам"

- На уровне пользователя команды описываются в терминах бизнес-логики, и никак не связаны с реализацией.
Правильно: "показать портфолио", неправильно: "активировать модуль портфолио"
Правильно: "отправить сообщение", неправильно: "сформировать и отправить запрос на сервер"

- На уровне реализации некоторые команды объединяются в одну с вынесением параметра.
Команды "перейти к биографии", "перейти к портфолио", "перейти к контактам" объединяются в команду "перейти к модулю", где модуль является параметром.

Контроллер

- Контроллер знает, кто отвечает за выполнение каждой команды.
За команду может отвечать сам контроллер, один из его дочерних контроллеров, либо кто-то наверху.

- Контроллер знает, как реагировать на каждую команду.
Отвечает сам - выполнить, отвечает ребенок - напрячь его, отвечает кто-то сверху - сообщить родителю.

Вид

- Вью содержит элементы управления и знает, какие события могут от них придти.
Примеры элементов управления: кнопки, крутилки, переключатели.
Примеры событий: 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 исполняется примерно такой код:
Код AS3:
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 комбинации, открывающие доступ к разделам сайта!

Польза всего этого в том, что как бы мы не извращались с интерфейсом, все изменения останутся только в коде вью, не затронув ни строчки контроллера.
Размещено в MVC
Комментарии 13 Отправить другу ссылку на эту запись
Всего комментариев 13

Комментарии

Старый 31.03.2011 10:10 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
тема сисек не раскрыта)
а где же моделька?
Старый 31.03.2011 10:16 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Все просто и понятно, спасибо.

ЗЫ
Мои поздравления и велкоме ту блогс =)
Старый 31.03.2011 13:01 maxkar вне форума
maxkar
Минусы забыты. Вот допустим, я хочу меняющую цвет кнопку еще и в диалоге "yes/no/help" использовать. Что мне нужно сделать, чтобы это было удобно? Отдельный код писать все равно придется и я даже готов его написать. Только вот что получится? По аналогии с SiteMenuView YesNoCancelView? Только этот view какой-то странный. Он больше на Controller похож. Потому что "самого вью" у него нет, его задача переводить одни события в другие. События уровня "view" в события уровня эм.... контроллера/модели. Также, как и в SiteMenuView, кстати. Он вообще может не быть DisplayObject'ом, так как кнопочки можно в спрайт выложить (или просто кнопку выдать). Да, для него есть какой-то UI, но не факт, что он сам.

@cleptoman Моделька не заявлялась в названии темы . Хотя я с вами полностью согласен, интересно было бы посмотреть, где начинается моделька и как там с ней общается контроллер.
Старый 31.03.2011 13:56 dimarik вне форума
dimarik
 
Аватар для dimarik
Очень похож ваш SiteMenuView на GoF-медиатор (по сути он у Вас контроллер с отсутствием бизнес-логики) в классическом исполнении. Вью может быть агрегатором, точкой сбора нативных событий, обладать ссылками на детей для управления ими. Все управление элементами UI должно происходить только через нее.

Можно совместить логику (контроллер) и представление, но тогда этот конгломерат не удастся использовать повторно.
Старый 31.03.2011 14:19 easy.proger вне форума
easy.proger
Я лично всегда строю приложение исходя из опыта программирования под макос

- Controller, он слушает базовые события ( типа клаву мышь и т/д/ )
- от него наследуется View ( типа ImageView WebView и т/д/ вобщем типизированная вьюшка с какой то базовой логикой для этого типа объектов ) которая только показывает, что то расставляет, обновляет и т/д/ ( не каких MouseClick и отправить сообщения как у автора и в помине нету )
- от этой Вью наследуется модель, собственно в ней уже логика по управлению конкретно этим объектом
Старый 31.03.2011 14:54 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
То есть данные сами по себе не бывают? =)
Старый 31.03.2011 15:14 easy.proger вне форума
easy.proger
Цитата:
То есть данные сами по себе не бывают? =)
Если это мне - то причем тут данные ? Я показал как у меня то, что мне не понравилось у автора, всю систему расписывать долго и не к чему в данном контексте
Старый 31.03.2011 15:38 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
- от этой Вью наследуется модель, собственно в ней уже логика по управлению конкретно этим объектом
View extends Model extends Controller.
Я хочу создать только Model, зачем мне тянуть Controller?
Старый 31.03.2011 16:02 easy.proger вне форума
easy.proger
Цитата:
View extends Model extends Controller.
Я хочу создать только Model, зачем мне тянуть Controller?
Для этого есть разные подходы, я конкретно описывал ситуацию View Controller в базовом свете ( так как если смотреть шире и тут есть несколько других подходов ), но как бы то нибыло и какой бы подход не был, то что описал автор не в одном из возможных подходов не оправданно. А ты ( надеюсь не против ) зачем то уводишь меня в совсем другой разговор, хочешь поговорить глобально о MVC ? )
Старый 31.03.2011 16:39 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Нет, ты просто или не понимаешь понятие слово "наследование", или забыл, что множественного наследования для классов в AS3 нет, или предлагаешь наследовать Controller от Sprite, дав тем самым толчок к смешанию логики и отображения.
Старый 31.03.2011 19:15 easy.proger вне форума
easy.proger
Цитата:
Нет, ты просто или не понимаешь понятие слово "наследование", или забыл, что множественного наследования для классов в AS3 нет, или предлагаешь наследовать Controller от Sprite, дав тем самым толчок к смешанию логики и отображения.
Да, забыл, я говорил с точки зрения своего граф-движка на С++, на АС я не применял свой же подход ! ...

Неправ ! извеняюсь
Старый 01.04.2011 13:45 formid вне форума
formid
Psycho Tiger ты когда напишешь заключительную статью про мвс, народ в ожидании)
Старый 02.04.2011 13:42 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
У меня настолько изменился взгляд на парадигму MVC, что стоит, наверное, вообще написать всё сначала.
А вообще просто нет времени)
 
Последние записи от Gaen

 


Часовой пояс GMT +4, время: 20:47.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.