2

我一直在构建一个网络绘画程序,其中用户的艺术作品的状态被保存为一个 json 对象。每次我添加到客户端的撤消堆栈(只是一个描述项目状态的 json 对象数组)时,我也想将状态保存到服务器。

我想知道是否有一种优雅的方式来 [1] 只发送差异然后 [2] 能够稍后下载项目并重新创建项目的当前状态?我担心这可能会变得混乱,并且倾向于在每个撤消步骤上传完整的 json 项目状态。对优雅地解决此类问题的项目有任何建议或指示吗?

4

1 回答 1

2

有趣且相当大的问题。许多实现/模式/解决方案都适用于这个问题,它们会根据您跟踪更新的“文档”类型而有所不同。无论如何,避免生气的一个简单方法是,而不是保存“状态”,而是保存“产生这些状态的命令”。

如果您的应用程序是完全确定的(我假设是,因为它是一个绘画程序),您可以确定对于给定时间和位置的每个命令,每次执行的结果都是相同的。

所以,我会记下代表程序中可用命令的“字母”:

  • 绘制[x,y,大小,颜色]
  • 擦除[x,y,大小]
  • 移动[x,y]

等等。您可以从 SVG 实现中获得灵感。然后向/从服务器推送/拉取命令字符串:

timestamp: MOVE[0,15]DRAW[15,20,4,#000000]ERASE[4,8,10]DRAW[15,20,4,#ff0000]

这显然只是一个笼统的、伪编码的想法。希望你能得到一些启发。

于 2013-05-12T15:08:58.023 回答