undo/redo 的命令模式:何时不合并撤消命令?

Command pattern for undo/redo: when to NOT merge undo commands?

我正在我们基于 Qt5 的图形应用程序中实现一个 undo/redo 功能,使用 QUndoCommands 它有一个很好的 mergeWith() 功能:例如,如果用户重复点击字体我的应用程序上的大小增加按钮,而不是在撤消列表中创建大量命令,它只更新 QUndoStack 上的一个命令。所以一个单一的撤消将回到原来的字体大小。

太好了,但有时我不想自动合并命令。例如,如果我将一个项目拖到一个新位置并将其放在那里,然后将同一项目拖到另一个位置:我的应用程序应该创建 2 个移动命令,而不是将它们合并到一个命令中。

因此,这是我认为会造成逻辑中断的事件列表,其中用户会期望一个命令不会与下一个命令合并,即使下一个命令更改了相同的 属性同一个对象:

如我列表中的问号所示,我不太确定在什么情况下禁止合并命令。所以我的问题是,在这方面是否有任何最佳实践?我在哪里可以找到它们?

FWIW,我没有找到任何最佳实践,但对于我的软件,我抑制了焦点更改时的合并(这在我的应用程序中也发生在图形部分的鼠标释放时)。此外,对于打字,如果输入位置的变化与删除或输入 1 个字符的预期方式不同,并且用户在删除字符和输入字符之间切换,我会禁止合并。

我没有在意计时器,也没有在打字时考虑最大字符数。