В приложении Delphi мы работаем над тем, что у нас есть большая структура связанных объектов. Некоторые свойства этих объектов имеют значения, которые вычисляются во время выполнения, и я ищу способ кэшировать результаты для более интенсивных вычислений. Подход, который я использую, сохраняет значение в частном члене при первом вычислении. Вот краткий пример:Подходы для кэширования расчетных значений
unit Unit1;
interface
type
TMyObject = class
private
FObject1, FObject2: TMyOtherObject;
FMyCalculatedValue: Integer;
function GetMyCalculatedValue: Integer;
public
property MyCalculatedValue: Integer read GetMyCalculatedValue;
end;
implementation
function TMyObject.GetMyCalculatedValue: Integer;
begin
if FMyCalculatedValue = 0 then
begin
FMyCalculatedValue :=
FObject1.OtherCalculatedValue + // This is also calculated
FObject2.OtherValue;
end;
Result := FMyCalculatedValue;
end;
end.
Это не редкость, что объекты, используемые для изменения расчета и кешированного значения должны быть сброшены и пересчитываются. До сих пор мы рассматривали эту проблему с помощью шаблона наблюдателя: объекты реализуют событие OnChange, чтобы другие могли подписаться, получать уведомления, когда они изменяют и перезапускают кешированные значения. Этот подход работает, но имеет некоторые недостатки:
- Для управления подписками требуется много памяти.
- Он плохо масштабируется, когда кешированное значение зависит от множества объектов (например, списка).
- Зависимость не очень конкретна (даже если значение кеша зависит только от одного свойства, оно будет сброшено также при изменении других свойств).
- Управление подписками влияет на общую производительность и сложно поддерживать (объекты удаляются, перемещаются, ...).
- Непонятно, как бороться с расчетами в зависимости от других рассчитанных значений.
И, наконец, вопрос: можете ли вы предложить другие подходы для реализации вычисленных значений кеширования?
Даже если отмечено «delphi», мне очень интересно узнать, был ли развит определенный образец. –
Я добавил тег Delphi так, чтобы он ограничивал предложения статическим типизированным, а не сборщиком мусора. – Tihauan