做了好幾年架構設計的事了,一直沒有好好的總結。實在不好,花點時間總結一下,寫出來,有興趣的朋友可以一起探討。
軟件架構設計的主題狠深狠難,本文打算從架構的概念,架構的表述方法,架構設計的過程三個方面來講一下我的理解。
一、什么是軟件架構?
溫昱在《軟件架構設計》一書中,給了下面的定義:
組合派:軟件系統的架構將系統描述為計算組件及組件之間的交互。
決策派:架構是一系列重要決策的集合,這些決策與以下內容有關:軟件的組織,構成系統的結構元素及其接口的選擇,這些元素在相互協作中明確表現出的行為,這些結構元素和行為元素進一步組合所構成的更大規模的子系統,以及指導這一組織--包括這些元素及其接口、它們的協作和它們的組合--架構風格。
在我看來,決策派的定義更為具體和準確,注意決策派用了元素這一詞而沒有用組件,組件是有具體含義的,指一個可獨立替換的物理單元,而架構需要能夠指導涉眾,如開發人員、用戶、部署人員等等,對開發人員來講,開發過程中如何分包、如何將包打包為組件,架構師需不需要提供指導呢,答案是肯定的。因此,如果將架構限定在組件和組件的交互上,是不完整的。
二、架構的表述方法
這個現在都有共識,就是4+1視圖表述法:邏輯視圖,實現視圖,進程視圖,部署視圖,用例視圖。 參見下圖RUP 4+1視圖:
用例視圖關注系統的人、事、物、規則,人是指系統的Actor,包括業務主角和業務工人,事是指系統用例,物是指業務實體,規則指做事情的前置條件、后置條件,做事情過程中的規則。下面這個圖很精辟:
用例視圖是4+1視圖中的+1,它定義需求標準,跟其它視圖描述系統某一方面的結構有很大的不同。
邏輯視圖關注系統的邏輯功能模塊和領域模型,不僅包括用戶可見的功能模塊,還包括實現用戶功能而必須提供的“輔助功能模塊”;它們可能是邏輯層、功能模塊、類等。
實現視圖關注程序包,不僅包括要編寫的源程序,還包括可以直接使用的第三方SDK和現成框架、類庫,以及開發的系統將運行于其上的系統軟件或中間件。開發架構和邏輯架構之間可能存在一定的映射關系:比如邏輯架構中的邏輯層一般會映射到實現架構中的多個程序包;再比如實現架構中的源碼文件可以包含邏輯架構中的一到多個類(在C++里一個源碼文件可以包含多個類,即使在Java里一個源碼文件也可以同時包含一個類和幾個內部類)。
進程視圖關注進程、線程、對象等運行時概念,以及相關的并發、同步、通信等問題。
進程視圖和實現視圖的關系:實現視圖一般偏重程序包在編譯時期的靜態依賴關系,而這些程序運行起來之后會表現為對象、線程、進程,進程視圖比較關注的是這些運行時單元的交互問題。
物理視圖關注“目標程序及其依賴的運行庫和系統軟件”最終如何安裝或部署到物理機器,以及如何部署機器和網絡來配合軟件系統的可靠性、可伸縮性等要求。物理架構和運行架構的關系:運行架構特別關注目標程序的動態執行情況,而物理架構重視目標程序的靜態位置問題;物理架構還要考慮軟件系統和包括硬件在內的整個IT系統之間是如何相互影響的。
上面幾個視圖是最典型的視圖,不管你是通信中間件,還是依賴于數據庫的企業應用都需要的。對于依賴數據庫的企業應用,通常還需要數據視圖,數據視圖關注對象如何存儲,如數據庫表等。
4+1視圖不僅僅是軟件架構的表述方法,它們各自從不同的視角去展現架構,因此,還是一種比較好的思維方式,引導我們從不同的視角去思考,從而做出比較系統的架構設計。