事件管理是 RichClient 開發最難掌握、也最關鍵的部分。良好的事件設計讓使用者思維流暢不中斷,實現「一切皆異步」的終極目標。
取股票資料不應只是「背景執行緒跑完回呼」,而應建模為事件流:
介面僅回應事件,運算於他處悄悄進行。同一資料可能在多處以不同形式呈現(Skype 通話中頭像顯示忙線、通話視窗另一種顯示;MSN 簽名在好友列表可編輯、聊天視窗唯讀)。資料更新時,所有檢視需同步反映——單純 runInAnotherThread 完全無法解決。
StockDataRetriever {
observers: []
retrieve() {
try {
theData = ... // 遠端取得
observers.each { |o| o.stockDataReady(theData) }
} catch {
observers.each { |o| o.stockDataFailed() }
}
}
}
StockDataRetriever.observers.add(StockWindow)
StockWindow {
stockDataReady(theData) { showDataInUIThread(); }
stockDataFailed() { showErrorInUIThread(); }
}
忽略事件抽象將導致架構級災難,小修小補無濟於事。此為核心原則,必須深度掌握。