Tih*_*uan 8 delphi oop caching delphi-2006
在我们正在开发的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.
Run Code Online (Sandbox Code Playgroud)
用于计算的对象更改并且应重置和重新计算缓存的值并不罕见.到目前为止,我们通过使用观察者模式解决了这个问题:对象实现OnChange事件,以便其他人可以订阅,在更改和重置缓存值时得到通知.这种方法有效,但有一些缺点:
最后一个问题:你能否提出其他方法来实现缓存的计算值?
在我的工作中,我使用Bold for Delphi,它可以管理相互依赖的缓存值的无限复杂结构。通常每个变量只代表问题的一小部分。在这个框架中,这称为派生属性。派生是因为该值没有保存在数据库中,它只是依赖于数据库中的其他派生属性或持久属性。
这种属性背后的代码是用 Delphi 作为过程编写的,或者是用模型中的 OCL(对象约束语言)编写的。如果您将其编写为 Delphi 代码,则必须订阅依赖变量。因此,如果属性 C 依赖于 A 和 B,那么每当 A 或 B 更改时,在读取 C 时就会自动调用重新计算 C 的代码。所以第一次读取 C 时 A 也读取了 B(可能是从数据库中)。只要A和B不改变你就可以读取C并且获得非常快的性能。对于复杂的计算,这可以节省大量的 CPU 时间。
缺点和坏消息是 Bold 不再受到官方支持,你也无法购买它。我想如果你问足够多的人就可以得到,但我不知道哪里可以下载。大约在 2005-2006 年,它可以从 Borland 免费下载,但现在不再了。它尚未为 D2009 做好准备,因为必须有人将其移植到 Unicode。
另一种选择是来自Capable Objects的ECO with dot.net 。ECO 是 Visual Studio 中的一个插件。它是一个受支持的框架,与 Bold for Delphi 具有相同的想法和作者。许多事情也得到了改进,例如 GUI 组件使用数据绑定。Bold 和 ECO 都使用模型作为类、属性和链接的中心点。这些可以保存在数据库或 xml 文件中。使用 ECO 的免费版本,模型最多可以有 12 个类,但我记得没有其他限制。
Bold 和 ECO 包含的不仅仅是派生属性,它们可以提高您的工作效率,并允许您思考问题而不是数据库的技术细节或在您的情况下如何缓存值。欢迎您提出有关这些框架的更多问题!
编辑: 实际上有一个针对 Embarcadero 注册用户的 Bold for Delphi for D7 的下载链接,相当旧了......我知道 D2005、ad D2006 有更新。