在函数式编程中,数据模型是不可变的,更新数据模型是通过在数据模型上应用函数并返回数据模型的新版本来完成的。我想知道人们如何为这样的数据模型编写高效的查看器/编辑器(更具体地说是在Clojure中)
一个简化的例子:假设你想为一棵大树实现一个查看器。在非功能的世界中,您可以有一个用于树的控制器,它具有函数updateNode(节点,值),然后可以通知所有观察者,告诉他们树中的特定节点已经更新。在查看器端,您可以将所有节点放在一个WidgetNode中,保持Node -> NodeWidget的映射,当通知您某个节点已经更改时,您可以只更新树中需要更新的对应WidgetNode。
another Clojure MVC question中描述的解决方案谈到了将模型保留在引用中,并添加了一个监视器。虽然这确实允许您收到模型更改的通知,但您仍然不知道更新了哪个节点,并且必须遍历整个树,对吗?
我能想到的最好的办法是,在最坏的情况下,将路径上的所有节点从根节点更新到更改后的节点(因为所有这些节点都是不同的)。
更新不可变数据模型视图的标准解决方案是什么?
发布于 2013-09-20 21:06:27
我不确定这是函数式编程独有的问题。如果您将所有状态都保存在一个单根可变对象图中,并在它发生更改时发出通知,那么同样的问题也会存在。
要解决此问题,您可以简单地存储模型的当前状态,以及有关上次编辑的更改内容的一些信息。您甚至可以保留这些内容的历史记录,以便轻松地撤消/重做,因为Clojure的持久数据结构使它们的共享底层状态非常高效。
这只是如何攻击它的一个想法。我相信还有更多。
我也认为值得问一问,“它需要有多高的效率?”答案是,“在这种情况下就足够有效了。”这可能是因为在给定的应用程序中,您实际上并没有那么多数据要处理,所以数据的普通映射将会起作用。
https://stackoverflow.com/questions/18916572
复制相似问题