是否有设计或开发模式,我们处理更新实际数据的副本,并在需要时将差异应用于原始参考?
如果没有,设计此类模型的最佳方法是什么?
我认为我应该做的事情:
mode
来指示模型是否在“更新直接参考模式”中使用或“仅更新复制模式”actualState
或temporaryState
。mode
的setter方法创建实际数据的副本并将其存储在临时状态。如果mode
更新为update direct reference
,请清除temporaryState
temporaryState
的更改应用于actualState
。该方法还应从内存中清除临时状态。在代码中:
enum InsertionMode {
UPDATE_DIRECT, UPDATE_COPY
}
class Store {
private Data actualState;
private Data temporaryState;
private InsertionMode mode;
private void resetTemporaryState() {
....
}
private void initTemporaryState() {
this.temporaryState = copy(actualState);
}
private commitTemporaryState() {
this.actualState = this.temporaryState;
this.resetTemporaryState();
}
public Data setInsertionMode(InsertionMode mode) {
if (this.mode != mode) {
InsertionMode previousMode = this.mode;
this.mode = mode;
if (previousMode == InsertionMode.UPDATE_COPY) {
this.resetTemporaryState();
}
if (this.mode == InsertionMode.UPDATE_COPY) {
this.initTemporaryState();
}
}
}
public void commit() {
if (this.mode == InsertionMode.UPDATE_COPY) {
this.commitTemporaryState();
}
}
public void abort() {
if (this.mode == InsertionMode.UPDATE_COPY) {
this.resetTemporaryState();
this.setInsertionMode(InsertionMode.UPDATE_DIRECT);
}
}
...
}
答案 0 :(得分:2)
给定的代码是“好的”,因为它将支持您的要求。
但是:更新对象是一种简单的方法,并且易于实现。但根据您的具体情况,您在2017年的工作方式会有所不同。
而不是让一个可变对象改变状态,你可以改为使用不可变对象。状态变成了这类对象的序列。
到达新状态意味着在序列的末尾添加新创建的对象,取消意味着使用旧的未更改的序列。这种方法是blockchain应用程序的基础;但它也可以缩小到更小的上下文 - 只需查看其核心方面:您永远不会通过更改现有对象来更改状态,而是通过创建新对象。当然,这需要很多思考;你不想盲目地复制一切;你可能会更多地看到“delta”对象(代表个别变化)和显示增量聚合的“视图”。
除此之外:您可能想要了解CQRS与CRUD(例如this)。