OberonCore https://forum.oberoncore.ru/ |
|
Отделение Controller'а от View https://forum.oberoncore.ru/viewtopic.php?f=6&t=950 |
Страница 1 из 1 |
Автор: | Иван Кузьмицкий [ Вторник, 15 Апрель, 2008 11:26 ] |
Заголовок сообщения: | Отделение Controller'а от View |
Что-то я не могу до конца уловить принцип, по которому в 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 должна быть реализована в редактируемых отображениях. Процедура вызывается окружающим контейнером, если он считает получающее отображение текущим фокусом." Получается, грань размывается, и отсюда возникает вопрос - каким образом принять решение о выделении диспетчера в отдельную сущность? Применить методологический принцип, так сказать... |
Автор: | Илья Ермаков [ Вторник, 15 Апрель, 2008 16:29 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Ну так технически-то все сообщения идут через отображение. А логически отображение может заиметь свой диспетчер и редиректить обработку ему, чтобы не напрягать себя столь каторжной работой. У контейнеров этот редирект уже зашит. Или Вы не про то? |
Автор: | Евгений Темиргалеев [ Вторник, 15 Апрель, 2008 20:14 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Илья Ермаков писал(а): У контейнеров этот редирект уже зашит. Или Вы не про то? У меня была такая же "методологическая проблема", оставшаяся не решенной. Каркас для общих контейнеров Containers.Container предусматривает наличие отдельного контроллера. А вот обычные отображения - делай как хошь. Либо сам обрабатывай (как в Obx примерах) либо контроллер заводи. А когда его заводить, исходя из каких соображений - тут ни одного примера нету.
|
Автор: | Иван Кузьмицкий [ Вторник, 15 Апрель, 2008 20:30 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Мне кажется, что есть небольшое рассогласование между "каноническими" текстами по MVC и блэкбоксовской реализацией MVC. Диспетчер - и это видимо - появляется, когда выгоды от его использования перевешивают затраты на выделение и поддержку отдельной сущности. Но что это за сущность? В классике, диспетчер отвечает за работу с пользователем, причём ввод получает именно диспетчер. В Блэкбоксе, техническая реализация такова, что отображение получает ввод, и только потом передаёт его диспетчеру. Не устаканивается у меня, короче Наверное, лучше будет вначале описать проблему, которую я пытаюсь решить с помощью MVC. Нужно построить пользовательский интерфейс для работы с таблицей базы данных, с использованием списка-браузера записей, и формы редактирования. Схема работы простая - в браузере надо выбрать запись, и нажать одну из кнопок редактирования списка - Добавить, Изменить, Удалить. Открывается форма, в которой можно править значения полей выбранной записи. Так вот, мы с Петром прикинули, что тройку MVC тут можно нарисовать так. Модель позволяет получать данные из SQL-таблицы (список записей и данные выбранной записи) и записывать данные в таблицу (новая или исправленная запись). Одно представление отображает список записей, а другое - поля записи на форме. Ну и диспетчер, стало быть, отвечает за отработку действий пользователя. Например, при нажатии кнопки браузера Добавить, создаётся представление формы, коннектится к модели и забирает с неё данные записи. Если б ещё всю эту музыку положить на ноты Блэкбокса, то бишь, использовать уже готовые механизмы отображения и диспетчирования, получилось бы довольно изящно. Только вот с диспетчером и заминка. Примерно так... |
Автор: | Иван Кузьмицкий [ Понедельник, 16 Февраль, 2015 16:37 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Иван Кузьмицкий писал(а): каким образом принять решение о выделении диспетчера в отдельную сущность? Когда есть вероятность расширения или вообще замены "блока поведения" отображения, то лучше всего сразу заложить отдельный контроллер.
|
Автор: | Иван Денисов [ Вторник, 17 Февраль, 2015 19:23 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Диспетчер какой-то многоуровневый, в ББ 3 уровня получается, как мне кажется. 1. Микроуровень с быстрым откликом реализуется в самом отображении как в примерах REPEAT в ObxLines и не отменяется. 2. Второй уровень, это передача сообщений через Controllers, это как-бы реализация диспетчера в каркасе (нам этот уровень уже предоставлен как бонус каркаса), мы лишь уточняем реакцию на то или иное сообщение на уровне отображения или модели 3. Третий уровень — это изменение модели в виде отменяемых операций, эти отменяемые операции, если их не одна штука как в ObxLines, логично выделять в отдельный модуль "бизнес-логики". |
Автор: | Иван Денисов [ Вторник, 17 Февраль, 2015 19:30 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Иван Кузьмицкий писал(а): В Блэкбоксе, техническая реализация такова, что отображение получает ввод, и только потом передаёт его диспетчеру. Иван, а ты тут уверен? Ведь HandleCtrlMessage, это как раз обработка сообщений диспетчера, каркас за тебя уже получил пользовательский ввод, классифицировал, проецировал на кадр, отображение и передает сообщение в HandleCtrlMessage для уточнения реакции, а ты фильтруешь эти сообщения в некую логику работы приложения. |
Автор: | Иван Кузьмицкий [ Среда, 18 Февраль, 2015 09:25 ] |
Заголовок сообщения: | Re: Отделение Controller'а от View |
Иван Денисов писал(а): Иван Кузьмицкий писал(а): В Блэкбоксе, техническая реализация такова, что отображение получает ввод, и только потом передаёт его диспетчеру. Иван, а ты тут уверен? Ведь 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); ... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |