在我们正在开发的Delphi应用程序中,我们有一个包含大量相关对象的结构。这些对象的一些属性具有在运行时计算的值,我正在寻找一种缓存更加密集计算结果的方法。我采取的方法是在第一次计算时将值保存在私有成员中。以下是一个简短的示例代码:
计算所使用的对象发生变化时,缓存值应该被重置和重新计算并不罕见。到目前为止,我们通过使用观察者模式来解决这个问题:对象实现一个OnChange事件,以便其他对象可以订阅,当它们改变并重置缓存值时得到通知。这种方法有效,但也有一些缺点:
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事件,以便其他对象可以订阅,当它们改变并重置缓存值时得到通知。这种方法有效,但也有一些缺点:
- 管理订阅需要大量内存。
- 当缓存值依赖于大量对象(例如列表)时,它的可扩展性不好。
- 依赖关系不是非常具体(即使缓存值仅依赖于一个属性,当其他属性更改时它也会被重置)。
- 管理订阅会影响整体性能,并且很难维护(对象被删除、移动等)。
- 如何处理依赖于其他计算值的计算并不清楚。