Цитата:
|
Мне кажется тут что-то неправильно. Из вью ничего не передается контроллеру, только уведомление, что была нажата та или иная кнопка, собственно смысл реализовать TouchEvent внутри вью?
|
Cмысл в том, что Модель ничего не должна знать ни о каких "кнопках". Модель оперирует другими понятиями — действиями пользователя.
КАК именно совершается действие — Модель не волнует. Контроллер как раз интерпретирует конкретные физические события Вьюхи "нажали клавишу S" в игровые события "пользователь совершил (запросил) действие ШагНазад". Вьюха, в частности, может предоставлять 15 способов совершить одно и то же игровое действие, и Модели не надо в этом разбираться, как и — внимание! — с тем, как Вью будет отображать изменения. Именно ради этой свободы и затевается MVC.
Цитата:
|
View - отправляет запрос контроллеру, типо TouchEvent - _controller.setX();
|
Вообще-то нет. Вью отправляет Событие. Тут такой момент, относящийся скорее к способу мышления. Пока ты пишешь так, что Вью
приказывает Модели setX() через Контроллер, у тебя всегда будет этот немой вопрос "а нафига мне контроллер". Вот у тебя в пальце находятся нервные окончания. Представь, что когда ты к чему-то прикасаешься, они дают приказ мозгу "Отдернуть руку!". Это то, как сейчас устроен твой код. С такой системой отношений ты не сможешь сделать ничего своими руками, даже носки надеть или взять чашку кофе. Палец не должен принимать решения за твой мозг. Он должен послать сигнал "я к чему-то прикоснулся, оно горячее/холодное твердое/мягкое". А мозг, обладающий ВСЕЙ картиной окружающего мира, решит что с этим делать. Это тот же самый принцип иерархии, как в отношениях родитель/ребенок. Кнопка не приказывает, она извещает что ее нажали и всё. Вью не может приказывать Модели, потому что она не должна ничего знать о Модели* (кроме тех свойств, которые Модель предоставляет для отображения**). А какова роль контроллера в этом примере с пальцем? Считается, что контроллеры позволяют управлять Режимами (Mode). Вообще-то в концепции MVC предполагается, что контроллеров может быть тьма тьмущая, и они постоянно сменяют друг друга в зависимости от того, в каком режиме находится Приложение в данный момент — идет бой, идет строительство, игра на паузе, мы в Инвентаре, мы в Меню, мы читаем Дневник заданий, мы смотрим видеозаставку и т.п. Очевидно, что во всех этих режимах одно и то же действие пользователя "нажал клавишу Стрелка Вверх" интерпретируется совершенно по-разному. А эта интерпретация и есть задача контроллера, поэтому в разных режимах подключаются разные контроллеры. Как, например, ты касаешься пальцем чайника с одной четкой задачей — определить, насколько он горячий. В этот момент твой контроллер подписан только на два ощущения — касания и температуры. Его не интересуют твердость и влажность чайника.
_____________
* — Прежде всего потому, что Вью это ДисплейЛист, а ДисплейЛист это проститутка, предоставляющая полный свободный доступ ко всем своим детям. Зловредный код может выцепить любой объект через getChildAt() и послать от него любое событие dispatchEvent(). И пофиг, что в твоих классах ссылки на эти объекты запрятаны в приват.
** — чтобы скрыть остальные члены Модели, Вьюхе и Контроллеру предоставляется ссылка на Модель не как на тип Model, а на два разных Интерфейса. В Интерфейсе для Вью описываются только функции-геттеры свойств для отображения, а в Интерфейсе для Контроллера — функции-методы для управления Моделью. Таким образом Вью ничего не знает о методах, а контроллер не имеет доступа к свойствам (за исключением, может быть, каких-то специальных свойств для контроллера, обычно флагов).