Показать сообщение отдельно
Старый 23.12.2012, 15:08
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Очевидно, модель должна слушать этот объект на событие изменения, который тот должен будет послать ей. А после этого, уже послать своё событие об изменений состояния.
Итого, если мы меняем в модели данный на уровень глубже, то-есть например: model.auto.bmw = 0;
Не, лучше чтобы модель никого не слушала.
Т.е. если есть ребёнок - он сам диспетчит изменения
И кому надо - подписывается на ребёнка

Максимум - события всплывают до главной модели и кому надо подписываются на неё, ловя события детей.
Максимум2 - модель ловит события от детей и просто диспетчит переиначенные свои, но ничего не правит в других частях.

А если надо что-то делать при изменении детей с остальными данными - лучше сбоку контроллер навернуть (в модель не лазить!), и лучше чтобы тот кто меняет - сам вызывал метод контроллера меняющий другие части, или вызывал комманду. Просто так проще за всем уследить.

Бывает, конечно, что тому, кто меняет лучше не знать, например, о панельке со списком текущих событий в игре (ну в социалках бывает на экране вывешивают список ["созрел фрукт, надо собрать", "здание поломалось надо починить", ...]). Тогда создается контроллер, который слушает модель и правит список этот по необходимости (саму модель слушает, всплывающие изменения детей слушает).

Но в основном - события изменения частей модели и самой модели - это для обновления вида (согласовывать обновление вида через модель в разы проще чем вызывать непойми какие методы непонятно в когда появляющихся и исчезающих вьюшек), а не для того, чтобы изменить другие части и что-то пересчитать - иначе с зацикливанием событий не разгребёшь.

Цитата:
Меня это немного смущает, а что если иерархия вложенности будет ещё больше? Может быть есть другой способ, узнать в модели произошло чтение или запись в дочерних объектах?
Можно вручную после изменения ребёнка вызвать метод модели, например dispatchItemChange(item:Item), во всех местах.
Не самый плохой способ, даёт больше контроля над диспетчингом, может даже общие объемы кода будут меньше.
Недостаток понятен - нужно больше внимания, чтобы не забыть вызвать везде этот метод.
Но с другой стороны меньше гемороя с поиском багов в "автоматически" работающем диспетчинге, когда что-то обновляется в неподходящий момент, или того хуже - зацикливается.
На практике получается, что половина событий идет автоматом - половина вызвается вручную.


Последний раз редактировалось expl; 23.12.2012 в 15:23.