云表格的技术(四)

来源:互联网 发布:域名查所在地 编辑:程序博客网 时间:2024/06/06 03:51

使用单机的Excel时,大家都用过撤销/恢复功能。这是个非常常用的功能,来防止和解决误操作的发生,当然,也可以当作是找回实时历史的一个简单实现(关于文档历史功能,这是一个很大的话题,本篇不表)。

本文要探讨的,是在多人协作环境下,表格的撤销和恢复功能。

我们从简单的例子着手。

假设现在有两个协同者A和B。A编辑表格A1, 原来是空白,A写成1;之后,B编辑相同的表格A1,B看到了内容1,并更改为2. 再然后A撤销,表格A1内容应该变成空白。

再复杂一点的例子。A在离线情况下,编辑表格A1,原来是空白,A写成1;同时,B在线编辑相同的表格A1,B看到的内容是空白,B改写成2;之后A上线,两者的文档同步,最终A1的内容是1.这时,A撤销,应该发生什么?

A撤销,撤销的是A的影响,恢复到A未做更改时的状态。A未做更改时,状态是空白;但是同步后,A知道B做过更改(从空白变成2),只是A自己将自己的更改覆盖了B的更改;那么,A的撤销,最终使得A1的内容变成空白呢?还是变成2呢?

Google Spreadsheet的选择是,将A1的内容变成空白。从技术实现上讲,这种定义也是实现简便的。为了支持撤销操作,系统内部会记录每一个操作覆盖掉的原始数据(Undo Data)。在协同编辑时,因为Operational Transformation的存在,操作本身会发生变化,但是,操作中携带的Undo Data该不该变化呢?使用Google关于撤销的定义,这些Undo Data是不需要变化的。这样就省去了很多计算和判断。

让我们继续探讨。下面我们探讨恢复。

A编辑表格A1, 原来是空白,A写成1;之后,B编辑相同的表格A1,B看到了内容1,并更改为2. 再然后A撤销,表格A1内容应该变成空白,再然后,A恢复,这是,A1的内容应该是什么呢?

一种策略,A1的内容是1,因为A的操作是从空白写成1,恢复操作(Redo)是对A的操作的重执行(Re-execute)。另一种策略是,A1的内容是2,因为恢复(Redo)操作的本质是对撤销(Undo)操作的撤销.当执行撤销操作时,是从2撤销到空白,那么,对该操作的撤销,讲使A1从空白回到2.

Google选择了第二种策略。WPS云协作选择了第一种策略。

从实现上讲,并没有复杂与否的区分。主要在于如何定义恢复操作。

如果定义恢复操作为重执行,那么就选择策略1.

如果定义恢复操作为撤销操作的再撤销,那么就选择策略2.

原创粉丝点击