3

能否请您解释一下什么是MVC /观测技术类似物在两种情况下:MVC /观察员和不可变的数据结构

  1. 不可变对象(OOP风格)
  2. 不可变的数据(功能型)

例如,让我们考虑一下下面这个简单的GUI示例(你可以尝试住在这里http://tinkerbin.com/0XDHRXIl点击“运行”按钮启动,等待2秒,文本显示)

它是用JavaScript的编译,因为它很容易发挥和MVC /观察员是很自然的把它

// 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和功能性的风格相同,有哪些途径?

回答

1

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

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

观察者在不可变/功能世界中的模拟是一个Pub/Sub显式提供对象ID。

0

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

作为观察者设计模式的更多功能方法的灵感,您可能需要了解无功功能编程。特别是,我会在Deprecating the Observer Pattern上推荐一些有争议的论文。