在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',我也很有兴趣知道是否已经开发出特定的模式。 – 2009-10-08 08:41:12
我添加了Delphi标签,以便将建议限制为静态类型,而不是垃圾收集语言。 – Tihauan 2009-10-08 08:47:32