不久前聽了 josephj 講 Javascript 的模組化開發。就我的理解,所謂模組化開發的目的,在於避免在網頁上有任何的互動,都必須重新載入網頁,以增加網頁互動的速度,因此,我們可以將網頁中的各個區塊切割出來,變成模組。
在將網頁切割成模組之後,模組之間的訊息傳遞就會是個問題-如果 A 模組向 B 模組傳遞一個訊息,但 B 模組這時候已經不在網頁上了,就會產生 exception,所以,在切割模組的同時,也應該要避免模組之間的相互參照。解決方法便是,A 模組如果要向 B 模組傳遞訊息,不是直接呼叫 B 模組,而是將訊息送到一個統一的訊息中心,再由訊息中心將訊息分派給各個訂閱此一訊息的模組。在 joseph 的簡報中,發送訊息稱之為 broadcast,訂閱訊息稱之為 listen。
如果我們在前面的那段描述裡,把模組換成物件,把 Javascript 換成 Objective C,馬上可以想到 Foundation 裡頭的 NSNotificationCenter,於是 broadcast 就是 postNotification:,listen 便是 addObserver:。NSNotificationCenter 從 Mac OS X 10.0 就出現在 Mac OS X 上,從 iPhone OS 2.0,第一版公開的 iPhone SDK 裡頭,就出現在 SDK 裡。
基本上,在 Mac 與 iPhone 上,物件之間相互溝通也就那幾種方法-target/action、delegate、binding、KVO…還有 notification。如果是在寫 Cocoa 或是 Cocoa Touch 應用程式,notification 可說是天天都在用的東西,Mac 上 Window 關閉會發送 notification、iPhone 上螢幕鍵盤升起會發送 notification,而除了 NSNotificationCenter 可以在應用程式內部傳送 notification 之外,NSDistributedNotification 還可以在應用程式之間做 IPC。
基於興趣想了解一下這個東西到底有多古老,查了一下,GNUStep 網站上居然還留著一份 OpenStep 的規格書,裡頭就已經有 NSNotificationCenter,時間是 1994 年;再更之前的相關文件,在網路上實在不怎麼好找。想來這個玩意與世上第一個瀏覽器差不多古老,而到了 Internet 蓬勃發展到亂七八糟的後來,又被重新強調這樣的東西可以處理多少網頁開發的亂七八糟。
有時候你還真不知道,時間的巨輪在輾過無數的殘渣之後,到底是帶著我們兜圈子,還是真的帶著我們前進到了什麼地方。
所以才有個笑話說
“小明走在時代巨輪前面 就被壓死了”