如果你想要制作易于設(shè)計(jì)、構(gòu)建、測(cè)試及擴(kuò)展的系統(tǒng),正交性是一個(gè)十分關(guān)鍵的概念,但是,正交性的概念很少被直接講授,而常常是你學(xué)習(xí)的各種其他方法和技術(shù)的隱含特性。這是一個(gè)錯(cuò)誤。一旦你學(xué)會(huì)了直接應(yīng)用正交性原則,你將發(fā)現(xiàn),你制作的系統(tǒng)的質(zhì)量立刻就得到了提高。
什么是正交性:

“正交性”是從幾何學(xué)中借來(lái)的術(shù)語(yǔ)。如果兩條直線相交成直角,它們就是正交的,比如圖中的坐標(biāo)軸。用向量術(shù)語(yǔ)說(shuō),這兩條直線互不依賴。沿著某一條直線移動(dòng),你投影到另一條直線上的位置不變。
在計(jì)算技術(shù)中,該術(shù)語(yǔ)用于表示某種不相依賴性或是解耦性。如果兩個(gè)或更多事物中的一個(gè)發(fā)生變化,不會(huì)影響其他事物,這些事物就是正交的。在設(shè)計(jì)良好的系統(tǒng)中,數(shù)據(jù)庫(kù)代碼與用戶界面是正交的:你可以改動(dòng)界面,而不影響數(shù)據(jù)庫(kù);更換數(shù)據(jù)庫(kù),而不用改動(dòng)界面。
習(xí)題:
(1). 你在編寫(xiě)一個(gè)叫做Split的類(lèi),其用途是把輸入行拆分為字段。下面的兩個(gè)Java類(lèi)的型構(gòu)(signature)中,哪一個(gè)是更為正交的設(shè)計(jì)?
- 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更為正交。它專(zhuān)注于自己的任務(wù),拆分輸入行,同時(shí)忽略輸入行來(lái)在何處這樣的細(xì)節(jié)。這不僅是代碼更易于開(kāi)發(fā),也使得代碼更靈活。Split2拆分的行可以來(lái)自文件、可以由另外的例程生成、也可以通過(guò)環(huán)境傳入。
(2). 非模態(tài)對(duì)話框或模態(tài)對(duì)話框,哪一個(gè)能帶來(lái)更為正交的設(shè)計(jì)?
答:如果設(shè)計(jì)正確,很可能是非模態(tài)對(duì)話框。使用非模態(tài)對(duì)話框的系統(tǒng)與任一特定時(shí)刻正在發(fā)生的事情的關(guān)聯(lián)較少。它很可能會(huì)擁有比模態(tài)系統(tǒng)更好的模塊間通信基礎(chǔ)設(shè)施,模態(tài)系統(tǒng)對(duì)系統(tǒng)的狀態(tài)可能會(huì)有內(nèi)在的假定——導(dǎo)致耦合增加、正交性降低的假定。
(3). 過(guò)程語(yǔ)言與對(duì)象技術(shù)的情況又如何?哪一種能產(chǎn)生更為正交的系統(tǒng)?
答:這個(gè)問(wèn)題有點(diǎn)棘手。對(duì)象技術(shù)可以提供更為正交的系統(tǒng),但因?yàn)樗懈嗟奶匦钥杀粸E用,使用對(duì)象技術(shù)實(shí)際上比使用過(guò)程語(yǔ)言更容易創(chuàng)建出非正交的系統(tǒng)。像多重繼承、異常、操作符重載、父方法重定義(通過(guò)定義子類(lèi))這樣的特性提供了通過(guò)不明顯的途徑增加耦合的充足機(jī)會(huì)。