为什么Google Docs的操作转换在删除方面有误?

时间:2012-10-14 10:53:10

标签: real-time google-docs google-drive-api google-wave operational-transform

今天尝试了这个实验:为Google文档打开了两个离线编辑器。在其中一个,我加粗了第一个字。在第二个,我删除了它。无论我先打开哪个客户端,该字总是会被删除。

首先,为什么会出现这种情况 - 我对运营转型的理解是订购事宜?在两个人分别输入“a”和“b”的简单例子中,如果服务器首先接收“a”,它将通过将第二个人的“b”事件转换为“通过一个空格”来强制执行“ab”的输出。 ,然后添加b“事件,反之亦然。

其次,如果排序无关紧要,是否存在技术原因导致Google Docs选择在删除方面犯错?或者用户的原因很简单?

3 个答案:

答案 0 :(得分:1)

OT不会尝试辨别意图,它会按照产生一致结果的顺序应用转换。当您将这两个更改应用于文档时,将它们应用于哪个顺序无关紧要。

"第一秒" - > "首先第二" - > "第一"

"第一秒" - > "第一" - > "第一"

在第二个流中,对零长度字符串执行粗体操作。

如果在其中一个文档中您将第二个单词用斜体显示,则会得到完全相同的结果:最终结果为"首先 第二个 "无论转型顺序如何。删除转换也不例外。

答案 1 :(得分:1)

这是(5年后我知道)对最新情况的图解说明(实际上是@osma所描述的,但以图形方式解释):

在GDocs中粗体化一个字符串时,实际上是将字符串包装到一个容器中,大概是<strong></strong>,但它们可能使用任何其他语法。为简单起见,我们只要说一个粗体字符串只需要一个&#34; +&#34;在这个词的开头。因此,文本&#34; lorem ipsum&#34;将变为lorem +ipsum而不是lorem <something>ipsum<something>

1

Alice和Bob都有起始文本&#34; Lorem ipsum&#34; enter image description here

2

然后bob删除&#34; ipsum&#34;。请注意,他发送给服务器的是变更集retain(6), delete(5)。变更集本质上是一个补丁,其结构很可能基于this libraryenter image description here

3

爱丽丝大胆地说&#34; ipsum&#34; (添加&#34; +&#34;)。请注意,她发送的是变更集retain(6), insert(+), retain(5) enter image description here

4

现在,两个变更集都在前往服务器,而该服务器对这些变更集一无所知。 enter image description here

5

假设最糟糕的情况:Bob的包首先到达,然后该单词将被删除。 (另一种情况很明显)。 enter image description here

6

当Alice的包裹到货时,它只会添加&#34; +&#34;因为她发送的内容只是一个变更集enter image description here

7

两个文本都是变更集,广播给客户。这是第一个。 enter image description here

8

这是第二个。 enter image description here

9

将这些更改集修补到原始文本后,最终会得到&#34; Lorem +&#34;。此符号稍后会被一个常见的HTML清理过程删除,该过程会删除格式为<tag></tag>

的任何标记

enter image description here

要测试此演示,请转到:http://operational-transformation.github.io/visualization.html。在那里,您可以在发送/接收时播放文本和包。

答案 2 :(得分:0)

这不是一个在删除方面犯错的问题。

如果两个客户都有平等有效但不同的真实版本,Google Docs必须选择维护一个版本,否则强迫用户解决冲突,这本身就很复杂,难以解释。

因此,Google Docs的“真相”是文档的一致性,而不是意图的辨别力。通过破坏信息最好更容易实现一致性 - 这是一种熵的倾向。

所有这些基本上都是我的半哲学学士学位,但是......