在我们正在开发的 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 事件,以便其他人可以订阅、在他们更改和重置缓存值时得到通知。这种方法有效,但有一些缺点:
- 管理订阅需要大量内存。
- 当缓存值依赖于大量对象(例如列表)时,它不能很好地扩展。
- 依赖关系不是很具体(即使缓存值仅依赖于一个属性,它也会在其他属性更改时重置)。
- 管理订阅会影响整体性能并且难以维护(对象被删除、移动……)。
- 目前尚不清楚如何处理取决于其他计算值的计算。
最后是一个问题:您能否提出其他实现缓存计算值的方法?