用户使用WPS不是为了看一张空白的表格,而是为了编辑。用户可以通过点击,键盘输入等动作,发起编辑请求,而产品界面会响应这个请求,执行特定的操作。
操作分合法和非法(invalid)两种。举一个简单的例子,当前表格存在冻结行和冻结列,如果用户试图在跨越冻结行列的区域内合并单元格,则UI会告诉用户这个操作不能执行。但是,这种对invalid操作的事先阻挡,只有在单机情况下才会生效,在协同编辑时,多人同时的操作,合法性应该由Operational Transformation模块来保证。从这种角度来讲,OT模块的功能,一方面市操作的转换,另一方面是是否将操作invalidate的判断。
在实际specification定义市,需要考虑各种可能的操作之间的组合以及合法性。
以上是前言。
WPS Excel支持各式各样的操作,可以分类如下:
文件metadata的操作:修改文件名
工作表metadata的操作:修改工作表名称,增删(以及删除后的撤销)拷贝工作表,调整工作表顺序
工作表结构的操作:调整冻结行列;增删(以及删除后的撤销)行/列;移动行/列;调整行高/列宽;调整行/列的隐藏与否;行排序
工作表内容的操作:合并单元格与解除合并;单元格区域数据更新(各种格式调整),内容的剪切拷贝;AUTO_FILL;
单元格评论的操作:添加删除更新评论
条件格式的操作:对单元格区域设置/调整Conditional format
表格的操作:对单元格区域设置/调整表格
操作可能会产生副作用(side effect)。举例而言,工作表可以设置冻结的行列;假设,当前冻结前两行,前两列;那么,如果用户在工作表的顶部插入一行,那么该操作完成后,工作表的冻结行应该从两行变成三行;在例子当中,调整冻结行列的操作是加行操作的side effect.
之所以称side effect,是因为side effect只有在主操作生效的情况下才会生效;如果主操作出现异常,那么side effect就没有存在的意义;其次,side effect必须紧跟在主操作之后被执行,不能中间被其他操作打断;
换句话讲,我们可以定义“”复合操作“”(Compound Operation),复合操作由若干元操作组成,复合操作的执行应该是原子的。
在协同编辑产品的实现中,维护复合操作的原子性是intention preservation的重要环节。在multi-peer并发编辑的情况下,后台服务器负责将所有操作串行化,在串行化的过程中,必然需要考虑如何维护复合操作的原子性.
复合操作可以用来简化incremental upload的握手开销。假如有X个操作需要上传,我们可以将X个操作打包成一个复合操作(尽管在概念上,这X个操作并不是主操作和副操作的关系,但是在后台处理时可以这样简化),向后台上传,后台对该复合操作做Operational Transformation,回复一个握手信号即可。当然,该方案的好处(减少握手次数)需要一些代价(后台处理时,对复合操作的Operational Transformation需要占用更多的计算资源和时间),具体使用时需要权衡。