OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Отделение Controller'а от View
СообщениеДобавлено: Вторник, 15 Апрель, 2008 11:26 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Что-то я не могу до конца уловить принцип, по которому в BlackBox происходит отделение Диспетчера (Controller) от Представления (View).
В тексте автора концепции MVC Трюгве Реенскауга говорится:
Цитата:
...a view should never know about user input, such as mouse operations and keystrokes. It should always be possible to write a method in a controller that sends messages to views which exactly reproduce any sequence of user commands.


Другими словами, контроллер отвечает за "приём" действий пользователя и уведомляет о них представления. Эта же мысль высказана в тексте документации к BlackBox "Составные документы":
Цитата:
Контроллер можно рассматривать как отделившуюся часть отображения. Он выполняет все взаимодействие с пользователем, включая обработку ввода с клавиатуры и манипуляций мышью, и он также управляет выделениями


То есть, отделение контроллера делается для проведения явной грани между отображением и реакцией на действия пользователя. Но если взглянуть на Views.View, то можно убедиться в том, что данное представление способно самостоятельно отзываться на действия пользователя. Например, "HandleCtrlMsg должна быть реализована в редактируемых отображениях. Процедура вызывается окружающим контейнером, если он считает получающее отображение текущим фокусом."

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Вторник, 15 Апрель, 2008 16:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну так технически-то все сообщения идут через отображение. А логически отображение может заиметь свой диспетчер и редиректить обработку ему, чтобы не напрягать себя столь каторжной работой. У контейнеров этот редирект уже зашит. Или Вы не про то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Вторник, 15 Апрель, 2008 20:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Илья Ермаков писал(а):
У контейнеров этот редирект уже зашит. Или Вы не про то?
У меня была такая же "методологическая проблема", оставшаяся не решенной. Каркас для общих контейнеров Containers.Container предусматривает наличие отдельного контроллера. А вот обычные отображения - делай как хошь. Либо сам обрабатывай (как в Obx примерах) либо контроллер заводи. А когда его заводить, исходя из каких соображений - тут ни одного примера нету.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Вторник, 15 Апрель, 2008 20:30 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Мне кажется, что есть небольшое рассогласование между "каноническими" текстами по MVC и блэкбоксовской реализацией MVC.

Диспетчер - и это видимо - появляется, когда выгоды от его использования перевешивают затраты на выделение и поддержку отдельной сущности. Но что это за сущность?

В классике, диспетчер отвечает за работу с пользователем, причём ввод получает именно диспетчер.
В Блэкбоксе, техническая реализация такова, что отображение получает ввод, и только потом передаёт его диспетчеру.

Не устаканивается у меня, короче :)
Наверное, лучше будет вначале описать проблему, которую я пытаюсь решить с помощью MVC.

Нужно построить пользовательский интерфейс для работы с таблицей базы данных, с использованием списка-браузера записей, и формы редактирования. Схема работы простая - в браузере надо выбрать запись, и нажать одну из кнопок редактирования списка - Добавить, Изменить, Удалить. Открывается форма, в которой можно править значения полей выбранной записи.

Так вот, мы с Петром прикинули, что тройку MVC тут можно нарисовать так. Модель позволяет получать данные из SQL-таблицы (список записей и данные выбранной записи) и записывать данные в таблицу (новая или исправленная запись). Одно представление отображает список записей, а другое - поля записи на форме. Ну и диспетчер, стало быть, отвечает за отработку действий пользователя.
Например, при нажатии кнопки браузера Добавить, создаётся представление формы, коннектится к модели и забирает с неё данные записи.

Если б ещё всю эту музыку положить на ноты Блэкбокса, то бишь, использовать уже готовые механизмы отображения и диспетчирования, получилось бы довольно изящно.
Только вот с диспетчером и заминка. Примерно так...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Понедельник, 16 Февраль, 2015 16:37 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Иван Кузьмицкий писал(а):
каким образом принять решение о выделении диспетчера в отдельную сущность?
Когда есть вероятность расширения или вообще замены "блока поведения" отображения, то лучше всего сразу заложить отдельный контроллер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Вторник, 17 Февраль, 2015 19:23 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Диспетчер какой-то многоуровневый, в ББ 3 уровня получается, как мне кажется.
1. Микроуровень с быстрым откликом реализуется в самом отображении как в примерах REPEAT в ObxLines и не отменяется.
2. Второй уровень, это передача сообщений через Controllers, это как-бы реализация диспетчера в каркасе (нам этот уровень уже предоставлен как бонус каркаса), мы лишь уточняем реакцию на то или иное сообщение на уровне отображения или модели
3. Третий уровень — это изменение модели в виде отменяемых операций, эти отменяемые операции, если их не одна штука как в ObxLines, логично выделять в отдельный модуль "бизнес-логики".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Вторник, 17 Февраль, 2015 19:30 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Иван Кузьмицкий писал(а):
В Блэкбоксе, техническая реализация такова, что отображение получает ввод, и только потом передаёт его диспетчеру.

Иван, а ты тут уверен? Ведь HandleCtrlMessage, это как раз обработка сообщений диспетчера, каркас за тебя уже получил пользовательский ввод, классифицировал, проецировал на кадр, отображение и передает сообщение в HandleCtrlMessage для уточнения реакции, а ты фильтруешь эти сообщения в некую логику работы приложения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отделение Controller'а от View
СообщениеДобавлено: Среда, 18 Февраль, 2015 09:25 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Иван Денисов писал(а):
Иван Кузьмицкий писал(а):
В Блэкбоксе, техническая реализация такова, что отображение получает ввод, и только потом передаёт его диспетчеру.

Иван, а ты тут уверен? Ведь HandleCtrlMessage, это как раз обработка сообщений диспетчера, каркас за тебя уже получил пользовательский ввод, классифицировал, проецировал на кадр, отображение и передает сообщение в HandleCtrlMessage для уточнения реакции, а ты фильтруешь эти сообщения в некую логику работы приложения.


Вот исходный текст обработчика сообщений контейнерного отображения:

Цитата:
PROCEDURE (v: View) HandleCtrlMsg* (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
BEGIN
IF v.controller # NIL THEN v.controller.HandleCtrlMsg(f, msg, focus) END;
v.HandleCtrlMsg2(f, msg, focus);
...
Сообщения сперва отправляются на обработку в контроллер, а затем передаются в метод наследника. Если понадобится изменить поведение контейнера, мы можем просто заменить контроллер, не ломая внутреннее устройство самого контейнера.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB