Oop MVC/观察员和;不变的数据结构

Oop MVC/观察员和;不变的数据结构,oop,model-view-controller,design-patterns,functional-programming,immutability,Oop,Model View Controller,Design Patterns,Functional Programming,Immutability,您能解释一下MVC/Observer技术在两种情况下的相似之处吗: 不可变对象(OOP样式) 不可变数据(函数样式) 例如,让我们考虑下面的简单GUI示例(您可以尝试在这里直播,点击“Run”按钮启动它,等待2秒的文本出现) 它是用JavaScript构建的,因为它很容易玩,而且MVC/Observer对它来说非常自然 // Model containing the data. var Post = Backbone.Model.extend({}) var PostView = Backb

您能解释一下MVC/Observer技术在两种情况下的相似之处吗:

  • 不可变对象(OOP样式)
  • 不可变数据(函数样式)
  • 例如,让我们考虑下面的简单GUI示例(您可以尝试在这里直播,点击“Run”按钮启动它,等待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样式,我建议应用以下修改:不是“更改模型状态”,而是每次状态更改时都必须创建一个新的模型状态。我将把不可变状态作为参数传递给观察函数(这里是
    render
    函数),而不是在视图中拉取观察函数中的状态


    作为对观察者设计模式的更具功能性的方法的灵感,您可能想看看反应式函数编程。特别是,我会推荐这篇有点争议的论文。

    对于经典的MVC和OOP技术,每个对象都有一个隐式标识符——它的引用。观察者依靠此引用/标识符将消息分派到正确的对象

    在不可变世界中,引用不再标识对象(对象的不同版本可能有多个引用),而在函数世界中,根本并没有对象。因此,我们需要显式地提供对象标识

    不可变/函数世界中的观察者类似于具有显式提供的对象ID的发布/订阅