這七種UML圖的畫法,每個(gè)程序員都應(yīng)該掌握!
眾所周知,軟件開發(fā)是一個(gè)分階段進(jìn)行的過程。不同的開發(fā)階段需要使用不同的模型圖來描述業(yè)務(wù)場景和設(shè)計(jì)思路,在不同的階段輸出不同的設(shè)計(jì)文檔也是必不可少的,例如,在需求分析階段需要輸出領(lǐng)域模型和業(yè)務(wù)模型,在架構(gòu)階段需要輸出物理架構(gòu)設(shè)計(jì),在詳細(xì)設(shè)計(jì)階段需要輸出數(shù)據(jù)庫設(shè)計(jì)等。這樣做可以更好地實(shí)踐軟件開發(fā),并提高軟件開發(fā)的實(shí)用性。
軟件建模與設(shè)計(jì)過程可以分為三個(gè)階段:需求分析、架構(gòu)設(shè)計(jì)和詳細(xì)設(shè)計(jì)。在這三個(gè)階段中,大量使用符合 UML 規(guī)范的模型圖,其中常用的有 7 種,包括類圖、序列圖、組件圖、部署圖、用例圖、狀態(tài)圖和活動(dòng)圖。
在需求分析階段,使用用例圖和領(lǐng)域模型圖描述用戶需求和業(yè)務(wù)場景。在架構(gòu)設(shè)計(jì)階段,使用組件圖和部署圖描述軟件系統(tǒng)的組成部分和部署情況。在詳細(xì)設(shè)計(jì)階段,使用類圖、序列圖和狀態(tài)圖描述軟件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)。
下面我們將探討如何繪制這 7 種模型圖,以及如何在不同階段使用這些模型來生成相應(yīng)的設(shè)計(jì)文檔。
類圖
類圖是軟件設(shè)計(jì)中使用最廣泛的 UML 圖形之一,用來描述類的特性以及類之間的靜態(tài)關(guān)系。在一個(gè)類圖中,每個(gè)類都由三個(gè)部分組成:類名、屬性列表和方法列表。
除了描述類的基本特征,類圖還用來表示類之間的關(guān)系,其中包括六種靜態(tài)關(guān)系:
- 關(guān)聯(lián)(Association):表示一個(gè)類對象與另一個(gè)類對象之間的關(guān)系,比如訂單與客戶之間的關(guān)系。
- 依賴(Dependency):表示一個(gè)類對另一個(gè)類的使用或調(diào)用,比如客戶下訂單時(shí)需要使用訂單類。
- 組合(Composition):表示一種包含關(guān)系,表示一個(gè)類對象包含另一個(gè)類對象,比如一個(gè)訂單包含多個(gè)商品。
- 聚合(Aggregation):也表示一種包含關(guān)系,但是聚合關(guān)系中包含的類對象可以被多個(gè)類共享,比如一個(gè)學(xué)校包含多個(gè)班級。
- 繼承(Inheritance):表示一個(gè)類繼承自另一個(gè)類,可以從父類中繼承屬性和方法,并且可以添加新的屬性和方法。
- 泛化(Generalization):與繼承關(guān)系相似,但泛化關(guān)系可以用來表示更抽象的關(guān)系,比如多個(gè)類都實(shí)現(xiàn)了一個(gè)接口。
通過繪制類圖,我們可以清晰地描述一個(gè)軟件系統(tǒng)中的類及其之間的關(guān)系,幫助開發(fā)人員更好地理解軟件系統(tǒng)的結(jié)構(gòu)和功能。
在UML工具中把相關(guān)的一組類及其關(guān)系用一張圖畫出來,就是類圖。
圖片
如上圖所示,描述的就是一個(gè)典型的責(zé)任鏈模式的實(shí)現(xiàn)類圖。
類圖主要是在 詳細(xì)設(shè)計(jì) 階段畫,一旦類圖設(shè)計(jì)完成,開發(fā)工程師可以根據(jù)類圖來實(shí)現(xiàn)代碼。只要類方法的邏輯不是太復(fù)雜,不同工程師實(shí)現(xiàn)的代碼幾乎是一樣的,這有利于保證軟件的規(guī)范和統(tǒng)一性。在實(shí)際應(yīng)用中,通常不需要畫出所有類的類圖,只需要畫出核心、代表性、技術(shù)難度較高的類圖即可。
圖片
除了在詳細(xì)設(shè)計(jì)階段繪制類圖外,還可以在需求分析階段使用類圖來表示關(guān)鍵領(lǐng)域模型對象。在這個(gè)階段中,我們不要將注意力集中在屬性或行為上,而應(yīng)該專注于識別領(lǐng)域?qū)ο蠹捌渲g的關(guān)系。因此,可以使用簡化的類圖來描述,只需要繪制類的名稱和它們之間的關(guān)系即可。
如上所示描述的是在需求分析階段挖掘出SIM卡、運(yùn)營商、手機(jī)、手機(jī)廠商等模型對象之間的關(guān)系。
序列圖
類圖之外,另一種常用的圖形是序列圖。
類圖描述類之間的靜態(tài)關(guān)系,而序列圖用于描述參與者之間的動(dòng)態(tài)調(diào)用關(guān)系。每個(gè)參與者都有一條垂直向下的生命線,該生命線用虛線表示。參與者之間的消息按照從上到下的順序表示它們的調(diào)用順序關(guān)系,這就是序列圖這個(gè)詞的來源。每個(gè)生命線都有一個(gè)激活條,它是圖中的細(xì)長矩形條,只有在參與者活動(dòng)時(shí)才是激活的。
圖片
通常使用序列圖表示對象之間的交互,這些對象可以是類對象,也可以是更大的參與者,如組件、服務(wù)器、子系統(tǒng)等??傊灰婕暗讲煌瑓⑴c者之間的交互,都可以使用序列圖,比如下面這張圖就是業(yè)務(wù)分析階段,系統(tǒng)建設(shè)后完成后的業(yè)務(wù)流程。
圖片
記住,在軟件設(shè)計(jì)的不同階段都可以使用序列圖。
組件圖
組件是比類更大粒度的設(shè)計(jì)元素,通常一個(gè)組件中包含多個(gè)類。組件圖有時(shí)與包圖的用途相似,通常用于描述物理組件,如JAR、DLL等。在實(shí)踐中,我們更多地使用組件圖進(jìn)行模塊設(shè)計(jì)。
圖片
組件圖描述組件之間的靜態(tài)關(guān)系,主要是依賴關(guān)系。如果想要描述組件之間的動(dòng)態(tài)調(diào)用關(guān)系,可以使用組件序列圖,以組件作為參與者,描述組件之間的消息調(diào)用關(guān)系。
由于組件的粒度較大,通常用于描述和設(shè)計(jì)軟件的模塊及其之間的關(guān)系。因此,在設(shè)計(jì)的早期階段就需要畫出組件圖,一般用于架構(gòu)設(shè)計(jì)階段。
部署圖
部署圖描述的是軟件系統(tǒng)最終的物理部署情況,包括需要部署的服務(wù)器數(shù)量、關(guān)鍵組件的部署位置等。它是軟件系統(tǒng)最終呈現(xiàn)的物理藍(lán)圖,能夠讓客戶、老板和工程師清晰地了解系統(tǒng)的最終運(yùn)行狀態(tài),以及與現(xiàn)有系統(tǒng)和第三方服務(wù)器的關(guān)系。通過部署圖,可以預(yù)估服務(wù)器和第三方軟件的采購成本。
因此,部署圖是整個(gè)軟件設(shè)計(jì)模型中相當(dāng)宏觀的一種圖,需要在設(shè)計(jì)早期就繪制。各方可以根據(jù)部署圖討論是否認(rèn)可該方案,只有對部署圖達(dá)成共識,才能繼續(xù)后面的細(xì)節(jié)設(shè)計(jì)。部署圖主要用于架構(gòu)設(shè)計(jì)階段,并且與組件圖要彼此呼應(yīng)。
圖片
用例圖
用例圖分為業(yè)務(wù)用例和系統(tǒng)用例,業(yè)務(wù)用例圖主要體現(xiàn)在 業(yè)務(wù)分析階段, 描述一個(gè)承建系統(tǒng)的組織對外提供的能力,系統(tǒng)用例體現(xiàn)在需求分析階段描述系統(tǒng)對外提供的能力。
圖片
這張圖中,左邊是業(yè)務(wù)用例圖,右邊是系統(tǒng)用例圖。雖然它們的畫法相似,但它們本質(zhì)上有很大的區(qū)別,具體可以查看我之前寫的這篇文章。
圖中的人形元素稱為角色,角色可以是人也可以是其他系統(tǒng)。由于系統(tǒng)的功能可能很復(fù)雜,用例圖可能僅包含其中的一小部分功能,這些功能被畫在一個(gè)矩形框內(nèi),這個(gè)矩形框是用例邊界。矩形框里面的橢圓表示單個(gè)功能,它們可以相互依賴或需要擴(kuò)展。因?yàn)橛美龍D中的功能描述相對簡單,所以通常需要配以文字說明以形成需求文檔。
狀態(tài)圖
狀態(tài)圖用來展現(xiàn)單個(gè)對象生命周期中的狀態(tài)變遷。
在業(yè)務(wù)系統(tǒng)中,許多重要的領(lǐng)域?qū)ο蠖加邢喈?dāng)復(fù)雜的狀態(tài)變化,比如訂單,它們可以有待付款、待審核、待發(fā)貨、待收貨、交易關(guān)閉和交易完成等各種狀態(tài)。
這些狀態(tài)變化可以在用例圖中用文本形式描述,并隨著各個(gè)用戶的不同操作而改變。但是,使用這種方法描述狀態(tài)時(shí),狀態(tài)會(huì)分散到不同的地方,這樣可能會(huì)導(dǎo)致開發(fā)錯(cuò)誤以及產(chǎn)品經(jīng)理在設(shè)計(jì)時(shí)的困惑。
采用UML狀態(tài)圖可以有效地解決這些問題,因?yàn)樗梢栽谝粡垐D表中展示對象的整個(gè)生命周期以及各個(gè)狀態(tài)和變遷之間的關(guān)系。比如下面的圖表展示了一個(gè)訂單從創(chuàng)建到交易完成的狀態(tài)變化。
圖片
狀態(tài)圖要在需求分析階段畫,描述狀態(tài)變遷的邏輯關(guān)系,在詳細(xì)設(shè)計(jì)階段也要畫,這個(gè)時(shí)候,狀態(tài)要用枚舉值表示,以指導(dǎo)具體的開發(fā)。
活動(dòng)圖
活動(dòng)圖常用于描述系統(tǒng)或業(yè)務(wù)流程中的動(dòng)態(tài)行為。它可以清晰地展現(xiàn)從一個(gè)活動(dòng)到另一個(gè)活動(dòng)的控制流,描繪出系統(tǒng)或業(yè)務(wù)流程的邏輯和流程,讓開發(fā)人員更好地了解整個(gè)系統(tǒng)的運(yùn)作方式。
在活動(dòng)圖中,實(shí)心圓表示流程的開始,空心圓表示流程的結(jié)束,圓角矩形表示活動(dòng),菱形表示分支判斷。這些符號的使用能夠使活動(dòng)圖更加規(guī)范化和可讀性,有助于提高系統(tǒng)開發(fā)的效率和質(zhì)量。
圖片
此外,活動(dòng)圖引入了一個(gè)重要的概念——泳道?;顒?dòng)圖可以根據(jù)活動(dòng)的范圍,將活動(dòng)根據(jù)領(lǐng)域、系統(tǒng)和角色等劃分到不同的泳道中,使流程邊界更加清晰。
流程圖也比較有普適性,可以在需求分析階段描述業(yè)務(wù)流程,也可以在架構(gòu)設(shè)計(jì)階段描述子系統(tǒng)和組件的交互,還可以在詳細(xì)設(shè)計(jì)階段描述一個(gè)類方法內(nèi)部的計(jì)算流程。
使用合適的 UML 模型構(gòu)建一個(gè)設(shè)計(jì)文檔
UML 模型圖本身并不難掌握,但如何在正確的場合下用適當(dāng)?shù)?UML 模型表達(dá)設(shè)計(jì)意圖,形成一套清晰且詳細(xì)的軟件模型,并在團(tuán)隊(duì)內(nèi)外達(dá)成共識的設(shè)計(jì)文檔則需要注意。
根據(jù)軟件設(shè)計(jì)不同階段的需要,我們可以使用不同的模型圖進(jìn)行建模。
在需求分析階段,我們可以使用用例圖、活動(dòng)圖、時(shí)序圖和簡化的類圖進(jìn)行領(lǐng)域模型抽象和關(guān)系描述。
在架構(gòu)設(shè)計(jì)階段,通過組件圖、組件時(shí)序圖和部署圖描述系統(tǒng)物理藍(lán)圖和模塊關(guān)系。
在詳細(xì)設(shè)計(jì)階段,主要側(cè)重于類圖和類的時(shí)序圖,而對于復(fù)雜的方法邏輯,可以使用方法的活動(dòng)圖進(jìn)行描述。
小結(jié)
掌握類圖、時(shí)序圖、組件圖、部署圖、用例圖、狀態(tài)圖、活動(dòng)圖這七種UML模型圖,根據(jù)實(shí)際場景,在需求分析、架構(gòu)設(shè)計(jì)和詳細(xì)設(shè)計(jì)階段選擇并巧妙應(yīng)用對應(yīng)的模型圖,有助于有效地進(jìn)行軟件建模和系統(tǒng)設(shè)計(jì),成為一個(gè)掌控大局、指導(dǎo)技術(shù)團(tuán)隊(duì)的優(yōu)秀架構(gòu)師。
要注意模型圖的規(guī)范和注釋,遵循命名規(guī)范,對模型元素進(jìn)行命名,注釋模型元素的關(guān)系和屬性等,簡潔明了。此外,UML模型圖只是設(shè)計(jì)文檔的一部分,需要與其他文檔相結(jié)合,如需求文檔、設(shè)計(jì)文檔、測試文檔等,形成一個(gè)完整的設(shè)計(jì)文檔,指導(dǎo)軟件開發(fā)。
對于畫UML的工具,有收費(fèi)的專業(yè)軟件設(shè)計(jì)工具像EA(Enterprise Architect) 、Astah和億圖,以及免費(fèi)的在線工具比如draw.io,processon等,建議可以根據(jù)自身需要選擇合適的工具,同時(shí)也建議從簡單易用的工具入手。

























