組件設計原則之概念篇(四)

http://blog.csdn.net/lovelion/article/details/8539543編程

  穩定抽象原則SAP是六個組件設計原則中的最後一個,它一般與穩定依賴原則SDP結合在一塊兒,用於建立具備較高質量的組件依賴結構。終因而最後一個了,吐舌頭less

 

穩定抽象原則(The Stable-Abstractions Principle, SAP)spa

A component should be as abstract as it is stable.
組件的抽象程度應該與其穩定程度一致。
.net

 

 

 

       SAP將組件的穩定性和抽象性聯繫了起來。SAP原則規定,一個穩定的組件應該是抽象的,這樣在具有穩定性的同時也將具有較好的可擴展性。此外,它還規定,一個不穩定的組件應該是具體的,它的不穩定性要求其內部的具體代碼應該是易於修改的,這種修改不會給其餘組件帶來太大的影響。設計

       在一個相對穩定的組件中,應該包含一些抽象類,這樣就能夠對它進行擴展。component

       SAP和SDP一塊兒構成了組件的DIP(依賴倒轉原則)。SDP要求依賴應該朝着穩定的方向進行,而SAP則規定穩定性意味着抽象性,組件的穩定程度要與其抽象程度一致。所以,依賴也應該朝着抽象的方向進行。根據DIP,爲了下降類與類之間的耦合度,咱們要針對接口編程,而不要針對實現編程,同理,爲下降組件之間的耦合度,咱們要針對抽象組件編程,依賴應該沿着抽象而又穩定的組件來進行。blog

      因爲在一個組件中能夠包含多個類,其中有些類是抽象的,而另外一些類是具體的,所以在評價一個組件的抽象程度時,能夠經過計算「抽象類的數量佔類總數的百分比」來度量一個組件的抽象性。接口

 

抽象性度量ip

       爲了度量組件的抽象性,需引入如下幾個度量指標:ci

       Nc(The number of classes):組件中類的總數。

       Na(The number of abstract classes):組件中抽象類的數目,一個抽象類中至少包含一個抽象的方法,抽象類不能被實例化。

       A(Abstractness):抽象性因子。

       A = 0表示組件中沒有任何抽象類;A = 1表示組件中全部的類所有都是抽象類。

       咱們能夠先計算出每個組件的抽象性因子A,結合SAP和SDP兩大原則,不可貴知,依賴須要沿着穩定的方向進行,也須要沿着抽象的方向進行,能夠經過比較一個依賴鏈上每一個組件的A值來判斷依賴鏈是否須要進行調整,A值能夠做爲一個改善和調整依賴鏈的指標,但這並非強制性的。

 

主序列分析

       在Bob大叔的ASD一書中,有專門的一節來分析穩定性和抽象性之間的關係,並獲得了一條主序列(Main Sequence)。Sunny以爲這個過程有點像是在作軟件工程的理論研究,與軟件工程的實踐仍是有所區別的,可是,軟件工程的發展既須要理論研究的支持,又須要實踐經驗的驗證,並且瞭解一下人家如何作研究,自己也是一件挺有意思的事情,接下來我介紹一下Bob大叔如何分析組件穩定性和抽象性之間的關係。

      爲了更好地研究組件的穩定性和抽象性,咱們能夠引入了一個二維座標圖,其中抽象性A做爲縱軸,不穩定性I做爲橫軸,縱軸和橫軸的座標刻度都是從0到1,最穩定、最抽象的組件位於座標左上角(0,1)處,也就是說當不穩定性I=0,抽象性A=1時,組件是最穩定、最抽象的;而那些最不穩定、最具體的組件位於座標的右下角(1,0)處,此時不穩定性I=1而抽象性A=0。理想狀況下,咱們但願組件都可以落在這兩個位置附近,也就是說,組件要麼是最穩定最抽象的,要麼是最不穩定最具體的,可是這畢竟只是理想狀況,絕大部分組件的抽象性和穩定性都具備必定程度,位於這兩個點之間。

      Bob大叔認爲,在(0,0)附近的組件,是一些具備高度穩定性且具體的組件,可是這種組件僵化程度很高,由於它是具體的,沒法對其進行擴展,又由於它是高度穩定的,所以很難對它進行更改。簡單來講,位於此處的組件,它會被不少其餘組件所依賴(穩定性),可是它很難擴展和修改(具體性)。(0,0)附近的區域被稱爲痛苦地帶(Zone of Pain)

      在(1,1)附近的組件,也不是一個好的位置,此處的組件雖然具備最低的穩定性和最高的抽象性,可是因爲其穩定性低,所以沒有其餘組件依賴它們,即便具備很高的抽象性也不能獲得使用。因此這個(1,1)附近的區域被稱爲無用地帶(Zone of Uselessness)

      咱們但願所設計的組件可以儘可能遠離這兩個區域,而將距離這兩個區域都最遠的軌跡點鏈接成一條線,這條線就是鏈接(1,0)和(0,1)點的線,這條線稱爲主序列(Main Sequence),所圖1所示。

 

圖1 主序列和被排除的區域示意圖

       位於主序列上或者靠近主序列的組件都具備必定程度的穩定性和抽象性,雖然組件的理想位置是主序列的兩個端點,可是在實際項目中,大部分組件可以位於主序列上或者主序列附近就已經很不錯了。

      爲了更好地度量一個系統的組件設計是否足夠好,最後再介紹一個度量:到主序列的距離

      到主序列的距離(簡稱距離)是指一個組件到主序列之間的距離(D),計算公式以下:

      該度量值的取值範圍是[0,0.707]。

      除此以外,還能夠用一種規範化距離(D')來表示,計算公式以下:

      D'的取值範圍是[0,1],0表示組件正好位於主序列上,1表示組件到主序列的距離最遠。

      經過使用這個度量,咱們能夠全面分析一個組件設計方案和主序列之間的一致性。首先能夠計算出每一個組件的D值,而後對全部D值不在0附近的組件進行復查和調整。這將有助於設計者肯定哪些組件更容易維護,哪些組件對變化不敏感、更加穩定。

      此外,還能夠對組件設計方案進行統計學的分析,例如能夠計算出設計中全部組件的D度量值的均值和方差,而且指望獲得一個均值和方差都接近於0,也就是儘可能符合主序列的設計。經過方差分析,能夠找出一些比較特殊的組件,如圖2所示,在這個分佈圖中,大部分組件都沿着主序列分佈,可是也有一些組件離主序列較遠,標準誤差Z值超過1甚至2,咱們須要留意這些偏離較大的組件,儘可能找出是什麼緣由致使它們很是抽象但具備較少的依賴者,或者很是具體可是有較多的依賴者,必要時咱們須要對這些組件進行重構,進一步改進系統的設計。

圖2 組件的D值分佈圖(示例)

       除此以外,咱們還能夠繪製每一個組件的D'度量值隨時間變化的分佈圖,看是否隨着系統版本的升級或者演化致使某個(或某些)組件的D'值發生了較大的改變,若是在某個版本中一個組件的D'值發生異常變化或者超過預先設定的一個閾值,須要找出改變的緣由,以便對系統實施更好的重構。

 

 總結 

    組件設計以及組件之間的依賴關係是有好壞之分的,經過應用這六個組件設計原則,能夠在必定程序上改進組件的設計。

    重用-發佈等價原則(REP):重用的粒度就是發佈的粒度。

    共同重用原則(CRP):一個組件中的類需一塊兒被重用。若是你重用了組件中的一個類,那麼就要重用其中全部的類。

    共同封閉原則(CCP):一個組件中的全部類對於同一種類型的變化應該是共同封閉的。一個變化若對一個組件產生影響,則將影響該組件中全部的類,而對其餘組件不形成影響。

    無環依賴原則(ADP):在組件的依賴關係圖中不容許存在環。

    穩定依賴原則(SDP):朝着穩定的方向進行依賴。

    穩定抽象原則(SAP):組件的抽象程度應該與其穩定程度一致。

 

      至此,6個組件設計原則所有介紹完畢,雖然有些原則的分析過於理論,看起來也挺枯燥的,可是一旦深刻進去發現仍是挺有意思的,但願這幾篇文章對你們可以有所幫助!吐舌頭

【做者:劉偉 http://blog.csdn.net/lovelion

相關文章
相關標籤/搜索