Мне никогда не приходилось реализовывать проекты связанные с 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-ов?
Извините, получилось немного длинно, спасибо тем, кто дочитал до конца.
Паттерны для GUI.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
-
- Уже с Приветом
- Posts: 291
- Joined: 25 Sep 2001 09:01
Mediator. Все VC подписываются не к модели напрямую, а через медиатор. Модель также подписывается к VC ненапрямую, а через все тот же медиатор. Action на одном из компонентов порождает event, который получает медиатор, который обновляет модель и посылает соответствующий update всем другим компонентам.
-
- Уже с Приветом
- Posts: 1194
- Joined: 07 Jul 2001 09:01
- Location: Tomsk->Mountain View->Milpitas
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
Спасибо за ответы! Вот, кстати, прикольная статья про этот паттерн:О том, как крутой программер Вася Ковырялкин посредника искал. , правда реализация на Java-е и с очередью сообщений (message queue).