基於UML2.0的系統設計思想

UML(UnifiedModeling Language)是一種建模語言,更是一種系統分析設計的最佳實踐方法。我從2003年開始接觸UML,從UML1.1到2.0,感受到了UML的獨特魅力,它不僅僅成爲在項目和產品分析設計過程中的統一標準,還逐步成爲了從需求到測試的最常用公共語言。

我記得在最早接觸UML的那段時間,項目組還在辛苦的用着面向結構化的設計思想,寫着SRS,畫着流程圖和數據流圖;對OO的設計思想還未真正接觸,對於UML只知道系統的設計可以通過9種不同的圖來解剖系統,9種圖代表了系統的9種緯度,至於如何用到項目中是完全沒有概念。

後來,隨着Java盛行,OO的思想佔據主導,因此接觸UML更多了。發覺瞭解UML越深入就越被其吸引,UML不僅僅是一些圖,不僅僅是系統的不同剖面,更是一種業務和系統模型的構造過程。並開始在項目中推動使用UML的標準語言,比如用例圖,比如類圖。

直到現在,基於UML2.0的應用設計思想仍然是團隊中需求、設計、開發人員的主要指導思想。雖然UML1.0的9種圖如今擴展到2.0的13種圖,然而思想卻沒有太大變化,在設計中我們依然以用例爲驅動,在設計中注重對象的狀態變化的分析,注重類的分析和對象間的關係行爲分析。

如下圖所示,概括了基於UML2.0的APP設計思想。

Ø  UML的用法

在我所接觸到的項目中,UML是一種設計的指導思想,是一種標準。我經常把UML,CMMI和Prototype合稱爲項目成功的三駕馬車。(現在Agile比較流行,特別是在需求容易變化,項目規模不大的前提下,RUP和Scrum爲代表的敏捷方法是可以取代CMMI的一些做法。)

²  CMMI負責對項目的各個過程域提供最佳實踐方法指導,通過流程、模版和規範來約束和指導操作行爲,以減少項目風險和提升項目質量,同時確保組織級的資產成爲可持續發展的財富。

²  Prototype是對需求過程最好的一種檢驗,我一直認爲需求捕獲和分析的能力是項目是否能夠交付的最大保障。所以,我迷信通過Prototype來與用戶迭代的確認,與開發測試人員按原型來驗收成果。

²  UML不用多說了,是指導需求,設計和開發過程的一種思想。

另一方面,Martin把UML的用法從深淺分作三個層次:

²  草稿:是最常用的一種方法,主要用於溝通系統的某些層面。如果希望使用的更深入一些,可以通過正向工程和反向工程,實現模型和程序框架的互相推導。

²  藍圖:展現完整的系統設計細節,能夠指導開發。與草稿的區別在於,草稿並不是完整,而是注重強調需要交流的重點;而藍圖是完整的,把程序工作變得更簡單。草圖是探索式的,藍圖是系統性的。

²  程序:以MDA(模型驅動開發)爲基礎,能夠自動從PIM轉化爲PSM,再從PSM轉化爲程序代碼的過程。

下面談談從我的理解如何把UML的思想映射到項目的各個過程中,這些圖又如何配合起來使用。

UML2.0包括13種圖,其中類圖,組件圖,合成結構圖,部署圖,對象圖和包圖被歸於爲靜態結構圖;活動圖,用例圖,狀態機圖,時序圖,通訊圖,交互概覽圖和時間軸圖歸屬於動態行爲圖。

在需求分析階段,可以用到的是用例圖,類圖,活動圖和狀態圖。

在設計階段,一般用到類圖,時序圖,包圖,狀態圖和部署圖。

Ø  用例圖(use case)

用例圖,用來描述人機交互,與系統的互動。是定義和描述需求的最好方法,同時一個好的用例設計,一定是將用例映射到系統實現的類,用例說明了類的遷移和操作。

 如下面的用例圖所示,

在用例中描述了這些內容:

²  用例的關聯角色是:Customer;

²  系統邊界是:TeeMall OnlineSystem;

²  基礎用例是:Place Order;

²  Place Order用例包了(Include)了Supply Customer Data ,Order Product, Arrange Payment用例;

²  Request Catalog用例是Place Order用例的擴展(Extend)用例;

²  Arrange Payment用例概括了Pay Cash和Arrange Credit兩個子用例。

 

Ø  狀態機圖(State Machine)

狀態機圖是類的對象生命週期進行建模。狀態機是由狀態和遷移構成,是對象局部化視圖。

通常,使用狀態機圖來反映對象狀態的變化和其生命週期的模型。比如,以一個信用卡自助電影票購買終端的狀態控制機爲例。

在一般情況下,終端爲空閒狀態Idle;

當用戶插入卡後,進入買票流程。

狀態1:驗證。信用卡密碼驗證,如果驗證失敗,則購票過程結束,終端退出用戶的信用卡,狀態變爲空閒。

狀態2:選擇。信用卡密碼驗證成功後,進入選擇狀態。選擇電影場次和座位,並添加到自己的選擇箱中。

狀態3:確認。用戶選擇是否確認選擇的電影票,如果選擇繼續,則返回到狀態2;如果選擇支付,進入狀態4。

狀態4:購買。系統完成支付扣賬和打印出票,購買過程完成。

特殊操作,在上述四個狀態中,都可以進行cancel操作,則進入Idle狀態。

如下圖所示,

 

畫狀態機圖有幾個需要注意的地方:

²  狀態的變遷原因要在圖上說明清楚;

²  最好標明清楚狀態的開始和結束;

²  不要遺漏任何狀態之間的切換。

狀態機是一種深度關注細節的圖,是觀察對象狀態變化的緊縮型視圖。然而,通過狀態機圖很難看到全局,系統的整體行爲一定是通過多個狀態機的結果來決定的,交互視圖則正好起到了這個作用。

 

Ø  活動圖(Activity)

活動圖用來表示用例的執行流程,一般活動圖和狀態機圖結合使用,很多狀態的變遷都是一個活動單元。

很多人將UML的活動圖理解成爲大家經常使用的業務流程圖,特別在活動圖中也可以使用泳道,就認爲這個和Visio流程圖中泳道的意義一樣。其實,UML的活動圖和一般的流程圖最大區別在於,活動圖是以OOAD爲指導的,是以對象爲分析基礎,配合狀態機圖使用,爲的是對用例的執行流程進行描述,而並不是以現實中的業務流程爲視角。

如下圖所示,描述了一個並行的泳道活動圖。以訂單爲核心的對象,並基於訂單的幾種不同狀態進行的流程活動。

角色有:Customer,Sales,Stockroom。

訂單狀態有:Placed,Entered,Filled,Delivered。

訂單活動有:Request Service, Pay, Take Order, Fill Order, Deliver Order, CollectOrder。

 

Ø  序列圖(Sequence Diagram)

序列圖用來表示系統內部一羣對象之間互傳信息的情況,配合用例來使用的話,可以針對每一個用例設計系統內部的一羣對象實現用例的運行情況。

對於程序員的編碼工作來說,類圖和序列圖是最值得參考的兩款圖。

例如下圖所示:

Ø  交互概覽圖(Interaction Overview)

交互概覽圖是活動圖和序列圖的混合使用形式,其主要結構像活動圖,表示流程,但是參與流程的節點不是一般的動作(action),取而代之的是“交互”(interaction)片段。一個交互片段的內容,正是序列圖的一小段交互片段。

對於複雜的對象交互,交互概覽圖可以用來表示交互片段之間的控制流程,其實可以彌補序列圖不易表示控制流程的缺點。不過,換個角度來看,假如序列圖複雜到需要搭配交互概覽圖的話,這張序列圖可能就需要拆解成兩張圖,或者進行重構以降低複雜度。

下圖即是一個交互概覽圖的示例:

Ø  對象圖(Object)和類圖(Class)

如要搞清楚類,先要明白什麼是對象:“帶有良好定義的邊界、封裝了狀態和行爲的具體實體,就是對象。“,也稱作類的實例;類是有相同屬性、操作、方法、關係或行爲的一組對象的描述符。

類和對象之間的關係就是《instantiate》。比如,

上面圖中BankAccount就是一個標準的實體類表示方法,包括了類名,屬性(屬性類型,多重性,初始值),操作(操作名,參數,返回類型),類範圍等。

除了實體類《Entity》外,還有接口類《Boundary》和控制類《Control》。

下圖是一個典型的類圖,描述了衆多類之間的關係。

除此之外,還有多重性,自反關聯等多種用法。

Ø  包圖(Package)

包是模型元素的容器和物主,每個包都具有自身的命名空間,所有名稱必須唯一。

 

       包可以包含用例和類。在設計過程中,一般設計好的包圖,都將和程序源代碼包目錄結構一一對應起來。

如下圖所示,就是一個包的關係圖,反應包之間,包與邊界,包內等關係。

 

下圖是更爲詳細的類包關係圖,反應了包所包含的類,及包之間的依賴關係。

Ø  通訊圖(Communication)

通信圖跟序列圖的功用相似,都是用來表示一羣對象互傳信息的交互情況。只是,通信圖採用網狀圖形,強調對象之間的鏈接。而序列圖採用柵欄狀圖形,強調依次發送信息。

      

Ø  合成結構圖(Composite Structure)

組合結構圖算也是一種類圖,但是它的實用性並不是在一般的業務系統,而是側重於實時系統或嵌入式系統。類圖用來表示系統內部的靜態結構,而且它表示的不是系統某一個時刻的靜態結構,它表示的是系統在任何時刻下都必須遵守的靜態結構。而組合結構圖,它表示某一對象的內部結構,其內部由一組小對象組成。這種圖有兩個特色:其一,它鎖定的範圍是對象內部,而不是一般業務系統的系統內部;其二,它強調對象內部的組成對象,一般在業務系統中對象是平等的。

Ø  部署圖(Deployment)

組件圖和部署圖都是用來表示實際元素的圖,前者表示實際的軟件程序,後者表示實際的硬件設備。實際上,部署圖最常用來表示系統的硬件設備及架構。如下圖所示:

Ø  組件圖(Component)

組件圖表示系統的組成組件(component)、組件所提供的接口(interface)或者是所需要的接口,以及組件之間的依賴關係。組件指一個具體的模塊單元(modular unit),但是必須具備定義明確的接口(well-definedinterface),並且易於替換(replaceable)。如下圖所示:

Ø  時間圖(Timing)

前面提到的狀態圖用來表示對象因爲事件的觸發而轉換狀態,所以它着重於事件與狀態的關係。而時間圖也是在表示狀態變化,但是它着重於狀態與時間的關係,用來表示對象在某一狀態停留了多久的時間後,將轉換到下一個狀態。時間圖很像心電圖,通過高高低低的曲線來強調狀態的變化。如下圖所示:

 

本文參考了:

《UML精粹:UML Distilled Third Edition》

       ByMatin Fowler

 

《The Unified ModelingLanguage Reference Manual》

         By Jacobson,Booch, Rumbaugh

 

《UML 2.0 and UnifiedProcess》

       By Jim Arlow, Ila Neustadt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章