【发布时间】:2015-01-11 20:04:58
【问题描述】:
我有一个问题,我正试图用一个非常不明显的解决方案来解决(至少对我而言)。假设我有一个简单的类
class Foo {
private:
int x, y, z;
public:
Foo(int x, int y, int z) : x(x), y(y), z(z) {}
}
属性 x、y、z 也有公共的 getter 和 setter。
我有一个类封装了一个 Foo 的向量 Item,它初始化它们并赋予它们默认值等...
现在Store 正在被第三类Processor 修改。基本上我试图实现的行为如下:
Processor有一个 std::function 向量,其中包含指向Store不同成员的指针,例如ChangeItemSpecs()或ChangeItemSourcing()。它是一个循环遍历并重复调用的列表。Processor在函数被调用后检查Store,如果它们是“好”的变化。例如,如果商店的总价值增加了,或者商店的运营成本降低了。我可能有不同的处理器来分析包含指向Store的不同成员的指针的模型,这些成员做不同的事情。或者可能是同样的事情,但只是运行不同的分析。如果更改不利,
Processor应该“回滚”所做的更改。 这就是我在设计上苦苦挣扎的地方
最初我想以某种方式获取将要更改的项目的指针和索引,并让Processor 复制它们,因为Item 几乎只是比 POD 类高出一步。如果提议的更改不受欢迎,Processor 会将修改后的 Item 替换为原始的 Item 副本。但这非常低效,因为我有一个非常大的数据集。
我的问题归结为:我想要一种通用的方式来存储有关 Item(或一堆项目)的先前信息,如果 Processor 不喜欢改变。
我想过创建一个名为Change 的对象,其中Store 可以注册处理和回滚更改的成员,然后让Processor 存储Change 对象的数组。更改将有一个名为“proposeChange”和“回滚”更改的成员(是否存在适合“接受更改”的不同范例?)。然后Processor 将简单地循环遍历每个迭代的每个Change 项目并执行其操作。但这并不能真正解决管理回滚信息的问题。只是另一个抽象......
非常感谢任何帮助。我是否错误地处理了这个问题?有不同的看法吗?我该如何设计它?我真的不需要代码,除非它采用了 C++ 的一些深奥特性,或者非常先进——我只需要有关如何设计高效系统的指导。
其他cmets:
性能是关键。每个“商店”中可能有数十万甚至更多
Items。因此,为什么我认为我首先建议的复制方法对性能的影响太大了。它应该经得起简单的并行化。这意味着在 Model 中存储状态信息可能不是一个好主意(或者是吗?)。我想非常简单地并行化
Processor中的迭代。如果我忽略了某些事情并且这变得非常复杂,那么我们现在可以忘记这一点。
提前致谢!
【问题讨论】:
-
回滚让我觉得你应该看看en.wikipedia.org/wiki/Memento_pattern
-
能否详细说明
Store和Item之间的关系?我可以看到像 “Store 的不同成员,例如ChangeItemSpecs()或ChangeItemSourcing()” 和 “每个Store中可能有数十万甚至更多项目” 但我没有看到任何关于这种关系的明确描述。 -
一个商店除了包含许多
Item对象的向量之外,还包含它自己的属性。商店也有公共成员,它们会返回有关项目的汇总统计信息,或提供对特定项目或项目的访问。也可以在商店中添加或删除项目。还有什么相关的吗?