解耦的本質是什麼?

對於解耦代碼雙方,使用約定好的接口來交換信息,此接口每每只有幾個很是簡練的約束,而不過於限制具體細節。對象

我向通訊的對方發送了數據,或者發起了事件,若是不須要知道對方拿個人數據作什麼用,怎麼用,就是真正的解耦。
若是個人邏輯須要清晰的知道通訊對方拿個人數據用來幹什麼,若是不知道會破壞邏輯,就不是真正的解耦。接口

正面例子:
C#中隨處可見的委託機制。在特定的時機提供一個可供訂閱的事件,事件訂閱者有多少,訂閱後他們會在觸發時機作什麼,對於事件發佈者來說都是不知道,而且也不關心的。
反面例子:
Blackboard模式。Blackboard保存着無數據的格式,任意對象能夠向它寫入數據,任意對象能夠從它中讀取數據。
Blackboard對存在它裏面的數據沒有任何識別能力,Blackboard也不須要知道關於它內部存儲的數據的任何事情,就能夠正常運做。
在這種情景下,其實作到了解耦的,是Blackboard本身而已,而不是通訊雙方。通訊雙方對對方可能不產生代碼耦合,可是實際邏輯是耦合的。
邏輯明明是耦合的,代碼卻好像沒有任何關係,這帶來的只是更難理解的代碼,弱化了類型約束,使編譯器對明顯錯誤的邏輯無能爲力。事件

相關文章
相關標籤/搜索