第三部分:理論四
阿新 • • 發佈:2021-10-04
第三部分:理論四
“解耦”為何如此重要?
- 軟體設計與開發最重要的工作之一就是應對複雜性。
- 如果說重構是保證程式碼質量不至於腐化到無可救藥地步的有效手段,那麼利用解耦的方法對程式碼重構,就是保證程式碼不至於複雜到無法控制的有效手段。
- “高內聚、鬆耦合”是一個比較通用的設計思想,不僅可以指導細粒度的類和類之間關係的設計,還能指導粗粒度的系統、架構、模組的設計。
- 因為依賴關係簡單,耦合小,修改程式碼不至於牽一髮而動全身,程式碼改動比較集中,引入 bug 的風險也就減少了很多。
- “高內聚、鬆耦合”的程式碼可測試性也更加好,容易 mock 或者很少需要 mock 外部依賴的模組或者類。
程式碼是否需要“解耦”?
- 看修改程式碼會不會牽一髮而動全身。
- 把模組與模組之間、類與類之間的依賴關係畫出來,根據依賴關係圖的複雜性來判斷是否需要解耦重構。
如何給程式碼“解耦”?
封裝與抽象
- 封裝和抽象可以有效地隱藏實現的複雜性,隔離實現的易變性,給依賴的模組提供穩定且易用的抽象介面。
- 比如,Unix 系統提供的 open() 檔案操作函式,我們通過將其封裝成一個抽象的 open() 函式,能夠有效控制程式碼複雜性的蔓延,將複雜性封裝在區域性程式碼中。我們在改動 open() 函式的底層實現的時候,並不需要改動依賴它的上層程式碼,也符合我們前面提到的“高內聚、鬆耦合”程式碼的評判標準。
中間層
- 引入中間層能簡化模組或類之間的依賴關係。
- 在引入資料儲存中間層之前,A、B、C 三個模組都要依賴記憶體一級快取、Redis 二級快取、DB 持久化儲存三個模組。在引入中間層之後,三個模組只需要依賴資料儲存一個模組即可。
- 我們在進行重構的時候,引入中間層可以起到過渡的作用,能夠讓開發和重構同步進行,不互相干擾:
- 第一階段:引入一箇中間層,包裹老的介面,提供新的介面定義。
- 第二階段:新開發的程式碼依賴中間層提供的新介面。
- 第三階段:將依賴老介面的程式碼改為呼叫新介面。
- 第四階段:確保所有的程式碼都呼叫新介面之後,刪除掉老的介面。
模組化
- 模組化是構建複雜系統常用的手段。對於一個大型複雜系統來說,沒有人能掌控所有的細節。
- 不同的模組之間通過 API 來進行通訊,每個模組之間耦合很小,每個小的團隊聚焦於一個獨立的高內聚模組來開發,最終像搭積木一樣將各個模組組裝起來,構建成一個超級複雜的系統。
- 合理地劃分模組能有效地解耦程式碼,提高程式碼的可讀性和可維護性。
- 模組化思想更加本質的東西就是分而治之。
其他設計思想和原則
- 單一職責原則
- 基於介面而非實現程式設計
- 依賴注入
- 多用組合少用繼承
- 迪米特法則:不該有直接依賴關係的類之間,不要有依賴;有依賴關係的類之間,儘量只依賴必要的介面。