我正在为“模型”(即具有某种语义的框和线的集合,例如 UML,其细节在这里无关紧要)编写一个图形编辑器。所以我想要一个表示模型的数据结构和一个图表,其中对图表的编辑会导致模型发生相应的变化。因此,例如,如果模型元素的属性中有一些文本,并且我在图表中编辑文本,我希望更新模型元素。
该模型可能会表示为一棵树,但我希望图表编辑器尽可能少地了解模型表示。(我正在使用图表框架,因此将任意信息与图形元素关联起来很容易)。如果我能弄清楚应该是什么,可能会有一个“模型”类来对接口进行编码。
如果我用命令式语言来做这件事,那将很简单:我只需从图表中的图形元素到模型元素的引用。理论上,我仍然可以通过从大量 IORef 集合中构建模型来做到这一点,但这将是在 Haskell 中编写 Java 程序。
显然,每个图形元素都将有某种 cookie 与之相关联,这将使模型更新发生。一个简单的答案是给每个模型元素一个唯一的标识符并将模型存储在 Data.Map 查找表中。但这需要大量的簿记以确保没有两个模型元素获得相同的标识符。我也觉得它是一个“字符串类型”的解决方案;您必须处理一个对象被删除但在其他地方有一个悬空引用的情况,并且很难说您的类型中模型的内部结构。
另一方面,奥列格关于带有多个孔的拉链和具有清晰事务共享的光标的著作听起来像是一个更好的选择,如果我能理解的话。我了解了列表和树拉链的基本概念以及数据结构的差异化。图表中的每个元素都可以将光标放入模型的拉链中吗?因此,如果进行了更改,则可以将其提交给所有其他游标?包括树操作(例如将子树从一个地方移动到另一个地方)?
在这一点上,如果有某种关于定界延续的教程,以及它们如何使 Oleg 的多光标拉链工作的解释,这将特别有助于我,这比 Oleg 的帖子稍微不那么陡峭?