如果你想要制作易于設計、構建、測試及擴展的系統,正交性是一個十分關鍵的概念,但是,正交性的概念很少被直接講授,而常常是你學習的各種其他方法和技術的隱含特性。這是一個錯誤。一旦你學會了直接應用正交性原則,你將發現,你制作的系統的質量立刻就得到了提高。
什么是正交性:

“正交性”是從幾何學中借來的術語。如果兩條直線相交成直角,它們就是正交的,比如圖中的坐標軸。用向量術語說,這兩條直線互不依賴。沿著某一條直線移動,你投影到另一條直線上的位置不變。
在計算技術中,該術語用于表示某種不相依賴性或是解耦性。如果兩個或更多事物中的一個發生變化,不會影響其他事物,這些事物就是正交的。在設計良好的系統中,數據庫代碼與用戶界面是正交的:你可以改動界面,而不影響數據庫;更換數據庫,而不用改動界面。
習題:
(1). 你在編寫一個叫做Split的類,其用途是把輸入行拆分為字段。下面的兩個Java類的型構(signature)中,哪一個是更為正交的設計?
- class Split1 {
- public Split1(InputStreamReader rdr) { ...
- public void readNextLine() throws IOException { ...
- public int numFields() { ...
- public String getField(int fieldNo) { ...
- }
- class Split2 {
- public Split2(String line) { ...
- public int numFields() { ...
- public String getField(int fieldNo) { ...
- }
答:我們的看法是,Split2更為正交。它專注于自己的任務,拆分輸入行,同時忽略輸入行來在何處這樣的細節。這不僅是代碼更易于開發,也使得代碼更靈活。Split2拆分的行可以來自文件、可以由另外的例程生成、也可以通過環境傳入。
(2). 非模態對話框或模態對話框,哪一個能帶來更為正交的設計?
答:如果設計正確,很可能是非模態對話框。使用非模態對話框的系統與任一特定時刻正在發生的事情的關聯較少。它很可能會擁有比模態系統更好的模塊間通信基礎設施,模態系統對系統的狀態可能會有內在的假定——導致耦合增加、正交性降低的假定。
(3). 過程語言與對象技術的情況又如何?哪一種能產生更為正交的系統?
答:這個問題有點棘手。對象技術可以提供更為正交的系統,但因為它有更多的特性可被濫用,使用對象技術實際上比使用過程語言更容易創建出非正交的系統。像多重繼承、異常、操作符重載、父方法重定義(通過定義子類)這樣的特性提供了通過不明顯的途徑增加耦合的充足機會。