用于拆分合并的undo / redo软件模式

时间:2015-06-09 23:23:17

标签: design-patterns

我有一些复杂的基因组学软件,我允许撤消和重做操作。如果我有一个元素A,我可以将其移动到A0,A1,A2,A3等,并将其移动到其历史中的任何点。这很简单。

我想弄清楚的是拆分和合并的概念。如果我有A0和B0,我可以将它们合并到A1中并相当容易地来回走动。但是,如果我回到A0 / B0并决定做其他事情而不是在任一组件上进行合并,那么就记录历史而言,事情开始变得朦胧。我的直觉是,一旦我改变了A0或B0,我就会抛弃我的合并历史。

我的具体问题是: 1 - 用户期望什么(git范例,google doc范例等)? 2 - 是否有任何常见的范例来处理这个更复杂的范例(我不认为Momento或Command Pattern处理这些案例[拆分/合并])? 3 - 是否有一种更容易/不太复杂的方式来处理可能“足够好”的模式?

任何想法都会有所帮助。

感谢。

1 个答案:

答案 0 :(得分:3)

如果不了解您的软件正在做什么,这很难回答,所以我会尝试一般。

1 - 用户期望什么(git范例,google doc范例等)?

您的用户是谁?你提到这是基因组学软件。您的用户是否具有生物学背景或软件背景。根据我的经验,生物学家通常与软件开发人员有不同的期望。

在开始走错路之前,您应该询问用户他们的期望。我们无法回答这个问题,只有他们可以。与用户的频繁沟通和良好的需求收集是交付成功软件的关键。

2 - 是否有任何常见的范例来处理这个更复杂的范例(我不认为Momento或Command Pattern处理这些案例[拆分/合并]?)

同样,如果不确切知道你的分裂或合并,我无法给出明确的答案,但Command模式能够执行非常复杂的任务。没有什么可以说undo / merge命令必须与redo / split命令完全相反。你可能还想查看State模式或State和{{的组合1}}每个州创建不同的命令。

3 - 是否有更简单/不太复杂的方式来处理可能“足够好”的模式?

Command可能足够好或者某种序列化。将每个版本保存到临时文件中可能更简单,撤消/重做操作只需从这些临时文件中恢复。