核心概念#
正交性是個關鍵概念,如果你想產出容易設計、建構、測試和擴展的系統。
然而,正交性的概念很少被直接教導,它通常是你學習的各種方法和技術的隱含特徵。
什麼是正交性#
「正交性」是從幾何學借來的術語。兩條線如果以直角相交就是正交的,例如座標軸。
在向量術語中,兩條線是獨立的。在計算中,這個詞用來表示一種獨立性或解耦。
兩個或更多事物如果其中一個的改變不影響其他的,它們就是正交的。
非正交系統的例子——直升機#
直升機有四個基本控制裝置,每一個控制輸入都有副作用:
降低左手操縱桿時機鼻會下沉並開始向左螺旋,你需要同時補償多個其他控制裝置。
直升機的控制明確是非正交的——這就是為什麼它如此難以操控。
Tip 17 - Eliminate Effects Between Unrelated Things(消除不相關事物之間的影響)
正交性的好處#
我們想設計自我包含的元件:獨立的,有單一、明確定義的目的。
當元件彼此隔離時,你知道可以改變一個而不必擔心其他的。
正交系統帶來兩大主要好處:提高生產力和降低風險。
提高生產力#
- 修改被局部化,開發和測試時間減少
- 促進重用——具有明確職責的元件可以被以原始設計者未設想的方式組合
- 組合正交元件時,每單位工作量產出更多功能
(M 件事 x N 件事 = M x N 結果,而非正交時會有重疊和減少)
降低風險#
- 有問題的程式碼段被隔離,不會擴散症狀
- 系統較不脆弱,小修改的問題被限制在該區域
- 更容易測試,因為可以針對元件設計和執行測試
- 不會被特定廠商、產品或平台綁死
在設計中應用正交性#
系統應由一組互相合作的模組組成,每個模組獨立實作功能。
分層架構是強大的正交設計方式——每層只用其下層提供的抽象。
正交設計的測試#
問自己:如果我大幅改變某個特定功能背後的需求,有多少模組會受到影響?
在正交系統中,答案應該是「一個」。
也要問你的設計與現實世界的變化解耦了多少——
不要依賴你無法控制的事物的屬性(電話號碼、郵遞區號等)。
在程式碼中維持正交性#
維持正交性的幾個技巧:
- 保持程式碼解耦:寫「害羞」的模組——不向其他模組透露不必要的東西,
也不依賴其他模組的實作。遵循迪米特法則(Law of Demeter) - 避免全域資料:每次你的程式碼引用全域資料,它就和共享該資料的其他元件綁在一起
- 避免相似的函式:如果函式看起來很像,可能有結構性問題。
使用策略模式(Strategy Pattern)來改進
測試中的正交性#
正交設計的系統更容易測試。
單元測試就是正交性的一個有趣測試——
如果建構和執行一個單元測試需匯入系統大量其他部分,你就發現了耦合。
修 bug 時也是評估正交性的好時機:修復是否局部化在一個模組中?
每次 bug 修復影響的原始檔案數量趨勢如何?
與 DRY 的關係#
正交性與 DRY 原則密切相關。DRY 是要最小化系統重複,而正交性是要減少系統元件間的相互依賴。
兩者結合使用,你會發現開發的系統更靈活、更易理解、更易除錯、測試和維護。
如果你加入一個人們拼命修改、每個改變似乎會導致四個其他地方出錯的專案,記住直升機的噩夢。
這個專案大概不是正交設計和編碼的。是時候重構了。
相關章節#
- Topic 3,軟體的熵
- Topic 8,優秀設計的精髓
- Topic 11,可逆性
- Topic 28,解耦
- Topic 31,繼承稅
- Topic 33,打破時間耦合
- Topic 34,共享狀態即不正確狀態
- Topic 36,黑板