Например, объект
Б зависит от
А,
Г зависит от
Б,
Д зависит от
Б и
В.
То есть, если изменился объект
А, но нужно обновить и зависимый от него
Б. При этом, естественно,
Б может измениться. Если изменится, то придется обновлять
Д, так как он зависит от
Б.
А как объект
Б узнает о том, что
А изменился?
Ну, например, он может сравнить
А с имеющейся у него копией
А.
Или сравнить не сами объекты
А, а только их отметки времени или хеши.
Еще вариант, что объект
А, изменившись, сам разошлет уведомления, или взведет глобальный флаг "
А изменился".
В итоге, программа захламляется булевскими флажками, вспомогательными переменными и кусками кода, подобными этому:
if (needUpdate) {
DoUpdate();
needUpdate=false;
needRedraw=true;
}
positionCur=GetPosition();
if (positionCur!=positionPrev || needRedraw) {
Draw(positionCur);
positionPrev=positionCur;
needRedraw=false;
}
И все, логика программы уже не видна за этим нагромождением вспомогательного кода!
Для простых случаев, когда объектов и зависимостей мало, еще как-то можно разобраться. Да и то, бывают трудноуловимые ошибки, когда что-то не обновилось, не отрисовалось...
Еще есть простой способ: написать мега-функции
UpdateAll(),
RedrawAll() и звать их при каждом чихе. А можно еще и по таймеру, на всякий случай...
Но этот простой способ работает только для простых случаев. Если же объектов много и/или их обновление недешево, то тормоза и моргания экрана будут обеспечены.
Я регулярно пишу такие программы. Рисую схемы зависимостей, анализирую. Пытаюсь придумать схему для оптимального обновления, или, наоборот, делаю функцию
UpdateAll(). Пишу код, подобный вышеприведенному. Пытаюсь сделать его удобочитаемым, запихивая вспомогательные переменные в классы, а операторы сравнений — в функции.
И всякий раз у меня возникает ощущение, что я изобретаю
велосипед.
Есть ли что-нибудь готовое на эту тему? Теория, терминология, библиотеки классов? Способы графического описания зависимостей между объектами, диаграммы?