Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

Переносимый GUI.   Найти похожие ветки 

 
iZEN ©   (2005-08-16 23:32) [0]

Приветствую.
Сейчас читаю книжку про программную архитектуру пользовательского
интерфеса, и она навевает определённые мысли о эффективном "разделении
труда" между логикой и ГУИ.
(если кому интересно, могу сказать название, она есть в продаже, на
русском языке)

У нас задействованы следующие программные объекты:
+ Системная Очередь (SystemEventQueue) событий (нажатия клавиш,
позиционирование и указания мыши и т.д.);
+ Объекты-события (EventObject"s), которые формируются Очередью в ответ
на любое действие пользователя;
+ Компонент виджета (Object), принимающий от Очереди оповещения о
происходящих, обрабатывающий её Объекты-события;
+ Модель виджета (ObjectModel), инкапсулирующий логику поведения
виджета, хранящий внутреннее состояние (например, взведён ли значёк,
установлена ли радиокнопка, текст поля редактирования, текст метки, флаг
нажата/отпущена кнопка и т.д.);
+ Отображение виджета (ObjectUI), инкапсулирующий визуальное отображение
виджета в зависимости от состояния Модели (например, если влажок
взведён, то рисуется галочка; если кнопка нажата, то рисуется
"утопленная" кнопка, отпущена - "нормальная" кнопка; виджет неактивен -
изображается сереньким цветом и т.д.)
+ Прикладной объект слушателя (ClientListener) с методами обратного
вызова на соответствующие события.

Для начала опишу динамику работы подобной конструкции, а потом вкратце
обосную "статические" принципы архитектуры.

0. Пользователь произвёл какое-то действие в интерфейсе.
1. Системная Очередь событий получает от системы оповещение о действии
пользователя.
2. Системная Очередь событий создаёт Объект-событие и оповещает
Компонент виджета, что, мол, "его надо бы обработать", при этом сама
продолжает следить за системой (вдруг та ещё подкинет событий) -
асинхронное взаимодействие, так сказать.
3. Компонент виджета получает оповещение от Системной Очереди событий и
принимается "доставать" Объект событие из Системной Очереди событий и
обрабатывать его.
4. Обработка Объекта события заключается в установлении нового состояния
Модели виджета и оповещения Прикладных объектов слушателей о
произошедшем событии.
5. Компонент виджета так же следит за состоянием Модели виджета и
непосредственно управляет Отображением виджета в соответствии с этим
состоянием.
6. Модель виджета при изменении своего состояния оповещает Компонент
виджета о необходимости изменения Отображения виджета.

Итого имеем полный цикл обработки действия пользователя и отображения
виджета, который хорошо бы отобразить на диаграмме последовательностей
UML. Но пока обойдусь упрощённой схемой:

System -> SystemEventQueue
                                |
                               V
ObjectModel <-> Object -> ObjectUI
                                |
                               V
                      ClientListener

В схеме не показан UIManager, который управляет поведением (Feel) Модели
и отображением (Look) Отображения.

Теперь опишу "статику" архитектуры.

Понятно, что Системная Очередь событий представляет не что иное как нашу
"обёртку" над реальной низкоуровневой системной очередью событий и
представляет собой хранилище-контейнер ждущих обработки событий.

Объект-событие, формируемый Системной Очередью событий, представляет
собой объект, инкапсулирующий всю информацию, произошедшую в системе в
ответ на действие пользователя. Как то: тип события (нажатие/отпускание
клавиши, перемещение мыши, указание мышью с нажатием левой/правой кнопки
и т.д.).

Модель виджета представляет собой логическую модель поведения виджета,
полностью исключая из себя знание о способах отображения виджета на
дисплее. В ней сосредоточена модель поведения (Feel) конкретной
системной оболочки (Motif, Windows, Mac или собственная уникальная).

Отображение виджета является картинкой - объектом, умеющем нарисовать
себя в зависимости от состояния Модели виджета - это то, что
непосредственно видит пользователь на дисплее и с чем он "общается"
посредством клавиатуры и мыши.

Компонент виджета представляет собой ядро, объединяющее вокруг себя нити
управления всем этим хозяйством, но только для Системной Очереди событий
он является слушателем - только от неё он получает события в виде
Объектов событий. Кроме того, Компонент виджета является тем объектом, с
которым непосредственно работает программист - он кладёт его на форму,
назначает свои обработчики событий компонента (например,
объект-обработчик нажатия на кнопку), то есть для программиста Компонент
виджета является своеобразным "фасадом" над сложностями системы: есть
только Компонент виджета и написанные в приложении Прикладные объекты
слушателей.

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

Управление видом и поведением (LookAndFeel).
Управлением видом и поведением Компонентов виджетов занимается
специальный Менеджер ГУИ (UIManager). Он может настроить поведение
Модели виджета и Отображение виджета в соответствии с поведением (Feel)
и отображением (Look) системного виджета оконного менеджера той или иной
операционной системы. Соответственно, для адекватного предствления
виджета в том или ином стиле необходимо написать лишь необходимые
классы, описывающие поведение (логику, модель) и отображение (способ
отрисовки, вид) каждого из виджетов в конкретной операционной системе.
Таким образом можно получить независимый от операционной системы
интерфейс и, главное, - ОДИНАКОВЫЕ способы работы с ним в приложениях.

Что скажете?

P.S. Продолжаю читать дальше о нюансах отрисовок ГУИ и о том, как
избежать лавинообразного создания Объектов событий.


 
DrPass ©   (2005-08-16 23:54) [1]

ИМХО, абстрагирование - это одновременно сила и слабость ООП. Сила в том, что при определенном уровне абстрагирования можно создать довольно универсальное решение, которое будет повторно использовано и в других проектах. Слабость тут имеет субъективные корни - среднестатистический программист обычно не умеет вовремя остановиться, и в результате получаются вот такие "гибкие" монстры, несущие тонны бесполезной функциональности. Это уже программирование ради программирования, "вещь в себе".  Поэтому в команде программистов должен быть менеджер-непрограммист с неиспорченным ООП сознанием. Чтобы вовремя оборвать этот буйный полет фантазии.


 
delirium-system-2   (2005-08-17 00:10) [2]

DrPass ©   (16.08.05 23:54) [1]

http://anatolix.naumen.ru/files/books/design_patterns_rus.zip

Тоже ссылка
http://anatolix.naumen.ru/files/books/interface.zip


 
iZEN ©   (2005-08-17 16:45) [3]

DrPass ©   (16.08.05 23:54) [1].
Книжка про библиотеку JFC/Swing...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
14-1124310339
vecna
2005-08-18 00:25
2005.09.11
надумал заняться апгрейдом, появились вопросы по железу...


3-1122529322
cam
2005-07-28 09:42
2005.09.11
Перенос данных


2-1123309367
Андрей235
2005-08-06 10:22
2005.09.11
вывести в Caption или text integer переменную или string=integer


14-1123799659
Витёк
2005-08-12 02:34
2005.09.11
Выбор наибольшего числа!


14-1124216995
rts111
2005-08-16 22:29
2005.09.11
Test





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский