MVC применительно к мастеру (Wizard)
От: opposer  
Дата: 26.12.07 15:07
Оценка:
Хочу запроектировать как следует на примере создания Мастера. MVC раньше не реализовывал. Посидел, подумал, идеи закончились. Какие идеи пришли:

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

-есть объект "хранилище данных". То, что ввел пользователь, сохраняется в нём.
-есть страница визарда. Набор контролов.
-есть контроллер страницы. Обладает страницей. Имеет указатель на хранилище данных. Имеет методы "загрузить данные в свою страницу", "сохранить данные со своей страницы".
-есть контроллер всего. Имеет визарда и массив контроллеров страниц. Подписан на события визарда "вперед", "назад" и "ссылка". Хранит номер текущей активной страницы, параметры "последняя ли страница" и "первая ли страница" (чтобы кнопки "вперед" и "назад" на форме были активны/неактивны).

Когда контроллер получает сообщение "нажато вперед" — он смотрит, какая сейчас страница активна, дает команду ее менеджеру "сохранить данные" и дает команду менеджеру следующей страницы "загрузить данные" и "отобразить страницу". (сделать ее visible например)

Вопросы:
-как будет при таком раскладе реализовываться обратная связь между формой и контроллером? откуда форма визарда узнает, выводить ли серым кнопку "вперед" (если находимся на последнем вопросе).

-как сделать эту всю развязку "как надо"?


Как я подозреваю, всё это уже давно придумано до меня, и был бы благодарен за рекомендацию, как сделать "как следует".
Re: MVC применительно к мастеру (Wizard)
От: nejest Беларусь  
Дата: 27.12.07 10:16
Оценка:
Здравствуйте, opposer, Вы писали:

O>Вопросы:

O>-как сделать эту всю развязку "как надо"?
В первую очередь забыть про кнопки, страницы и т.п. не нужные в данный момент детали. Самое главное: есть нейкий объект, который ведёт диалог с пользователем и тебе должно быть всёравно в каком виде этот диалог представляется.

O>Как я подозреваю, всё это уже давно придумано до меня, и был бы благодарен за рекомендацию, как сделать "как следует".

ИМХО самое главное для отвязывания для отвязывания — это сообщения( т.е. отображение не знает как у тебя хранятся данные, а лишь их получает в ответ на вопрос, а данные не знают как они будут выглядеть- не ихнее это дело).
... << RSDN@Home 1.2.0 alpha rev. 775>>
Re[2]: MVC применительно к мастеру (Wizard)
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 27.12.07 10:52
Оценка:
Здравствуйте, nejest, Вы писали:

N>В первую очередь забыть про кнопки, страницы и т.п. не нужные в данный момент детали. Самое главное: есть нейкий объект, который ведёт диалог с пользователем и тебе должно быть всёравно в каком виде этот диалог представляется.

Про "некий объект" тоже лучше забыть. Есть диалог с пользователем, который можно представить либо в виде последовательности действий, либо в виде дерева. И от этого "плясать" дальше...
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: MVC применительно к мастеру (Wizard)
От: Stanislav V. Zudin Россия  
Дата: 28.12.07 16:14
Оценка:
Здравствуйте, opposer, Вы писали:

O>Хочу запроектировать как следует на примере создания Мастера. MVC раньше не реализовывал.


O>-есть элемент управления "визард" с кнопками "вперед", "назад" и набором ссылок для переходов на следующие страницы.


Угу

O>-у него есть события "нажато "назад", "нажато Вперед", "нажата ссылка".


Угу, + "Финиш", чтобы завершить работу с дефолтными значениями.

O>-у него есть область для отображения ссылок и область для отображения страниц.


Ну допустим.

O>-есть объект "хранилище данных". То, что ввел пользователь, сохраняется в нём.


Угу

O>-есть страница визарда. Набор контролов.

O>-есть контроллер страницы. Обладает страницей. Имеет указатель на хранилище данных. Имеет методы "загрузить данные в свою страницу", "сохранить данные со своей страницы".

Какой смысл делить "Страницу" и "Контроллер страницы"? Т.к. связь между ними 1:1, то и быть им объединенными.

O>-есть контроллер всего. Имеет визарда и массив контроллеров страниц. Подписан на события визарда "вперед", "назад" и "ссылка". Хранит номер текущей активной страницы, параметры "последняя ли страница" и "первая ли страница" (чтобы кнопки "вперед" и "назад" на форме были активны/неактивны).


Что он у себя хранит — решается по ходу пьесы.
"последняя ли страница" и "первая ли страница", а также "можно ли двигаться дальше" и на какую именно страницу может вычисляться, исходя из введенных пользователем значений.
У меня Визард был весьма разветвленный, поэтому пришлось соорудить конечный автомат для переключения страниц.
Для линейного, может и контроллер вообще не нужен, и без него ясно, на какую страницу надо переходить.

O>Когда контроллер получает сообщение "нажато вперед" — он смотрит, какая сейчас страница активна, дает команду ее менеджеру "сохранить данные" и дает команду менеджеру следующей страницы "загрузить данные" и "отобразить страницу". (сделать ее visible например)


O>-как будет при таком раскладе реализовываться обратная связь между формой и контроллером? откуда форма визарда узнает, выводить ли серым кнопку "вперед" (если находимся на последнем вопросе).


"Страница" (она же "Контроллер страницы") перед отправкой события "нажато куда-то" проверяет данные, если ошибок нет, то отдает их "хранилищу данных" и шлет уведомление. Сама страницы не переключает.

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

O>-как сделать эту всю развязку "как надо"?

Не знаю, как надо, но делал так, как описано выше
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.