使用功能数据模型进行高效的视图更新

时间:2013-09-20 12:15:38

标签: model-view-controller clojure functional-programming observer-pattern

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

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

another Clojure MVC question中描述的解决方案讨论了如何将模型保留在ref中,并添加了一个观察者。虽然这确实可以让您收到模型更改的通知,但您仍然不知道哪个节点已更新,并且必须遍历整个树,是否正确?

我能从脑海中想出的最好的事情要求你在最坏的情况下更新从root到更改节点的路径上的所有节点(因为所有这些节点都是不同的)

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

1 个答案:

答案 0 :(得分:1)

我不确定这是一个功能编程所特有的问题。如果您将所有状态保存在一个单根的可变对象图中,并且在更改时发出通知,则会出现同样的问题。

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

这只是一个关于如何攻击它的想法。我相信还有更多。

我也认为值得问一下,“它需要多高效?”答案是“对于具体情况而言足够有效”。可能是普通的数据地图会起作用,因为在给定的应用程序中你并没有真正拥有那么多数据。