2012-02-27 34 views
6

這更多的是關於我的JavaScript代碼結構的一般問題,如果我正朝着結構良好的代碼走向正確的方向。JavaScript架構 - 介體,何時使用它們?

當前的代碼我有:

(function (myNamespace, $, undefined) { 
    myNamespace.className = { 
     init:function { } // do stuff 
    } 
} (window.myNamespace= window.myNamespace|| {}, jQuery))); 

(function (myNamespace, $, undefined) { 
     myNamespace.className2 = { 
      init:function { } // do stuff 
     } 
} (window.myNamespace= window.myNamespace|| {}, jQuery))); 

顯然與上面的代碼,我可以使用相同的命名空間(每頁/現場部分),並通過myNamespace.className.init()叫他們等等。我還可以結合這些如果我想,但我封裝類的可讀性。

現在,我一直在閱讀關於介體的概念http://addyosmani.com/largescalejavascript/。我的第二個問題是什麼時候(以及如果)我應該使用這些?從className2很明顯,我可以這樣做:

myNamespace.className2 = { 
       init:function { myNamespace.className.init() } // do stuff 
      } 

那麼,爲什麼這個曾經訂閱的className像mediator.subscribe("classNameInit")和發佈的className的活動?

我非常樂於接受有關我的代碼結構的建議,因爲這是我需要正確的操作,同時改變了我編寫JavaScript的方式。

+0

_使用中介模式,對象之間的通信使用中介對象進行封裝。對象不再直接相互通信,而是通過中介進行通信。這減少了通信對象之間的依賴關係,從而降低了耦合._(c)[wiki](http://en.wikipedia。org/wiki/Mediator_pattern) – c69 2012-02-27 11:55:32

+0

我試圖讓自己的頭腦清楚,並沒有看到爲什麼我會做得更好,而不是我現在正在做的事情?我沒有看到真實世界的例子證明它是有用的東西。 – 2012-02-27 12:11:28

+0

一旦你將有很多模塊想要相互溝通 - 你會看到耦合度是多麼的嚴重。 – c69 2012-02-27 12:18:32

回答

7

如果您有多個部分可以無限組合使用,而您不知道所有組合的時間或者假設所有組合的效率更高,您都可以使用它。

假設您正在構建社交媒體應用程序,並且您編寫了一個類來封裝用戶列表。在某些屏幕上,單擊列表中的用戶可以打開他們的個人資料,在另一個屏幕上點擊用戶搜索他們留下的每一個評論,然後在第三個屏幕上發生其他事情。

如果你寫這個使用調停/發佈訂閱,你最終得到的是一堆的if語句在onclick事件......

UserList.prototype.onUserClick = function(user) { 
    // Check if we're supposed to open a popup 
    if (this.mode === 'profile') 

    // Check for something else 
    else if (this.mode === 'something else') 

    // Check for another case 
    else if (this.mode === 'foo') 
} 

調解是一個解決方案這個問題,因爲它不要求在UserList擁有的每一個情況,可能在最終的知識,而是在UserList的上面的代碼可以簡單地精被點擊用戶時播出......

UserList.prototype.onUserClick = function(user) { 
    this.publish('user-click', user); 
} 

然後你的每一個其他屏幕或用戶界面件可以簡單地監聽用戶點擊消息...

// On pages where there needs to be a popup profile 
Mediator.onMessage('user-click', function(data) { 
    showProfilePopup(data); 
}); 

// Or perhaps on a search page 
SearchBox.onMessage('user-click', function(data) { 
    this.searchByUser(data); 
}); 

此外,在調解開始照耀是因爲這些其他的UI組件,比如SearchBox是特別是當UserList大火用戶不感興趣點擊,他們只有當用戶點擊發布時才感興趣,其他頁面上的UI控件也可以觸發用戶點擊,並且這些片段可以對其作出反應。

在旁註中,className = { }未創建類。你可能想要的是className = function() { }

+0

我在這一切背後的方法論和推理上奮鬥了很長一段時間,但我已經看到你完全正確(今天我一直在寫很多介導性的東西)。只需通過在中介函數中創建UI GridView,我就可以在需要時替換UI庫。標明這個答案是正確的,希望它能幫助其他人討論這個問題。謝謝! – 2012-03-01 21:36:33

+0

優秀的答案。 @thedixoon,我正在研究Jack Lawson的[鏈接](http://thejacklawson.com/2011/06/mediators-for-modularized-asynchronous-programming-in-javascript/)Mediator.js作爲創建媒體的模板js中的「class」。你之前看過嗎?你有沒有發現你可以共享的中介模塊代碼工作更有用? (帖子+1) – Ricalsin 2012-07-03 16:01:52

+0

非常好的例子。布拉沃! – BeauCielBleu 2014-02-09 07:28:38