介面關係穩定原理探索 相關文章連結: 模組分解原理探索 模組分解原理與三權分立 介面設計定理 在Robert C.Martin著的《敏捷式軟體開發 (Agile Software Development)-原則、模式與實踐》一書中,提出了許多的設計原則,這裡想對其中的一條穩定依賴原理(中文版P232頁)進行一些探索。穩定依賴原則講的是“朝著穩定的方向進行依賴”,在前面提到的書中認為穩定性和更改所需的工作量有關。這裡有兩個術語值得先探討一番,一個是“依賴”,另一個是“穩定性”,什麼叫依賴,什麼叫穩定性,書中並沒有給出確切的定義。依賴這次詞在業界有多種理解,如編譯依賴,執行依賴,介面依賴等。而穩定性這個詞如果不進行確切的定義的話則是一個更難以理解清楚的詞彙,是需求穩定、代碼穩定還是什麼穩定呢?下面就來對軟體架構設計中的介面關係設計和穩定性方面的原理進行一些探索。在軟體架構設計中,如何設計各個模組間的介面關係是一個重要問題,對於給定的兩個模組A和模組B,到底應該是模組A調用模組B的介面還是應該B調用A呢?現在絕大多數程式員都是憑經驗來設計它們的介面調用(依賴)關係,而初學者則通常是根據執行依賴關係來設計介面依賴關係,將介面依賴關係和執行依賴關係設計成一模一樣,有經驗的程式員會發現有許多情況介面依賴關係不能和執行依賴關係一樣,業界還有一些設計模式就是將模組的介面依賴關係倒置過來的。設計模式中將模組介面依賴關係倒置通常都是對應於一些特定情況,有沒有普遍的原則能夠用來判定什麼情況下應該將介面依賴關係倒置呢?要解決介面關係的設計問題,還是要先看一看下面的介面關係穩定原理,
介面關係穩定原理:應該讓介面穩定性低的模組調用介面穩定性高的模組首先要對這個原理裡說道的兩個術語進行一些解釋,“介面穩定性”指的是介面本身在未來可能被修改的程度,不包括介面實現時的修改工作量。而“調用”則是指介面依賴。介面的修改程度包括兩個內容,一個是介面的修改工作量,另外一個是介面被修改機率有多大,修改程度等於兩者的乘積。在這個原理中,其實和前面的“朝著穩定的方向進行依賴”有很大的相似之處,但是在具體的細節上則有著明顯的區別,如果用在實際情況中,可能會得出完全不同的結果。例如一個軟體中的某個模組A要使用排序法模組B,排序演算法將來隨著需求的變化可能會發生變化,例如由插入排序演算法改成快速排序演算法或歸併排序演算法,而且一改動時整個排序模組要完全重新實現,修改工作量很大。按照Robert C.Martin的穩定性是指修改的工作量的理解,排序演算法模組是極不穩定的,那麼應該由排序演算法模組B去調用模組A。但是在現實情況中,可能沒有人會在一個排序算模組中去調用其他模組,為什麼呢?因為排序演算法模組雖然變化後的修改工作量很大,但是排序演算法的介面可以設計成穩定的不用修改的,所以按照介面關係穩定原理來理解,仍然應該讓模組A調用排序演算法模組B,所以介面關係穩定原理和實際情況是一致的。再看看介面穩定關係原理和實踐中的其他情況是否一致,下面以設計模式中的命令模式為例來分析一下。命令模式中,命令的管理和具體命令的實現存在執行依賴關係,但是命令模式中,並沒有讓命令管理模組去調用具體的命令實現模組,而是讓具體的命令實現模組去調用命令管理模組將自己註冊進去,實現了介面依賴關係的倒置。為什麼命令模式中要進行介面依賴關係的倒置呢?這其實是由介面關係穩定原理決定的,命令管理模組是一個有著非常穩定介面的模組,而具體的命令實現模組,由於命令可以任意增加,存在著許多不穩定因素,按照介面關係穩定原理,讓介面不穩定的模組調用介面穩定的模組,所以命令模式是符合介面關係穩定原理的。其實其他類似命令模式這種有介面依賴關係倒置的地方都是按照介面關係穩定原理來設計的。下面再來根據介面關係穩定原理推匯出一些有用的結論:
模組分層定理:符合介面關係穩定原理的系統是可分層的系統在證明這個定理前,我們先看一下前面《敏捷式軟體開發 (Agile Software Development)》一書中提到的另外一個原則:“無環依賴原則”,無環依賴原則講的是“包的依賴關係圖中不允許存在環”。其實這個無環依賴原則可以由介面關係穩定原理推匯出來,假設一個符合介面關係穩定原理的系統中的各個模組之間的介面關係圖中存在環,將環上的各個模組依次記為A1,A2,A3,…An,其中A1依賴於A2,A2依賴於A3,…,An依賴於A1。按照介面關係穩定原理,A1依賴於A2表明A1的介面穩定性比A2低,同理A2比A3低,…,An-1比An低,這樣A1的介面穩定性應該比An低,但是An又依賴於A1,表明A1的穩定性又高於An,這就矛盾。因此可以得出結論,符合介面關係穩定原理的系統中不存在介面依賴關係環,而無環有向圖是可以分層的圖(無環有向圖的分層演算法參見《多任務下的資料結構演算法》一書),這樣定理就得到證明。從模組分層定理可以看出,介面關係穩定原理和業界公認的軟體系統是分層的系統是一致的。
定理:符合介面關係穩定原理的系統總修改工作量的期望值最小。以前面說過的某模組A調用排訓演算法模組B為例,分別考慮A調B和B調A的修改工作量情況:當模組A調用B1)如果A發生修改,那麼修改的工作量是模組A的修改工作量,模組B由於沒有調用模組A,不需要做任何修改。A需要修改2)如果B發生修改,那麼修改的工作量是模組B的修改工作量,模組B由於介面穩定,沒有改動介面,模組A不需要做任何修改。B需要修改當模組B調用A3)如果A發生修改,修改時如果改動了介面時,模組B也需要跟著修改。A,B都需要修改4)如果B發生修改,模組B需要修改,模組A不需要修改。B需要修改從上面可以看出,2)和4)的修改工作量是一樣的,但3)比1)的修改工作量大,因此A調用B的修改工作量比B調用A的總修改工作量的期望值小。當然上面為了描述起來更簡單一些,第2)種情況種將模組B的介面穩定看成了介面完全不需要修改。但事實上介面穩定並不是一個絕對的概念,它是一個介面修改程度的概念,不妨以F(A)表示模組A介面的修改量,以X(A)表示模組A的修改量那麼可以得出A調用B的總修改工作量的期望值 = X(A) + X(B) +F(B)B調用A的總修改工作量的期望值 = X(A) + F(A) +X(B)由於模組B比模組A穩定,因此F(B)小於F(A),所以A調用B的修改工作量要比B調用A的修改工作量小。再考慮系統中有多個模組的情況,實際上只要有兩個模組的調用關係和介面穩定依賴關係相反的話,那麼可以把它們的介面依賴關係倒置過來,顯然這兩個模組和其他模組間的修改工作量沒有發生改變,但由上面的分析知道這兩個模組的修改工作量變小了。所以不符合介面關係穩定原理的總修改工作量一定會大於符合介面關係穩定原理的系統,換句話說,符合介面關係穩定原理的系統總修改工作量的期望值是最小的。