Model view controller 基于功能数据模型的高效视图更新

Model view controller 基于功能数据模型的高效视图更新,model-view-controller,clojure,functional-programming,observer-pattern,Model View Controller,Clojure,Functional Programming,Observer Pattern,在函数式编程中,数据模型是不可变的,更新数据模型的方法是在数据模型上应用函数,并获得数据模型的新版本。我想知道人们是如何为这样的数据模型编写高效的查看器/编辑器的(更具体地说是Clojure) 一个简化的示例:假设您想要为一棵大树实现一个查看器。在非功能世界中,您可以为树设置一个控制器,该控制器带有一个函数updateNode(Node,Value),然后可以通知所有观察者,告诉他们树中的特定节点已更新。在查看器端,您可以将所有节点放在TreeView小部件中,保持Node->WidgetNod

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

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

中描述的解决方案涉及将模型保持在ref中,并添加一个观察者。虽然这确实可以让您得到模型更改的通知,但您仍然不知道哪个节点已更新,并且必须遍历整个树,对吗

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


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

我不确定这是函数式编程特有的问题。如果将所有状态保存在一个单根可变对象图中,并在其更改时发出通知,那么同样的问题也会存在

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

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


我还认为值得一问,“它需要有多高的效率?”答案是“在这种情况下足够有效。”这可能是因为在给定的应用程序中,您实际上没有那么多的数据需要处理。高效遍历和更新结构的传统FP方法是。我不知道它们在多大程度上与MVC相关,但拉链在实际应用中用于解决类似问题,最突出的是。