为什么Google Docs操作转换更偏向于删除?

8
今天尝试了这个实验:为Google文档打开了两个离线编辑器。在一个编辑器中,我加粗了第一个单词。在另一个编辑器中,我删除了它。无论我先打开哪个客户端,这个单词总是被删除。
首先,为什么会出现这种情况 - 我理解操作转换的顺序很重要?在两个人分别输入 "a" 和 "b" 的简单例子中,如果服务器首先接收到 "a",它将通过将第二个人的 "b" 事件转换为 "移动一个空格,然后添加b" 事件来强制输出 "ab",反之亦然。
其次,如果顺序不重要,那么 Google 文档为什么选择删除而不是其他方式呢?或者原因主要是为用户简单考虑?

这是一个非常好的问题,我并不特别支持这里唯一的答案。作为一个从事OT研究的人,我希望看到更清晰、更简洁的回答 :) - James Mills
3个回答

8
这是一个(我现在知道已经五年了)图形化解释,说明为什么会发生这种情况。事实上,这就是@osma所描述的,但是通过图形化方式进行了解释:
当您在GDocs中加粗字符串时,您将该字符串包装到一个容器中,可能是<strong></strong>,但他们也可以使用任何其他语法。为简单起见,让我们假设加粗字符串只需要在单词开头添加一个“+”号。因此,为简单起见,“lorem ipsum”文本将变为lorem +ipsum而不是lorem <strong>ipsum<strong>

1

艾丽斯和鲍勃都以文本“Lorem ipsum”开始。 在此输入图片描述

2

鲍勃随后删除了“ipsum”。请注意,他向服务器发送了更改集retain(6), delete(5)。更改集本质上是一个补丁,Google可能使用了这个库enter image description here

3

现在Alice将“ipsum”加粗(添加“+”)。她发送的变更集为retain(6), insert(+), retain(5) 输入图像描述

4

两个变更集正在传输到服务器。服务器目前还不知道这些变更集的任何信息。 在此输入图片描述

5

假设最坏的情况:Bob的包裹先到了,然后这个单词将被删除。 另一种情况很明显。
在此输入图像描述

6

当艾丽斯的软件包到达时,它将只向文本中添加一个“+”,因为她发送的只是一个单一的变更集。enter image description here

7

这两段文本随后会广播给客户端。这是第一段。 在此输入图片描述

8

这是第二个。 在此输入图片描述

9

在将这些变更集合打补丁到原始文本后,您最终得到了“Lorem +”。服务器和所有客户端现在都拥有相同的文本。稍后,一个常见的HTML清理过程将消除像<tag></tag>这样的空标签中的加号符号。

enter image description here

要测试此演示,请转到:http://operational-transformation.github.io/visualization.html。在那里,您可以玩弄文本和包,就像它们被发送/接收一样。

2
这个模拟非常有帮助。 - chepukha

1
这并不是在删除一方错误的问题。
在两个客户端拥有平等有效但不同版本的真相的情况下,Google文档必须选择支持一个版本,否则强制用户解决冲突,这是固有的复杂和难以解释的事情。
因此,对于Google文档来说,“真相”是文档的一致性,而不是意图的识别。而一致性最好通过销毁信息来实现——一种趋向熵的倾向。
所有这些基本上都是我的半哲学的胡扯...

那么,Google文档“假设”(也许不正确)破坏性操作是更语义上正确的操作? - James Mills
至少根据我的经验,玩弄离线模式并进行编辑与删除更改。 - ehfeng
@enfeng 你是在这个领域做研究还是只是好奇? - James Mills

1
OT不试图识别意图,它按照一定顺序应用转换以产生一致的结果。当您将这两个更改应用于文档时,您应用它们的顺序并不重要。
"first second" -> "first second" -> "first"
"first second" -> "first" -> "first"
在第二个流中,加粗操作是在零长度的字符串上执行的。
如果在其中一个文档中将第二个单词变为斜体字,您将得到完全相同的结果:“first second”,无论转换顺序如何。删除转换也没有什么不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接