Тема: MVC - эвенты
Показать сообщение отдельно
Старый 02.06.2017, 23:02
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 6  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Цитата:
Сообщение от in4core Посмотреть сообщение
Ваще не обязательно. Модель должна работать с данными, обрабатывать их - а не контролировать их обмен извне.
В моем идеальном мире:
Модель - это такая прослойка которая выдает текущее состояние, как она это состояние получила сама посчитала/от сервера получила/с диска прочитала это уже сугубо проблемы модели. потому что только объекты этой модели могут знать об актуальности/наличии/отсутствии своих данных. К примеру почта. Вью спрашивает данные о письмах у модели, модель смотрит ага, данных у меня нет, посмотрю на диске, на диске нет спрошу у сервера, пришли данные от сервера запишу их на диск и отдам остальным, при следующем запросе писем она посмотрит уже у себя и затем на диске и отдаст вьюхе. туда же можно докрутить слижение за актуальностью, к примеру если при запросе время последнего обновления писем меньше чем 1 сек то не спрашивать сервер, скорее всего ничего не поменялось.

Контроллер - эта прослойка выполняет роль контроля создания и взаимодействия с вью и хранит ссылку на модель. К примеру окно почты: оно сконструировано по инициативе контроллера, в конструктор передана ссылка на контроллер, при нажатии на кнопку обновить информацию о письмах она вызывает в обработчике события controller.executeMailUpdate(), где и описана логика обновления и всех необходимых проверок что можно ли в данный момент тревожить модель с этой просьбой (если обновлять нельзя то создает окно с ошибкой), и теперь предположим мы делаем туториал, где один из шагов научить пользователя работать с почтой, мы просто создаем другой контроллер наследник базового и переопределяем метод executeMailUpdate где к примеру запускается следующий шаг туториала. при этом мы не влезаем в механизмы базового контроллера и не модифицируем код модели, не модифицируем вью

Представление(Вью) - эта прослойка выполняет роль отображения текущего состояния и вызов нужных методов контроллера при действиях пользователя. Безусловно должен быть грамотно продуман цикл жизни вью, обычно он следующий конструктор(передали контроллер),awake(подписались на изменения модели данных (ссылку на модель можно получить из контроллера)),sleep(отписались), могут быть дополнительные шаги вроде update, finalize. В обработчике событий от модели изменяем текущее состояние (например очищаем все и заполняем заново). Конечно у вью может быть свое состояние и свои данные, например сколько соскролил пользователь в списке с письмами, чтобы при поступлении новых данных не сбрасывать скрол, но эти данные состояния живут во вью пока живет она, больше они не пригодятся. Если же все таки есть такие данные которые живут дольше (к примеру сохранять состояние прочитанных писем), то такие данные определенно должны храниться в модели.

Что касается темы то события ввода TouchEvent, MouseEvent это лишь специфика вью и их обработка должна находиться там так же как и специфика отображения, к примеру ты делаешь изометрическую карту на сцене и в углу мини карту упрощенную, то для обоих вариантов будет одна и та же модель данных. а свое внутренне состояние куда проскролилось, как отобразилось, как нажалось это уже обязанности вью.
__________________
RocketJump


Последний раз редактировалось Nooob; 02.06.2017 в 23:17.