設計的核心任務之三:確保正交性

來源:互聯網
上載者:User

寫物件導向設計原則的文章很多,但在我看來物件導向的一些原則是雖然是對的,但不夠精練。

大多面向原則其實可以用三個支撐點推匯出來:確保正交,控制層次,資訊隱藏。

這一篇裡談一下確保正交性。

 

抽象是設計工作的起點,而抽象的結果可以是一個具體的概念,也可以是一段邏輯。正交性則與抽象的結果有關聯。為了理解正交性,我們先來看一下這個詞的幾何解釋:

 

當兩根直線互相垂直的時候,我們認為這兩根直線是正交的,否則的話這兩根直線就是不正交的。

 

這似乎和軟體沒什麼關聯。

但如果我們假設相交的不是兩根直線,而是兩根圓柱的話,那麼我們就可以看出來正交和非正交的差別所在。在正交的情況下,兩根圓柱的最大接觸面積始終會等於圓柱截面的面積,但在非正交的情形下,接觸面積則要大於圓柱截面的面積,並且傾斜度越大,接觸面積越大。

 

如果這兩根圓柱是木材的話,那麼接觸面積越大,施工量越大,木材的可替換性也就越差。

 

概念或邏輯關係正交與否,其影響與上述類似。

 

假設說我們定義了兩個類,類XMLReader負責具體讀取XML檔案中的節點,類XMLDataHandler負責加工從XML檔案中讀取出來的資料。這個時候如果在XMLDataHandler中出現了根據XPath讀取XML內容的方法,那麼這兩個類無疑的會變成非正交的。因為讀取這一功能即存在於XMLReader,也存在於XMLDataHandler。這種情形下,這兩處地方都和XML的結構產生耦合,如果XML的結構發生變更,那麼這兩個地方都需要變更。

 

再假設說,我們在讀取XML的時候要進行資料完整性的檢查,並實現了xmlDataVerify()方法,那麼如果在xmlRead()方法裡面也進行了資料完整性的檢查,那麼這兩個方法也是非正交的。因為檢驗規則必須要在兩處同時存在。一旦檢驗規則發生變化,兩個地方也需要同時被修改。

 

上述這類不正交的情況,有時候會被稱為耦合,有時候會被稱為不充分的抽象,但不管怎樣,其根本問題在於概念或邏輯的非正交性。

 

不正交的情形有很多,但總結起來,這些情形大致可以分為兩個類別,這兩個類別與軟體概念間可能的基本關係有關。

 

如果要把軟體中的概念間的基本關係做個分類的話,那麼大致可以分為兩類:一為明確一種層次關係,不同的部分做的事情事實上是重疊的,但具體的程度不同,我們把這種關係稱為橫向分割,二為明確彼此關係,即你做什麼,我做什麼,我們把這種關係稱為縱向分割。

 

橫向分割產生“層”的概念。

比較經典的例子有OSI的網路模型,Windows的GDI設計等。這裡以Windows的GDI設計來做一些說明:

Windows一直強調一個所見即所得 (WYSIWYG)的概念("WYSIWYG"),也就是說螢幕上使用者看到的內容應該和印表機上打出來的內容保持一致。

如果應用程式(比如Word)與顯示器的特性,乃至印表機的特性直接相關,那麼幾乎沒可能達成這一目標。為解決這一問題,Windows中採用的辦法是在具體裝置和應用之間架起一個新的層次,這個新的層次即GDI。

 

 

這種情況下,GDI層和Driver層做的事情本質相同:即向指定頁面描述指定內容。但具體描述方法不同,GDI較少關注裝置特性(或者說只關注裝置通用特性),而驅動程式則要關注裝置的特有屬性。

 

很多設計手法,其本質都是在軟體的結構中加入更多的層次。像我們常說的Proxy, Facade模式,實現“開-閉”原則 (Open-Closed principle, OCP)的方法等。

 

縱向分割則產生模組或對象,經典的例子是MVC等模式。Model,View和Controller其實是不同的概念,但他們彼此間有聯絡,所以這三個相對獨立的概念要經過某種關係串連在一起。

橫向分割的時候,不正交體現為抽象層次上的不一致性,比如在Driver層面還做許多GDI層面應該做的事情;縱向分割的時候,不正交體現為重疊地區的存在,比如在View中直接對資料進行處理。

 

正交性強調的是只讓概念或邏輯在必須關聯的點上產生關聯。

 

充分的抽象,其最終結果往往是正交的概念或邏輯,而正交的概念或邏輯大多時候是應對變化,可測試,降低耦合度的基礎。

 

關聯文章:

設計的核心任務之二:資訊隱藏

設計的核心任務之一:層次的控制

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.