Паттерны для GUI.

blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Паттерны для GUI.

Post by blanko27 »

Мне никогда не приходилось реализовывать проекты связанные с GUI, а вот сейчас я присоединяюсь к проекту на .NET для которого мне нужно его разработать. Я почитал про MVC, HMVC, PAC etc., но не нашел решения для такой проблемы:
Имеется несколько компонентов GUI (ActiveX) которые с точки зрения MVC являются совмещенными View-Controller-ами (VC). Для простоты возьмем TextBox и Slider находящиеся на одной форме. Оба этих компонента изменяют значение одной и той же переменной. Передвижение Slider-а вызывает event связанный с этим компонентом в котором идет изменение значения переменной. Ввод нового значения через TextBox вызывает event связанный с TextBox-ом, который тоже изменяет значение этой переменной. С точки зрения MVC любое из этих изменений переменной (Модели) должно породить event Notify() для каждого из существующих View, т.е. для TextBox-а и Slider-а. Вот тут я и не могу понять - если например мы изменяли значение через TextBox, то он не должен реагировать на этот event Notify()? Т.е. должен существовать какой-то механизм фильтрования, предотвращающий повторное обновление того же самого VC-a?
Еще непонятнее в случае со Slider-ом. Он работает через event OnChange(), т.е. если мы переджинули движок Slider-а, то это вызывает event OnChange(), что в свою очередь вызывает изменение переменной Модели и, как следствие, возникновение event-а Notify(), что ведет к update-у того же Slider-а и появлению следующего event-а OnChange(), т.е. deadlock-у.
Т.е. я понимаю, что можно это обойти но для большой системы это не всегда очевидно. Существует-ли какой-то паттерн, работающий для совмещенных VC компонентов и отфильтровывающий VC-ы, инициаторы изменений, во избежание повторных обновлений и deadlock-ов?
Извините, получилось немного длинно, спасибо тем, кто дочитал до конца.
igrok
Уже с Приветом
Posts: 291
Joined: 25 Sep 2001 09:01

Post by igrok »

Mediator. Все VC подписываются не к модели напрямую, а через медиатор. Модель также подписывается к VC ненапрямую, а через все тот же медиатор. Action на одном из компонентов порождает event, который получает медиатор, который обновляет модель и посылает соответствующий update всем другим компонентам.
User avatar
DR_35_USA
Уже с Приветом
Posts: 1194
Joined: 07 Jul 2001 09:01
Location: Tomsk->Mountain View->Milpitas

Post by DR_35_USA »

Уродские все эти библиотеки что, господи прости, Windows Forms что, не к ночи будь помянут MFC. Выход - ПЕРЕПИСАТЬ УСЁ как нада!
Оно вроде и ни что-либо как, а приведись такое дело так вот тебе и пожалуйста.
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Спасибо за ответы! Вот, кстати, прикольная статья про этот паттерн:О том, как крутой программер Вася Ковырялкин посредника искал. , правда реализация на Java-е и с очередью сообщений (message queue). :)

Return to “Вопросы и новости IT”