0

在函数式编程中,数据模型是不可变的,更新数据模型是通过在数据模型上应用函数并获得新版本的数据模型作为回报来完成的。不过,我想知道人们如何为此类数据模型编写高效的查看器/编辑器(更具体地说,在 Clojure 中)

一个简化的例子:假设你想为一棵大树实现一个查看器。在非功能世界中,您可以拥有一个用于树的控制器,带有一个函数 updateNode(Node, Value),然后它可以通知所有观察者告诉他们树中的特定节点已被更新。在查看器方面,您可以将所有节点放在一个 TreeView 小部件中,保留 Node->WidgetNode 的映射,当您收到某个 Node 已更改的通知时,您可以只更新树中需要更新的一个对应的 NodeWidget .

另一个 Clojure MVC 问题中描述的解决方案讨论了将模型保存在 ref 中并添加观察者。虽然这确实可以让您收到模型更改的通知,但您仍然不知道哪个节点被更新,并且必须遍历整个树,对吗?

我能想到的最好的事情是在最坏的情况下更新从根到更改节点的路径上的所有节点(因为所有这些节点都会不同)

更新不可变数据模型视图的标准解决方案是什么?

4

1 回答 1

1

我不确定这是函数式编程独有的问题。如果您将所有状态保存在单根可变对象图中,并在更改时发出通知,则会存在相同的问题。

为了解决这个问题,您可以简单地存储模型的当前状态,以及有关上次编辑更改内容的一些信息。您甚至可以保留这些事物的历史记录,以便轻松撤消/重做,因为 Clojure 的持久数据结构通过它们共享的底层状态使其非常高效。

这只是关于如何攻击它的一种想法。我敢肯定还有很多。

我也认为值得一问,“它需要多高的效率?” 答案是,“在这种情况下足够有效”。这可能是简单的数据映射会起作用,因为在给定的应用程序中您实际上并没有那么多数据要处理。

于 2013-09-20T13:06:27.170 回答