|
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
MVC - эвенты
Всем привет. Немного врубаюсь в данный паттерн, но возник вопрос о например тач событиях. Где правильнее всего должна быть подписка на кнопки? Если во вьюшке, то я вынужден прибегать к выделению отдельного класса, в котором будет инициализирована подписка на все кнопки чтобы не замусорить отображение, в этой вьюшке, которая отправляет в контроллер сам факт нажатия. Но в чем суть контролера заключается? Если вся логика в модели, то у меня получается
View - отправляет запрос контроллеру, типо TouchEvent - _controller.setX(); Controller - setX()_model.setX(); Model - setX(); - тут логика и уже в обратку дипатч вьюшке. Мне кажется тут что-то неправильно. Из вью ничего не передается контроллеру, только уведомление, что была нажата та или иная кнопка, собственно смысл реализовать TouchEvent внутри вью? 2) Если реализовать TouchEvent внутри контроллера, тогда он должен хранить ссылку на вьюшку, только ради получения ссылок на дисплей обджекты. Но в таком случае, мне не приходится из вьюшки, отправлять контроллеру, а тот в свою очередь в модель. Получается просто контроллер-модель. В этом случае, я вижу больше логику, чем когда реализуется TouchEvent во вью, потому то таким образом, не надо лишний раз обращаться к контроллеру. В общем как-то так, поясните по факту, как всё же грамотнее будет или может я что упускаю. С другой стороны, если во вьюшке создается 10 объектов, которые присылает модель, получается, вьюшка, должна оповестить контроллер о том, что было создано 10 объектов и следовательно, если оно надо, в контроллере подписать все эти 10 объектов. Тут тоже очень смутно всё видится. И вот еще такой вопрос. Есть модель карты, есть модель интерфейса. Первая отвечает за всё, что связано с картой, отображение, удаление, сортировка, хранение и прочее. Модель интерфейса, хранит состояние тех же самых кнопок. Типо нажал на создать объект, у курсора появляется имедж и следует за ним(обработка слежения в модели карты), соответственно в модели интерфейса я ставлю флажок boolean isCreate. Но на этот isCreate, должна ссылаться модель карты, потому что если isCreate false, то модель карты обрубает обработку создания объекта на карте. Что это получается, мне надо передать ссылку модели интерфейса в модель карты? Будет ли это правильно? Или всё же мне надо просто расширить модель карты и перенести все состояния из модели интерфейса, в модель этой карты и вообще не разделять интерфейс от самого содержимого карты, ограничившись 2 вьюшками(ViewGUI,VewMap), 2 контроллерами(ControllerGUI,ControllerMap) и 1 моделью(MapModel). Последний раз редактировалось Godwarlock; 02.06.2017 в 04:22. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
_____________ * — Прежде всего потому, что Вью это ДисплейЛист, а ДисплейЛист это проститутка, предоставляющая полный свободный доступ ко всем своим детям. Зловредный код может выцепить любой объект через getChildAt() и послать от него любое событие dispatchEvent(). И пофиг, что в твоих классах ссылки на эти объекты запрятаны в приват. ** — чтобы скрыть остальные члены Модели, Вьюхе и Контроллеру предоставляется ссылка на Модель не как на тип Model, а на два разных Интерфейса. В Интерфейсе для Вью описываются только функции-геттеры свойств для отображения, а в Интерфейсе для Контроллера — функции-методы для управления Моделью. Таким образом Вью ничего не знает о методах, а контроллер не имеет доступа к свойствам (за исключением, может быть, каких-то специальных свойств для контроллера, обычно флагов).
__________________
Reality.getBounds(this); |
|
|||||
[+4 06.05.14]
|
Цитата:
Вообще особо мудрить не стоит. Если приложение базируется на 1 контролле, то контролл делает только 2 действия - пинает сервер и записывает в модель. Вью работает и живет по своим законам, каким вам надо, главное чтоб не было ссылок на контрол, а на модель только на чтение ( хотя запись тоже доступна, но делать так незя). Вот просто пример : жму кнопку на клаве, жопустим Интер - после чего, товарищ Якубович должен будет открыть нам слово. Что происходит : globalView -> hudView отслеживает нажатие клавиши, если никаких доп вещей в globalView не будет происходить, то через bubbles сразу отправляем событие в контролл. В контролле - вызов серверного метода, сервер отвечает, - получаем данные, открыта буква Д. Пихаем эти данные в модель, в самой же моделе идет проверка, если Д это последняя буква слова, то слово готово ну или типа того, не суть, вообщем работает логика. Соответсвенно модель после отработки логики - посылает событие во вью, где новые данные отображаются на экране, ЛИБО!!!!! - это может сделать контроллер!!! К примеру :
__________________
Марк Tween |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
|
|
|||||
[+4 06.05.14]
|
Цитата:
__________________
Марк Tween |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Wolsh В общем по сути это своего рода автоматизация по системе событий. Должна ли модель слушать контроллер?
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Модель никого не слушает, у нее ссылок ни на кого нет.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Цитата:
Модель - это такая прослойка которая выдает текущее состояние, как она это состояние получила сама посчитала/от сервера получила/с диска прочитала это уже сугубо проблемы модели. потому что только объекты этой модели могут знать об актуальности/наличии/отсутствии своих данных. К примеру почта. Вью спрашивает данные о письмах у модели, модель смотрит ага, данных у меня нет, посмотрю на диске, на диске нет спрошу у сервера, пришли данные от сервера запишу их на диск и отдам остальным, при следующем запросе писем она посмотрит уже у себя и затем на диске и отдаст вьюхе. туда же можно докрутить слижение за актуальностью, к примеру если при запросе время последнего обновления писем меньше чем 1 сек то не спрашивать сервер, скорее всего ничего не поменялось. Контроллер - эта прослойка выполняет роль контроля создания и взаимодействия с вью и хранит ссылку на модель. К примеру окно почты: оно сконструировано по инициативе контроллера, в конструктор передана ссылка на контроллер, при нажатии на кнопку обновить информацию о письмах она вызывает в обработчике события controller.executeMailUpdate(), где и описана логика обновления и всех необходимых проверок что можно ли в данный момент тревожить модель с этой просьбой (если обновлять нельзя то создает окно с ошибкой), и теперь предположим мы делаем туториал, где один из шагов научить пользователя работать с почтой, мы просто создаем другой контроллер наследник базового и переопределяем метод executeMailUpdate где к примеру запускается следующий шаг туториала. при этом мы не влезаем в механизмы базового контроллера и не модифицируем код модели, не модифицируем вью Представление(Вью) - эта прослойка выполняет роль отображения текущего состояния и вызов нужных методов контроллера при действиях пользователя. Безусловно должен быть грамотно продуман цикл жизни вью, обычно он следующий конструктор(передали контроллер),awake(подписались на изменения модели данных (ссылку на модель можно получить из контроллера)),sleep(отписались), могут быть дополнительные шаги вроде update, finalize. В обработчике событий от модели изменяем текущее состояние (например очищаем все и заполняем заново). Конечно у вью может быть свое состояние и свои данные, например сколько соскролил пользователь в списке с письмами, чтобы при поступлении новых данных не сбрасывать скрол, но эти данные состояния живут во вью пока живет она, больше они не пригодятся. Если же все таки есть такие данные которые живут дольше (к примеру сохранять состояние прочитанных писем), то такие данные определенно должны храниться в модели. Что касается темы то события ввода TouchEvent, MouseEvent это лишь специфика вью и их обработка должна находиться там так же как и специфика отображения, к примеру ты делаешь изометрическую карту на сцене и в углу мини карту упрощенную, то для обоих вариантов будет одна и та же модель данных. а свое внутренне состояние куда проскролилось, как отобразилось, как нажалось это уже обязанности вью.
__________________
RocketJump Последний раз редактировалось Nooob; 02.06.2017 в 23:17. |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Спасибо всем за ответы, особенно Wolsh-у за очень грамотное толкование mvc и как оно должно по сути работать, мне прям вот этого вообще не хватало очень) Еще раз спасибо)))
|
|
|||||
[+4 06.05.14]
|
Nooob - что то ваш идеальный мир - не очень то и идеален.
Хотя бы так : само слово модель это что? Пример - модель САМОЛЕТА. Модель грубо говоря завершенный экскиз, в котором можно менять детали, добавлять, удалять, с помощью ластика, например ( если модель на бумаге). Но эта модель простите сама не спрашивает у творца - как думаешь, зафигарить мне 3е крыло а? Ничего модель никому спрашивать не должна, я так считаю.
__________________
Марк Tween |
Часовой пояс GMT +4, время: 12:24. |
|
« Предыдущая тема | Следующая тема » |
|
|