Зависимости между объектами. Описание и анализ.
От: Аноним  
Дата: 26.01.11 23:02
Оценка:
Например, объект Б зависит от А, Г зависит от Б, Д зависит от Б и В.
То есть, если изменился объект А, но нужно обновить и зависимый от него Б. При этом, естественно, Б может измениться. Если изменится, то придется обновлять Д, так как он зависит от Б.

А как объект Б узнает о том, что А изменился?
Ну, например, он может сравнить А с имеющейся у него копией А.
Или сравнить не сами объекты А, а только их отметки времени или хеши.
Еще вариант, что объект А, изменившись, сам разошлет уведомления, или взведет глобальный флаг "А изменился".

В итоге, программа захламляется булевскими флажками, вспомогательными переменными и кусками кода, подобными этому:

if (needUpdate) {
  DoUpdate();
  needUpdate=false;
  needRedraw=true;
}

positionCur=GetPosition();
if (positionCur!=positionPrev || needRedraw) {
  Draw(positionCur);
  positionPrev=positionCur;
  needRedraw=false;
}


И все, логика программы уже не видна за этим нагромождением вспомогательного кода!

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

Еще есть простой способ: написать мега-функции UpdateAll(), RedrawAll() и звать их при каждом чихе. А можно еще и по таймеру, на всякий случай...
Но этот простой способ работает только для простых случаев. Если же объектов много и/или их обновление недешево, то тормоза и моргания экрана будут обеспечены.

Я регулярно пишу такие программы. Рисую схемы зависимостей, анализирую. Пытаюсь придумать схему для оптимального обновления, или, наоборот, делаю функцию UpdateAll(). Пишу код, подобный вышеприведенному. Пытаюсь сделать его удобочитаемым, запихивая вспомогательные переменные в классы, а операторы сравнений — в функции.
И всякий раз у меня возникает ощущение, что я изобретаю велосипед.

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