【问题标题】:Efficient view updating with functional data model使用功能数据模型进行高效的视图更新
【发布时间】:2013-09-20 12:15:38
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 一种高效遍历和更新结构的传统 FP 方式是zippers。我不知道它们与MVC的东西对应多少,但拉链在实际应用中用于类似问题,最突出的是xmonad

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多