初步再來探讨下架構設計和概要設計的差別和邊界問題。先談下架構設計:
架構設計包括了功能性架構和技術架構設計兩個部分的内容,功能性架構解決業務流程和功能問題,而技術架構解決非功能性需求等問題。兩種架構都包括了動态和靜态兩個方面的内容,對于功能性架構中動态部分為業務流程驅動全局用例,用例驅動的用例實作等;對于技術架構中動态部分為架構運作機制,而靜态部分為架構,分層等方面的内容。
功能性架構包括了全局用例設計,這個本身是用例分析和設計的一個延續,而全局用例分析建議的思路仍然是業務流程,業務用例模組化到系統用例模組化的過程。全局用例分析清楚後可以開始考慮子系統和子產品的劃分,形成系統的功能架構圖,當然在劃分過程中一定要考慮到通過CRUD矩陣等分析方法來分析子產品如何劃分合理,如何保證子產品本身高内聚和松耦合。
在全局用例分析完成後涉及到資料模型的設計,資料模組化仍然從業務驅動,從最初的業務對象和單據入手,到最終的資料概念模型和邏輯模型等。架構設計中全局資料模型不一定覆寫所有的資料對象和資料表;但是核心的主資料,核心業務單據資料一定要覆寫到,模型到的層次到邏輯模型即可。如果用面向對象的分析方法,這裡需要出的是UML模組化中的概念模型和邏輯模型,展現核心對象和類,核心對象和類之間的關系。
将全局用例分析和資料模型建立融合在一起,可以看到這兩者結合起來會形成一個系統完成的領域模型層。一直認為領域模型思路應該引入架構設計,隻有領域模型才是真正關注功能性架構,而不用馬上關注到具體的技術分層和技術實作。
前面兩者做完後可以看到一個大系統被分解為了多個子系統或子產品,那麼接着要考慮的就是子產品間的內建架構,分析完內建架構子產品間的接口基本就出來了。接口設計應該是架構設計的另外一個核心内容。要明白架構設計一個重要作用就是架構設計完成後各個子產品可以并行開始概要設計,詳細設計和開發工作。隻要大家都遵循架構設計約定的接口規則即可以了。
內建架構考慮完另外一個核心内容就是公共可複用元件的抽取和識别,包括了功能元件和技術元件,需要識别出來哪些是可複用的,如何進行複用。對于複用層次本身又包括了資料層複用,邏輯層元件複用,界面層UI元件的複用等。複用是架構價值展現的的另外一個關鍵點。
這些都做完後,接着一個步驟應該在架構設計階段做的就是對架構輸出成功進行模拟驗證,前面完成了分解動作,必須通過模拟驗證來看看後續分解内容能否很好的內建群組裝。很多時候我們做架構設計的時候往往不做這塊内容,導緻架構設計一些内容變成空中樓閣,無法落地。
再回來看技術架構設計,首先談下靜态部分的内容。這裡面就包括了軟體開發的分層架構,開發架構等内容,包括開發規範約定,技術平台和語言的選擇,使用的規約等都需要考慮。很多時候我們看到談架構的時候說到的三層或多層架構,僅僅是完整架構設計裡面很小的一部分内容。
除了分層架構外,接着考慮的就是各種非功能性需要,我們在架構上需要如何設計。這裡面包括了事務,緩存,異常,日志,安全,性能,可用性,容錯能力等。這些逐個點都要在架構設計中說清楚如何考慮,由于這些本身就屬于一個應用系統中技術平台要考慮的内容,是以應該設計為較為公用的技術元件供上層的業務元件使用。要明白很多時候為何談到AOP或可插拔架構,隻有這樣去考慮問題,才會考慮真正的功能性架構設計和功能實作和非功能性技術架構這塊充分解耦,實作進一步的靈活裝配。
再回到架構設計視圖層面,還需要考慮的就是整個應用系統的部署架構,部署架構本身也包括了邏輯視圖和實體視圖,應用最終開發出來了如何進行部署,這涉及到了IT基礎架構方面的細化,也需要考慮清楚。
概要設計
概要設計首先要明白的是根據架構設計的内容進一步對某個子產品的設計進一步細化。架構設計在系統級,而概要設計在子系統或子產品級。拿建築來比喻,架構設計是把一個建築的架構結構全部定清楚,包括地基要挖多深,核心架構和承重結構如何,每一層的結構圖如何,應該分為幾個大套間這些内容都應該定下來。每個大套間的水,電,氣等管道接入點在哪裡等。而概要設計要做的是拿着一個套間,來考慮這個套間内部該如何設計,如何劃分功能區域,如何将水電氣接入點進一步在房間内延伸,哪些地方需要進一步增加非承重的隔斷等。
基于以上思路我們看到在架構設計的時候,除了很少部分的核心用例我們會談到具體的用例實作完,大多數功能我們都不會談到具體的用例實作層面。而到了概要設計則需要進一步的分解我這塊子產品究竟需要實作哪些功能點,具體的每個功能點究竟如何實作都必須要考慮到。
嚴格的概要設計,我們希望是到了概要設計的某個功能子產品,子產品所涉及到的核心的類全部會出來,類關系圖全部會出來。資料庫設計也進一步細化到該子產品的資料庫實體模型。對于用例進行用例實作分析,在實作分析過程中可以看到每個類核心的public方法全部會分析識别出來。
拿着架構設計的接口,概要設計也需要進一步細化,細化出接口具體的輸入輸出和使用方法,包括子產品應該使用哪些外部接口,子產品本身又提供哪些接口出去都必須細化清楚。做概要設計的時候一定要清楚目前做的這個子產品在整個應用系統架構中的位置,和外部的內建和互動點。
概要設計不用到詳細設計這麼細化,包括類裡面的私有方法,public方法的具體實作步驟和邏輯,僞代碼等。但是我們要看到概要設計裡面對于核心的業務邏輯必須要設計清楚如何實作,實作的機制和方法。很多時候我們到了概要設計畫uml的時序圖,很多時候一看沒有任何意義,全是跨層的簡單的互動和調用。這個應該在架構設計的架構運作機制說清楚即可。設計到多個業務類間的互動調用才是重點,一個簡單的功能增删改查,完全沒有必要畫什麼時序圖。
其次架構設計中給出了各種安全,性能,緩存的設計。那麼在概要設計中出來另外一個問題,即架構給出的各種實作方案和技術,我們在概要設計中如何選擇,如何使用。不是所有功能都需要緩存,那就要說清楚哪些功能根據分析需要緩存,需要緩存哪些對象,緩存本身的時效性如何設定等問題。
概要設計作為我們要達到一個目的,就是不論是誰拿走概要設計來做,最終實作出來的功能子產品不會走樣,功能子產品最終實作出來可能有性能,易用性等方面的問題,但是整個功能實作的大架構一定是定了的。