Опять про MVC

ForJest

- свежая кровь
Ямерт
Угу. Я уже начитался. То что ты сказал SuperAction назвали FrontController.
Согласен. Action зависит напрямую от запроса, данных которые пришли. И лишь controller может решить что будет делаться, поэтому оно типа включается внутрь.
Но. Есть один момент. Данные изменяются до того, как начинается вывод. Всегда это так происходит.
Ну и получается что на контроллер (Я говорю о PageController) возложены роли
1. решить что делать
2. сделать
3. устанровить состояние модели
4. выбрать View
5. передать управление View.
----------------------------------------
Если я всё правильно понимаю то причина, по которой пункты 2 и 4 находятся в "одной коробке" это п.1.
Окей - получается контроллер должен владеть информацией о том, что делать для того чтобы правильно выбрать View и привести модель в нужное состояние.
Если мы избавим его он проблемы выбора - тогда у него останется один View. И автоматически исчезнет необходимость в выполнении Actions именно конкретным PageController - это может сделать FrontController перед вызовом PageController.
т.е. цепочка
1. Решить что делать - найти нужный PageController
2. Выполнить Actions для этого случая
3. Передать управление PageController.
Но PageController лучше всех знает что ему нужно делать получается, поэтому лучше Actions отдать ему :)....
------------------------------------
В общем я понял. При MVC подходе приложение обретает древовидную структуру.
В узлах стоят FrontControllers. А листьями идут PageController.
Т.е. если какой-то PageController стал слишком сложным, его нужно разбить на несколько "листьев" и преобразовать его в узел, который будет управлять вновь созданными листьями. Так можно гибко наращивать структуру приложения, что есть гуд.
Опять же это создаёт оптимальное дерево для передачи событий/управления.
 

Alexandre

PHPПенсионер
Это ошибка. Апдейт данных делает контроллер. Посмотри на PageController на схему - там всё написано.
Модель _предоставляет данные_. А не занимается их обработкой. Обработкой занимается типа контроллер. Он занимается всеми изменениями - это его роль - решать и изменять.
Остальные две роли пассивные.
Модель - имеет входы для настройки себя перед выводом
View - спрашивает модель данные, в которых он нуждается
ForJest у каждого свои взгляды на грань между Моделью и Контроллером.
На мой взгдяд, Контроллер должен управлять входными данными и процессами, т.е. вызывать соответствующие классы Модели и Представления.

Модель, на то она и Модель, чтоб отвечть за логику работы приложения, в том числе и за решение Апдейтить данные или их игнорировать.

-~{}~ 22.08.05 12:54:

В общем я понял. При MVC подходе приложение обретает древовидную структуру.
В узлах стоят FrontControllers. А листьями идут PageController.
Т.е. если какой-то PageController стал слишком сложным, его нужно разбить на несколько "листьев" и преобразовать его в узел, который будет управлять вновь созданными листьями. Так можно гибко наращивать структуру приложения, что есть гуд.
Вообще, я использую PageController,
который htfkbpetn несколько классов Модели, т.е. если мы емеем, например Прайс Лист, то он имеет вид:
Категория-----> Позиция
соответственно появляется два класса модели:
Category
Position

это позволяет избежать типовой ситуации: ПОВТОРЕНИЕ КОДА
 

_RVK_

Новичок
Кстати, говоря о "SuperAction". В Struts есть такая вещь как класс RequestProcessor, который обрабатывает ВСЕ запросы - потом выбирает нужный Action
Ну нет уж. RequestProcessor или диспечер это в моеей реализацции носит название MainController. Для того и придуманы SuperAction что бы сделать MainController как можно более универсальным. SuperActions это как бы дополнительный слой между MainController и Action
 

ForJest

- свежая кровь
Alexandre
Грань проходит не между контроллером и моделью по части Actions. А между FrontController PageController. Просто Actions положили в контроллер, потому что выше их не поднять, о чём я привёл размышления постом выше.
Если ты используешь PageController то есть классическая схема, которая хорошо описана по ссылке:
http://patternshare.org/default.aspx/Home.PP.PageController
Можно наделить правом изменять данные и View - и приложение будет работать. Просто получится мешанина.
Так все занимаются своим делом, и только своим делом.
----------------------------------------
Так можно и управление входными данными возложить на модель - ведь именно же она теперь знает какие ей данные нужны? Для изменений своего состояния. Потом контроллер начинает спрашивать уже у модели о её состоянии, вместо того чтобы приводить её в нужное.
- Милая у тебя апдейты произошли? Уже можно выводить?
Или там ошибочки?
Так контроллер перестаёт быть контроллером, вот и всё - он теряет свою роль.
---------------------------------------
Я не вижу причин, почему некоему классу, который умеет выбирать данные поручать ещё и их изменение.
Есть GET и POST. Есть set_* и get_*. Есть рефакторинг, который называется "Разделение запроса и модификатора".
Хорошо - у тебя в модели есть набор несвязанных методов - одни для изменения, другие для выборки. Так раздели её на два независимых класса - это будет правильно :).
Но это уже совсем другая беседа, пожалуй :).
 

Alexandre

PHPПенсионер
Но это уже совсем другая беседа, пожалуй :).
пожалуй нет...

значить мы на Контролер накладываем обязанность работать с данными, и управлять классами модели??

т.е. таким образом он является логической частью модели.
Возможно в идеалогии FrontController и PageController это правильно.

Но если page несколько, а не один index.php
и у каждой из них свой контроллер, который рулит экшенами.
мы что, контроллер будем нагружать логикой??

Мне всегда казалось, что Логика, это преригатива Модели.
Модель может состоять из нескольких частей (классов), каждый из которых отвечает за часть логики Модели...

Роль Контроллера - в общим управлении процессом, синхронизации Модели и Представления.
 

ForJest

- свежая кровь
Alexandre
Т.е. у тебя несколько корней дерева и ты имеешь проблемы с тем, что твоя структруа превращается в граф, вместо дерева.
Конечно, если у тебя граф - то вопрос снимается. В графе можно всё :). Ну и странные такие возникают решения.
 

Alexandre

PHPПенсионер
ForJest ничего и не странные...

очень удобно, если у тебя логика переходов нелинейная, т.е. с одной формы идешь на вторую, потом на третью, а с нее возвращаешься на первую...
 

BlackSabbath

Новичок
MVC 2

Из SmallTalk растёт классический MVC, а из Struts'а растёт то, что J2EE developer'ы называют MVC2.

На самом деле полезно почитать не только для J2EE developer'ов. Не даром порты Struts'а на PHP появляются как грибы после дождя.

J2EE patterns

Common J2EE patterns diagram
 
Сверху