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中作为过程或在模型中的OCL(对象约束语言)中编写.如果你把它写成Delphi代码,你必须订阅依赖变量.因此,如果属性C依赖于A和B,则每当A或B更改用于重新计算的代码时,在读取C时将自动调用.所以第一次读取C时也读取A和B(可能来自数据库).只要A和B没有改变,你就可以阅读C并获得非常快的性能.对于复杂的计算,这可以节省大量的cpu时间.
缺点和坏消息是Bold不再受到官方支持,你也买不到它.如果你问足够多的人,我想你可以得到,但我不知道你可以在哪里下载它.在2005-2006左右,它可以从Borland免费下载,但现在不能再下载了.
它还没有为D2009做好准备,因为有人必须将它移植到Unicode.
另一个选项是ECO with dot.net from Capable Objects.ECO是Visual Studio中的一个插件.这是一个支持的框架,与Delphi的Bold具有相同的想法和作者.许多事情也得到了改进,例如数据绑定用于GUI组件. Bold和ECO都使用模型作为具有类,属性和链接的中心点.这些可以保存在数据库或xml文件中.使用ECO的免费版本,该模型最多可以有12个类,但我记得没有其他限制.
粗体和ECO包含的不仅仅是派生属性,它们可以提高您的工作效率,让您可以考虑问题而不是数据库的技术细节,或者在您的情况下如何缓存值.欢迎您提出有关这些框架的更多问题!
编辑:
实际上有一个下载link for Embarcadero registred users for Bold for Delphi for D7,很老……我知道有D2005的更新,广告D2006.