在幾何學中,正交性的典型例子是座標軸。只改變橫軸的值,不會對縱軸值產生影響。 後來,正交性的影響逐漸延伸至軟件設計領域。
比如,在設計良好的系統中,數據庫與用戶界面是正交的:改動界面,而不會影響數據庫,反之亦然。
Unix文化締造者道格拉斯·麥克羅伊(Malcolm Douglas McIlroy)曾總結的Unix哲學:“只做一件事,把它做好”,很多人以爲只是在強調簡單性,殊不知這其中也暗含了對正交性的強調。
軟件中的正交性
隨着軟件功能增多,軟件裏的模塊會變得越來越複雜,隨時會變成一匹脫繮的野馬,不受程序員的掌控,這時候就需要把軟件系統的模塊進行拆分。
而正交性就是模塊拆分需要遵循的原則,意味着更改一個組件,另一個組件不會受到影響(比如多米諾骨牌)。這樣逐漸複雜的系統纔會變得相對有條理,方便後期的管理與維護。
如何遵循正交原則?
一旦涉及模塊拆分,首先要解決的問題就是如何分,如何合。
(如何分)
當劃分模塊時,要讓每個模塊簡單明瞭(高內聚),模塊間不要有很強的關係。具體可依照以下兩個原則:
1、消除重複
重複的代碼,其實都在表達同一項功能需求。如果需求發生變化,這些分佈在不同模塊中的重複代碼,統統都要修改,增加了維護成本。
有關 Don't Repeat Yourself 原則的內容可查看我們的往期視頻,其實正交性原則與 DRY 原則緊密相關,運用DRY原則,可使系統中的重複降至最小;運用正交性原則,可減少系統組件間的相互依賴。
2、按需求分類
圖書館中,書籍會分有哲學、社會科學等不同區域。同理,在軟件模塊中,不同的小模塊也有不同的職責,應儘量把這些關聯緊密的部分放在此模塊中,減少與其他模塊的連接。
(如何合)
當模塊通過接口相連時,需要讓模塊間儘可能不要相互影響。
比如樂高的A模型跟臨近模型只通過底部相連,拿掉A不會影響其他模型。而B模型依賴於兩邊的模型,拿掉B後,組接的成本就會高一些。
同理,在軟件設計中,模塊間應儘量減少依賴,接口儘可能簡單。
正交原則如何應用於實際工作中?
除了代碼設計,正交原則大多可用於以下幾個方面。
·用在編碼中
編寫代碼的過程中,有很多方法可以維持正交性。
比如說編寫“害羞”的代碼,它們不會向其他模塊暴露任何問題,彼此獨立不干擾。
·用在項目團隊中
具有正交性的項目團隊,通常分工明確,效率最高。每個人都知道自己要做什麼,並全力做出貢獻。
如何檢驗一個團隊是否具有正交性?
可觀察項目中每個變動會涉及的人數,涉及人數越多,團隊的正交性就越差。而正交性差會導致團隊組織重疊,各成員的責任不明確,每次改動可能會讓團隊中的任一成員都會受到影響。
Kent Beck 曾提出一個精煉的原則:局部化影響。任何一個變化,對當前的軟件設計影響範圍都可以控制在一個儘量小的局部。當然這是所有軟件從業者的理想狀態,不妨就儘量去做吧。
《程序員修煉之道》系列更多視頻可戳:《程序員修煉之道》系列視頻