Двойное оповещение об изменении объекта
От: thanks  
Дата: 07.06.09 07:58
Оценка:
Здравствуйте.

У меня следующая ситуация:
Контроллер подписан на события модели об изменении оной. Вид вызывает контроллер при изменении, допустим, ItemIndex в комбобоксе. При этом контроллер меняет модель и, получая оповещение об изменении модели, обращается к виду с тем, что бы тот поменял ItemIndex у комбобокса.
Вроде логично, но как-то неправильно, зачем получать оповещение, если это я же и поменял.
Подскажите, пожалуйста, как лучше разрулить данную ситуацию.
Re: Двойное оповещение об изменении объекта
От: Ромашка Украина  
Дата: 07.06.09 08:06
Оценка: 3 (2)
thanks написав(ла):
> У меня следующая ситуация:
> Контроллер подписан на события модели об изменении оной. Вид вызывает
> контроллер при изменении, допустим, ItemIndex в комбобоксе. При этом
> контроллер меняет модель и, получая оповещение об изменении модели,
> обращается к виду с тем, что бы тот поменял ItemIndex у комбобокса.

Это вы обычный биндинг описали или свой велосипед изобрели?

> Вроде логично, но как-то неправильно, зачем получать оповещение, если

> это я же и поменял.

Все более чем логично. Вид только пытается изменить модель через
контроллер. Логика модели может, например, не принять значение и
выбросить Exception.

> Подскажите, пожалуйста, как лучше разрулить данную ситуацию.


Не разруливать ее? Ибо все правильно и логично.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: Двойное оповещение об изменении объекта
От: thanks  
Дата: 07.06.09 08:37
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Это вы обычный биндинг описали или свой велосипед изобрели?

пока что свой велосипед

Р>Все более чем логично. Вид только пытается изменить модель через

Р>контроллер. Логика модели может, например, не принять значение и
Р>выбросить Exception.
А если взять, например, RichTextBox. В него юзер ввёл 5 КБ текста, этот текст в итоге попадает в модель, вызывает её изменение и эти же 5 КБ текста приходят обратно в вид.
Тут получается что лишний трафик бегает + состояние RichTextBox (текущее выделение, позиция курсора) сбросится из-за того, что снова задали этот же текст

А как быть с случаем когда логика не приняла текст и нужно сбросить текст на старый.
У меня получается, что все эти телодвижения вызывают повторные вызовы изменения модели и вида (вид-контроллер-модель-контроллер-вид-контроллер-модель)
Re[3]: Двойное оповещение об изменении объекта
От: Ромашка Украина  
Дата: 07.06.09 11:22
Оценка: 2 (1) -1
thanks написав(ла):
> А если взять, например, RichTextBox. В него юзер ввёл 5 КБ текста, этот
> текст в итоге попадает в модель, вызывает её изменение и эти же 5 КБ
> текста приходят обратно в вид.

На самом деле, пример с RichTextBox еще более показательный, ибо даже
если изменения текста приняты, не факт, что приняты в полном объеме или
в таком же виде. Например, заменены кавычки на " в вебе, вырезаны
инструкции "drop database" или еще какая-нибудь фигня.

> Тут получается что лишний трафик бегает + состояние RichTextBox (текущее

> выделение, позиция курсора) сбросится из-за того, что снова задали этот
> же текст

Сохраняйте выделение, позицию курсора перед изменением. И пытайтесь их
восстановить.

> А как быть с случаем когда логика не приняла текст и нужно сбросить

> текст на старый.

Считать текст свойства? Только так, даже если модель приняла текст. По
хорошему, изменение одного свойства в виде не подразумевает того, что в
модели изменится только одно свойство. Например, при изменении цены в
строке должна измениться сумма документа, при изменении текста должна
стать доступной кнопка сохранения и т.д. и т.п. Поэтому приблизительно так:
Изменяется что-то в виде. Контроллер получает событие, меняет что-то в
модели. Модель изменяет свое свойство (или несколько), выбрасывает
несколько событий контроллеру. Контроллер по каждому из событий
считывает свойство модели и присваивает его виду.

> У меня получается, что все эти телодвижения вызывают повторные вызовы

> изменения модели и вида
> (вид-контроллер-модель-контроллер-вид-контроллер-модель)

Это нормально. По другому, в общем случае, и не получится.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re: Двойное оповещение об изменении объекта
От: Stormblast http://www.myspace.com/stormblastblack
Дата: 07.06.09 13:35
Оценка: 2 (1)
Здравствуйте, thanks

Для MVC это нормально, но если это вызывает большие накладные расходы то нужно добавить проверку либо в метод изменения модели об источнике изменившем модель, либо во View добавить equals() для контролла ...
Re[4]: Двойное оповещение об изменении объекта
От: thanks  
Дата: 07.06.09 18:24
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Это нормально. По другому, в общем случае, и не получится.

Спасибо за разъяснение.
А есть какие-нибудь источники на тему MVC где бы рассказывалось про "проблемы использования".
Например, с этим вопросом я ковыряюсь несколько дней, думаю как получше сделать (благо время позволяет), а оказывается и так нормально.
Re[5]: Двойное оповещение об изменении объекта
От: Ромашка Украина  
Дата: 07.06.09 19:18
Оценка: 1 (1)
thanks написав(ла):
> А есть какие-нибудь источники на тему MVC где бы рассказывалось про
> "проблемы использования".

Это не ко мне — я ненавижу паттерны вообще и MVC в частности.

ЗЫ. Кстати, вам тоже спасибо — благодаря вам я понял, за что я их
ненавижу. За то, что отбивают у программиста желание думать в
терминах абстракции (модели) и заставляют думать в терминах паттерна.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[6]: Двойное оповещение об изменении объекта
От: MozgC США http://nightcoder.livejournal.com
Дата: 07.06.09 19:23
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Это не ко мне — я ненавижу паттерны вообще и MVC в частности.


Имхо ненавидеть их не надо. Просто часто паттерны навязываются людям даже тогда, когда они им не нужны. Вот это неправильно.
Re[7]: О паттернах проектирования
От: Ромашка Украина  
Дата: 07.06.09 20:29
Оценка:
MozgC написав(ла):
> Р>Это не ко мне — я ненавижу паттерны вообще и MVC в частности.
>
> Имхо ненавидеть их не надо. Просто часто паттерны навязываются людям
> даже тогда, когда они им не нужны. Вот это неправильно.

Паша, люди просто живут паттернами. Это нормально, это не повод
ненавидеть свою жизнь. Речь идет именно о введенном бандой четырех
понятии — паттерн программирования. Вне зависимости от нужен паттерн или
нет, невозможно описать решение терминами паттерна. Это, вообще говоря,
первый принцип сложных систем — система может быть описана только в
терминах суперсистемы. Несоблюдение этого простого принципа приводит к
убожествам вроде LineController вместо банального Brush, которые меня
тупо бесят.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re: Двойное оповещение об изменении объекта
От: IB Австрия http://rsdn.ru
Дата: 07.06.09 21:52
Оценка: 2 (1)
Здравствуйте, thanks, Вы писали:

T>Вроде логично, но как-то неправильно, зачем получать оповещение, если это я же и поменял.

Ну, из всего этого, логичен только этот вопрос.
В классическом MVC все выглядит немного по другому. Там непосредственно View получает оповещение от модели о том, что она изменилась, а вовсе не контроллер.
Такое поведение обладает рядом недостатков, в частности, наличием у View довольно серьезной логики и тем, что View обладает знаниями о модели, а также, лишними раундтрипами данных между моделью и другими слоями... Альтернативой является паттерн MVP (Model-View-Presenter). В терминологии Фаулера это больше всего похоже на Passive View. В этом случае наоборот, все проходит через контроллер(презентер), но уже безо всяких событий за их очевидной ненадобностью.
Событие об изменении прилетает в презентер, тот сначала меняет модель, а затем самостоятельно меняет нужный набор представлений, без лишних приседаний вокруг модели, поскольку и так знает, что нужно менять.

T>Подскажите, пожалуйста, как лучше разрулить данную ситуацию.

Тут сильно зависит от задачи.
Мы уже победили, просто это еще не так заметно...
Re[4]: Двойное оповещение об изменении объекта
От: IB Австрия http://rsdn.ru
Дата: 07.06.09 21:58
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Это нормально. По другому, в общем случае, и не получится.

В общем случае, только по другому и получается..
Мы уже победили, просто это еще не так заметно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.