【发布时间】:2018-09-12 08:10:16
【问题描述】:
我正在为我用 C# 开发的软件的一部分实现撤消/重做功能。发生撤消/重做操作的数据存储为对象列表List<MyClass>。在某些情况下,列表的大小可能会变大 (>1k)。
我希望用户尽可能多地撤消/重做。但是,如果我只是简单地存储所有以前的状态(如在备忘录模式中),它可能会导致软件占用过多的内存,这是我不希望的。
我想出的解决方案列表是:
- 将状态存储在某个文件中,一次只能读取几个状态。这样我不会占用大量 RAM,但读取和写入文件可能会很耗时(可能必须在另一个线程上运行)。
- 计算两个连续状态之间的增量并将其存储起来。例如,
UNDO: DEL LIST[5]&REDO: INSERT <object> LIST[5]
还有哪些其他有效的方法可以实现撤消/重做功能?它们与上述解决方案相比如何?
【问题讨论】:
-
一个想法:不要做 List
的深拷贝。 . .相反,对于所有相等的节点,指向上一个列表中的原始对象。当然,这假设您完全注意不直接更改任何原始 MyClass 项。 . .相反,如果你想改变一个,你先复制它。 . .然后将其放入新列表并更改新对象。即使有 1K 个对象。 . .只有一两个可能会在角色后卫位置之间发生变化。 -
根据您的要求,可以查看事件溯源/CQRS 模式