3

您能否在两种情况下解释 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 和功能样式做同样的事情,有什么方法?

4

2 回答 2

1

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

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

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

于 2012-11-09T15:32:10.943 回答
0

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

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

于 2012-11-07T11:52:55.157 回答