【问题标题】:MVC / Observer & Immutable Data StructuresMVC / 观察者和不可变数据结构
【发布时间】:2012-10-31 10:14:22
【问题描述】:

您能否在两种情况下解释一下 MVC / Observer 技术的类似物:

  1. 不可变对象(OOP 风格)
  2. 不可变数据(函数式)

例如,让我们考虑以下简单的 GUI 示例(您可以在此处实时试用 http://tinkerbin.com/0XDHRXIl 单击“运行”按钮启动它并等待 2 秒以显示文本)

它是用 JavaScript 构建的,因为它很容易玩,而且 MVC / Observer 对它来说非常自然

// Model containing the data.
var Post = Backbone.Model.extend({}) 

var PostView = Backbone.View.extend({
  initialize: function() {
    // Registering view rendering method as
    // an observer on the model.
    this.model.on('all', this.render.bind(this))
  },  
  // Every time state of model changes 
  // this method will be called.
  render: function() {
    // Printing value of model.text attriubute. 
    this.$el.html(this.model.get('text'))
    return this
  }
})

// Now, any time the model is updated the view will be also 
// automatically updated.
post.set({text: "hello, it's me"})

但是我不太明白如何对不可变 OOP 和函数式样式做同样的事情,有什么方法?

【问题讨论】:

    标签: oop model-view-controller design-patterns functional-programming immutability


    【解决方案1】:

    在经典 MVC 和 OOP 技术的情况下,每个对象都有隐式标识符 - 它的引用。观察者依靠这个引用/标识符来分派消息到正确的对象。

    在不可变的世界中,引用不再标识对象(可能有多个对象的不同版本的引用),而在功能世界中根本没有对象。因此,我们需要明确提供对象身份。

    在 Immutable/Functional 世界中 Observer 的类似物是具有明确提供对象 ID 的 Pub/Sub。

    【讨论】:

      【解决方案2】:

      关于不可变的 OOP 样式,我建议应用以下修改:每次发生状态更改时,您都必须创建一个新的模型状态,而不是“更改模型状态”。我不会在视图中拉取观察函数中的状态,而是将不可变状态作为参数传递给观察函数(这里:render 函数)。

      作为对观察者设计模式更实用的方法的启发,您可能想看看反应式函数式编程。特别是,我会推荐Deprecating the Observer Pattern 上有点争议的论文。

      【讨论】:

        猜你喜欢
        • 2016-08-26
        • 2014-01-28
        • 2014-03-24
        • 2012-09-02
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        相关资源
        最近更新 更多