2014-05-08 42 views
0

我將描述這種「依賴性地獄」的簡化示例。需要用於處理異步代碼中依賴性地獄的庫或設計模式

想象一下帶有「播放/暫停」和「靜音/取消靜音」按鈕的視頻播放器。暫停視頻應暫停播放聲音,但不要將其靜音,以便視頻暫停播放應取消暫停播放音頻。

然後想象我們正在單獨的文件下載音頻和視頻,所以我們有四個成功/錯誤回調。想象一下,視頻可以無音頻播放,但不能相反。現在想象一下,如果需求更新,應該對代碼進行多少更改,以便視頻和音頻應該相互等待。

目前我正在處理這個使用回調和布爾變量。我有一種感覺,這是石器時代,因爲這樣的事情:

if (videoShouldPlay && audioShouldPlay && isAudioPlaying && isVideoDownloaded && isAudioDownloaded) { 

或4類似的回調:

audio.onload = function() { 
    if (isVideoDownloaded) 
     ..... 
    } else { ... 
} 

不可讀維護。依賴關係的數量隨着組件的數量呈指數增長,但當我可以定義一些通用規則時,我不應該跟蹤每個依賴項。

我確信計算機科學已經解決了這個問題。

+0

給匿名downvoter:請解釋downvote! – Ali

回答

2

看來我需要一個state machine。例如,我們以「正在播放」和「已暫停」狀態爲例。 「正在播放」➜「已暫停」的過渡規則是你寫的:「暫停視頻應該暫停聲音,但不要靜音」等等。手。

我就從Agile Software Development, Principles, Patterns, and Practices建議第29章國與國家Refactoring to Patterns更換國家塗改條件語句。我個人發現着名的Design Patterns: Elements of Reusable Object-Oriented Software這本書有點難以閱讀,但它是國家模式。

+0

我的想法是不要在問題中張貼太多的代碼,因爲問題是通用的。你的回答似乎正是我想要的。 – Dan

+0

@丹很高興聽到我的答案似乎有幫助。是的,我明白你爲什麼沒有發佈更多的代碼;我只是解釋了爲什麼我沒有詳細說明如何解決你的問題。此外,一個有用的解釋將需要一本書的篇章的長度,並不適合在這裏在Stackoverflow。 – Ali