2

我必須實現一個存儲庫模式對象,該對象將維護項目列表。回購看起來是這樣的:在JavaScript中,依靠對象引用來「聆聽」更改是否是一種很好的做法?

var repository = { 

    data: [], 

    getAll: function() { 
     return this.data; 
    }, 

    update: function() { ... } 
} 

回購數據的最終消費者將是某個組件。我想利用以更新DOM時,它改變了參考回購的數據數組:

function ItemList() { 
    this.data = repository.getData(); 

    when (this.data is changed) { 
     update the view 
    } 

    this.userInput = function() { 
     repository.update(); 
    } 
} 

雖然感覺整潔,據說採用的是合法的功能,是不是真的是一個好主意?我應該在儲存庫中使用觀察員/通知嗎?

var repository = { 
    ... 
    onDataChange: function(callback) { ... } 
} 

一個例子(使用角),你可以在這裏找到:http://jsfiddle.net/xen8m148/

回答

4

取決於你如何實現這絕對不是內建的「改爲」 =)一般來說,如果你想保持不必要的處理下,發佈/訂閱模式更好。如果你不關心浪費的CPU週期,那麼你可以使用Object.observe來查看對象的變化。但是從軟件工程的角度來看,它看起來好像你在兩個所有者之間共享你的數據,而不管你如何傾聽變化,這是未來可能出現的一個更大的問題。

+0

我懷疑OP試圖使用'repository'就像一個數據存儲。在這種情況下,不存在真正的數據耦合問題,因爲存儲庫實際上不在數據上運行,也不依賴於數據。 – light

+0

我永遠不會相信事情是他們的名字所說的,所以:即使它被稱爲「存儲庫」,我也不會相信沒有人會最終不讓它操縱數據本身,及時。最好先清楚這些事情(注意,OP把它稱爲存儲庫模式 - *像*對象,而不是存儲庫。這總是令人擔憂) –

+0

您有一點,但我認爲這是一個架構問題。如果應用程序使用「存儲庫」是用於存儲數據的層之一(也許對磁盤持久存儲)的體系結構進行建模,)而沒有別的,我們希望它不會操縱數據。 – light

0

我通常認爲,如果您正在與存儲庫進行通信,則發佈/訂閱模式將不必要。假設您的應用程序正在使用存儲庫將CRUD抽象爲系統中所有數據的基礎持久機制,那麼此存儲庫實際上是架構中的一個重要部分。

如果通信模塊不知道彼此的存在,發佈/子模式很有用。如果模塊/對象試圖與像repository這樣的架構對象進行通信,則它已經按約定知道約repository。如果存儲庫已經作爲一個接口,抽象了一個潛在的複雜性,爲什麼你會希望你的模塊不知道這個接口?但是,如果您不確定存儲庫是否是您架構的一部分,或者如果您只是希望數據和存儲庫完全脫離到最大程度,那麼是的,一個pub/sub可以工作。

這就是說,我相信對於像JS這樣的前端解釋型語言來說,更直接的方法通常是更好的方法。我始終使用pub/sub進行組件通信,但我只是沒有看到它們需要在架構層之間進行通信,而接口就足夠了。事實上,如果您將發佈/訂閱模式過多,最終可能會在pub-sub消息中出現命名空間問題。

相關問題