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上推薦一些有爭議的論文。