Этот вопрос является уточнением моего вопроса "Различные способы наблюдения за изменениями данных".
У меня все еще есть много классов в моем приложении C++, которые часто обновляются (или могут быть обновлены) в сложных математических процедурах и сложных частях бизнес-логики.
Если я выберу подход «наблюдатель» и отправлю уведомления каждый раз, когда значение экземпляра изменяется, у меня есть 2 больших риска:
- отправка самих уведомлений может серьезно замедлить работу приложений
- если элементы пользовательского интерфейса должны быть обновлены путем изменения, они обновляются при каждом изменении, что приводит, например, к экраны обновляются тысячи раз, пока выполняется какая-то часть бизнес-логики
Некоторые проблемы можно решить, добавив механизмы буферизации (когда вы отправляете уведомления, когда собираетесь начать работу с алгоритмом и когда алгоритм завершен), но поскольку бизнес-логика может выполняться во многих местах программного обеспечения, мы в конечном итоге добавление буферизации почти везде, после каждого возможного действия, выбранного в меню.
Вместо подхода «наблюдатель» я мог бы также использовать подход «маркировать-грязный», отмечая только те экземпляры, которые были изменены, и в конце действия сообщая пользовательскому интерфейсу, что он должен обновить себя.
Опять же, бизнес-логика может выполняться из любого места в приложении, поэтому на практике нам, возможно, придется добавить дополнительный вызов (указывающий всем окнам, что они должны обновить себя) почти после каждого действия, выполняемого пользователем.
Оба подхода имеют схожие, но противоположные недостатки:
- С подходом «наблюдатель» мы рискуем обновить пользовательский интерфейс слишком много раз.
- С подходом «отметить-грязный» у нас есть риск вообще не обновлять пользовательский интерфейс.
Оба недостатка можно устранить, внедрив каждое действие приложения в дополнительную логику (для наблюдателей: отправка уведомлений о начале-конце, для отметок-грязных: отправка уведомлений об обновлении себя).
Обратите внимание, что в не оконных приложениях это, вероятно, не проблема. Вы могли бы, например. используйте подход пометки-грязности, и только если для какого-либо расчета нужны данные, может потребоваться дополнительная обработка в случае, если данные грязные (это своего рода подход к кэшированию).
Однако для оконных приложений нет сигнала о том, что пользователь «смотрит на ваш экран» и что окна следует обновить. Таким образом, нет действительно хорошего момента, когда вам нужно смотреть на грязные данные (хотя вы могли бы проделать некоторые трюки с событиями фокуса).
Какое хорошее решение для решения этой проблемы? И как вы решали подобные проблемы в своем приложении?
Обратите внимание, что я не хочу вводить оконные методы в часть расчета/модели данных моего приложения. Если для решения этой проблемы необходимы оконные методы, их следует использовать только в части пользовательского интерфейса моего приложения.
Любая идея?