几乎每个程序员一生都做过一次:如果变量的值发生变化,设置一些标志.总有很多属性,如果有变化,你想跟踪
在任何财产
在特定的财产
或者在一些属性中
除了在每次属性更改时更新的标准对象范围脏标志之外,我对以上情况实现"脏标志"功能的不同方式感兴趣.必须有比在每个二传手中加入"dirty = true"更好的东西:它看起来很丑陋而且是一项繁琐的工作.
对于我的DAO,我保留了从数据库中检索到的原始值的副本.当我发送它进行更新时,我只是将原始值与当前值进行比较.它的处理成本稍高,但比每个属性的脏标志要好得多.
编辑以进一步证明没有脏标志:如果属性返回其原始值,则没有办法反映出来,脏标志继续变脏,因为原始值丢失了.
我曾经有一个基本的Entity类,提供Dirty/Removed Logic.
在编写实体子类时,您可以执行以下操作:
public string Name { get { return name; } set { setValue("Name", value); } }
这很好,但有"丑陋的字符串"疾病......
今天,您可以使用Lambda表达式排除字符串:
set {setValue(x => x.Name, value);}
或者,我认为这是最好的解决方案,你可以使用AOP:
https://www.postsharp.net/
这样,您可以按属性定义操作.您创建一个属性并指定当用户更改关联属性时,该实体变脏.
此外,您可以在类(基本实体)中保留属性列表,该列表将记住更改的属性,并从AOP代码访问该列表.
我创建了一个名为的类DirtyValue
,它具有原始值和当前值.首次使用时,它会设置原始值和当前值.连续调用仅设置当前值.
您可以通过比较两者来判断它是否已更改,并使用名为IsDirty()的只读bool属性.使用此技术,您还可以访问原始值.
如果你设置一个"脏"标志意识到你保持状态.在某些时候,您需要根据该状态采取行动,否则您不需要保留该标志.那么问题就变成了:是否还有另一种触发所需行动的方法?发送某种消息?谁消耗"脏"状态并采取行动,是否有更清晰的通知接口?
在某些具有数据写入器任务和独立读取器任务的情况下,我给每个任务一个updateCount
变量.生成器在写入时递增其计数.每当读者醒来并发现其计数小于生产者的计数时,它会使用当前值进行更新.您需要对计数器溢出进行一些特殊处理,但实现起来非常简单.
我已经成功地应用于模拟这项技术 - 其中生成器是物理环路和读者在3D显示器.