五、UML 的適用場(chǎng)景
UML 既可以描述某個(gè)問(wèn)題領(lǐng)域,也可以表達(dá)構(gòu)思中的軟件設(shè)計(jì),還可以描述已經(jīng)完成的軟件實(shí)現(xiàn)。
它適用于面向?qū)ο蠓治鲈O(shè)計(jì)的整個(gè)過(guò)程。這個(gè)過(guò)程可以分為三個(gè)階段,如下圖。
第一個(gè)階段是通過(guò)建模將現(xiàn)實(shí)世界轉(zhuǎn)為業(yè)務(wù)模型。業(yè)務(wù)模型真實(shí)映射了參與者(業(yè)務(wù)活動(dòng)的驅(qū)動(dòng)者)在現(xiàn)實(shí)世界的行為。
從圖里可以看到,現(xiàn)實(shí)世界映射到業(yè)務(wù)模型后,是使用 參與者 和 用例 這兩個(gè) UML 的核心元素表達(dá)的。參與者作為一個(gè)特定事件的驅(qū)動(dòng)者,用例則描述了這個(gè)驅(qū)動(dòng)者的業(yè)務(wù)目標(biāo)。文章后邊也會(huì)提到這兩個(gè)元素。
第二個(gè)階段是對(duì)業(yè)務(wù)模型概念化,建立適合計(jì)算機(jī)理解和實(shí)現(xiàn)的模型,也就是概念模型,或者叫分析模型。分析模型向上映射了原始需求,向下為計(jì)算機(jī)實(shí)現(xiàn)規(guī)定了一種高層次的抽象,是一種過(guò)渡模型。
現(xiàn)實(shí)世界千差萬(wàn)別的業(yè)務(wù),都用 邊界、控制和實(shí)體這幾個(gè)核心元素來(lái)描述,同時(shí)也引入了 包、組件 這些與現(xiàn)實(shí)世界毫不相干的概念做包裝。
第三個(gè)階段是對(duì)概念模型實(shí)例化,得到相對(duì)詳細(xì)的設(shè)計(jì)模型。
在設(shè)計(jì)模型中,概念模型中的邊界類可以被轉(zhuǎn)化為操作界面或者系統(tǒng)接口;控制類可以被轉(zhuǎn)化為計(jì)算程序或控制程序,例如工作流、算法體等;實(shí)體類可以轉(zhuǎn)化為數(shù)據(jù)庫(kù)表、XML 文檔或者其他帶有持久化特征的類。
同樣的概念模型會(huì)因?yàn)檫x擇不同而得到不同的設(shè)計(jì)模型。比如技術(shù)選型上使用不同的編程語(yǔ)言,不同的中間件就會(huì)得到不同的設(shè)計(jì)。
為什么需要這一道轉(zhuǎn)換呢?
因?yàn)椤斑吔纭薄ⅰ翱刂啤薄ⅰ皩?shí)體”這些對(duì)象化的概念,雖然是計(jì)算機(jī)可以理解的,但它并不是真正的對(duì)象實(shí)例,也就是說(shuō)它們并不是可執(zhí)行代碼,概念模型只是紙上談兵。真正的對(duì)象世界行為是由 Java 類、C++ 類、JSP 等這些可執(zhí)行代碼構(gòu)成的。
換句話說(shuō),設(shè)計(jì)模型是概念模型在特定環(huán)境和條件下的實(shí)例化,實(shí)例化后的對(duì)象行為執(zhí)行了概念模型描述的那些信息。
以下是面向?qū)ο蠓治鲈O(shè)計(jì)的完整過(guò)程,它表達(dá)了現(xiàn)實(shí)世界是怎么通過(guò) UML 映射到對(duì)象世界的。
六、UML 的組成結(jié)構(gòu)
前面花了比較大的篇幅分析了 UML 的定位和適用場(chǎng)景,目的是幫助讀者建立對(duì) UML 整體系統(tǒng)性的認(rèn)知,而不是過(guò)早的陷入 UML 的使用細(xì)節(jié)里。我們要應(yīng)用一項(xiàng)技術(shù)或工具,不能單純的因?yàn)樗目犰呕蛘哒f(shuō)業(yè)界都在用所以我們要用,而應(yīng)該結(jié)合自己的使用場(chǎng)景以及技術(shù)或工具的特點(diǎn),來(lái)確認(rèn)這項(xiàng)技術(shù)或工具究竟是不是我們需要的。
在讀者了解 UML 在面向?qū)ο蠓治鲈O(shè)計(jì)領(lǐng)域優(yōu)秀的特性之后,我們?cè)賮?lái)看看 UML 的一些細(xì)節(jié)。
凡是語(yǔ)言,都會(huì)存在基本詞匯和語(yǔ)法。
那么對(duì)應(yīng)到 UML 里,基本詞匯就是核心元素,語(yǔ)法就是核心視圖。
UML 的組成結(jié)構(gòu)如下圖:
6.1 核心元素
我們先介紹核心元素,下圖是大綱。
6.1.1 版型
版型:也稱「類型」或「構(gòu)造型」。是對(duì) UML 元素基礎(chǔ)定義的擴(kuò)展,在元素基礎(chǔ)定義的基礎(chǔ)上賦予特別的含義,使得這個(gè)元素適用于特定的場(chǎng)合。
比如,我們前邊提到的「邊界類」、「實(shí)體類」、「控制類」都是類的版型。
6.1.2 參與者
參與者定位:事件的第一驅(qū)動(dòng)者,也是系統(tǒng)的服務(wù)方。比如你在電商網(wǎng)站購(gòu)物,你就是參與者。
6.1.3 用例
用例定位:系統(tǒng)執(zhí)行的一系列操作,并生成參與者可以觀察的值。比如你在電商網(wǎng)站交易,會(huì)生成在線訂單,用戶下單就是一個(gè)用例。
用例版型:
- 業(yè)務(wù)用例:用于需求階段業(yè)務(wù)領(lǐng)域建模。與計(jì)算機(jī)系統(tǒng)建模無(wú)關(guān),比如下單可以不依賴在線服務(wù),而只是線下簽署協(xié)議。業(yè)務(wù)建模的目標(biāo)是讓需求人員和客戶能夠達(dá)成共識(shí)。
- 業(yè)務(wù)用例實(shí)現(xiàn):業(yè)務(wù)用例的一種實(shí)現(xiàn)方式,一個(gè)業(yè)務(wù)用例可以有多種實(shí)現(xiàn)方式。比如下單后的支付,可以用現(xiàn)金,也可以銀行卡轉(zhuǎn)賬,還可以第三方支付。
- 概念用例:用于獲取業(yè)務(wù)模型中的關(guān)鍵概念,分析出核心業(yè)務(wù)結(jié)構(gòu)。業(yè)務(wù)架構(gòu)就是概念建模階段產(chǎn)生,同時(shí)為系統(tǒng)建模階段提供重要指導(dǎo)。比如用戶下單這個(gè)用例,可以從實(shí)現(xiàn)過(guò)程中獲得一些核心業(yè)務(wù),并把它們展現(xiàn)出來(lái)。
- 系統(tǒng)用例:用于定義系統(tǒng)范圍、獲取功能性需求。也就是我們常掛在嘴邊的用例。像業(yè)務(wù)用例中提到的線下簽約的方式,就不會(huì)納入到系統(tǒng)用例中,但如果是電子簽約的話,就可以成為系統(tǒng)用例了。
- 系統(tǒng)用例實(shí)現(xiàn):系統(tǒng)用例的一種實(shí)現(xiàn)方式,一個(gè)系統(tǒng)用例可以有多種實(shí)現(xiàn)方式。比如下單后的支付,可以接入微信支付接口,也可以接入支付寶支付接口。
你會(huì)發(fā)現(xiàn),同是用例的版型,業(yè)務(wù)用例與系統(tǒng)用例的區(qū)別就在于業(yè)務(wù)用例是客戶業(yè)務(wù)視角,系統(tǒng)用例是系統(tǒng)視角。
6.1.4 邊界
邊界定位:用于業(yè)務(wù)建模和系統(tǒng)建模階段的分析,保證分析粒度在一定的范圍內(nèi),不會(huì)擴(kuò)散。
比如一個(gè)電商網(wǎng)站按領(lǐng)域職責(zé)作為邊界,會(huì)有店鋪域、商品域、會(huì)員域、交易域、支付域和營(yíng)銷(xiāo)域等。各域只負(fù)責(zé)域內(nèi)的事情,就能夠減少混亂緊耦合的局面。
一個(gè)好的分析和設(shè)計(jì)如同一筐帶殼的雞蛋,清清爽爽;一個(gè)差的設(shè)計(jì)如同一堆打碎了殼的雞蛋,粘粘糊糊。殼,是好壞的關(guān)鍵。
6.1.5 業(yè)務(wù)實(shí)體
業(yè)務(wù)實(shí)體定位:它代表參與者執(zhí)行業(yè)務(wù)用例時(shí)所處理或使用的事物,特別用于在業(yè)務(wù)建模階段建立領(lǐng)域模型。業(yè)務(wù)實(shí)體是類(class)的一種版型。
業(yè)務(wù)實(shí)體的結(jié)構(gòu):包含屬性和方法。屬性用來(lái)保存業(yè)務(wù)實(shí)體特征,方法用來(lái)訪問(wèn)業(yè)務(wù)實(shí)體。比如一臺(tái)電視,把它看成一個(gè)業(yè)務(wù)實(shí)體的話,它的屬性有運(yùn)行狀態(tài)和音量,它的方法就是遙控器,我們可以開(kāi)、關(guān)、調(diào)聲音,但是我們不可以試圖讓它飛起來(lái)——因?yàn)樗鼪](méi)有這樣的方法。
6.1.6 包
包定位:容納并為其他 UML 元素分類。比如 Java 后端經(jīng)常會(huì)提供 jar 包給接入方使用。
6.1.7 分析類
分析類定位:用于代表系統(tǒng)中主要的職責(zé)簇,由此產(chǎn)生系統(tǒng)的設(shè)計(jì)類和子系統(tǒng)。
- 邊界類:用于對(duì)系統(tǒng)外部環(huán)境和內(nèi)部運(yùn)作之間的交互進(jìn)行建模。比如現(xiàn)實(shí)世界的窗戶,計(jì)算機(jī)世界的網(wǎng)頁(yè)。
- 控制類:用于對(duì)用例特有的控制行為進(jìn)行建模。比如顯示邏輯和業(yè)務(wù)邏輯通過(guò)控制層分離的 MVC 架構(gòu)。
- 實(shí)體類:用于對(duì)需要存儲(chǔ)的信息和相關(guān)行為進(jìn)行建模。源于業(yè)務(wù)模型中的業(yè)務(wù)實(shí)體。
分析類的抽象層次較高,比設(shè)計(jì)和實(shí)現(xiàn)要穩(wěn)定很多,因此方便維護(hù),也更容易獲得一個(gè)穩(wěn)定架構(gòu)來(lái)指導(dǎo)整個(gè)軟件的開(kāi)發(fā)。
6.1.8 設(shè)計(jì)類
設(shè)計(jì)類定位:是系統(tǒng)實(shí)施中一個(gè)或多個(gè)對(duì)象的抽象,由此映射到實(shí)現(xiàn)代碼,依賴于實(shí)施語(yǔ)言。
設(shè)計(jì)類結(jié)構(gòu):
- 類型:對(duì)對(duì)象某一方面特征的歸納和抽象。映射到編碼中的 class。
- 屬性:對(duì)象特征。映射到編碼中的 field。
- 方法:訪問(wèn)對(duì)象屬性的唯一途徑。映射到編碼中的 method。
6.1.9 關(guān)系
關(guān)系定位:抽象出對(duì)象之間的聯(lián)系,讓對(duì)象構(gòu)成某個(gè)特定的結(jié)構(gòu)。
關(guān)系分為以下幾種:
- 關(guān)聯(lián)(association)
- 關(guān)系:是一種擁有的關(guān)系,即一個(gè)類知道另一個(gè)類的屬性和方法;比如老師與學(xué)生可以是雙向的,也可以是單向的。雙向的關(guān)聯(lián)可以有兩個(gè)箭頭或者沒(méi)有箭頭,單向的關(guān)聯(lián)有一個(gè)箭頭。
- 箭頭和連線:帶普通箭頭的實(shí)心線,指向被擁有者。
- 適用場(chǎng)景:類圖。
- 依賴(dependency)
- 關(guān)系:是一種使用的關(guān)系,即一個(gè)類的實(shí)現(xiàn)需要另一個(gè)類的協(xié)助,是一種弱關(guān)系,隨運(yùn)行場(chǎng)景變化。比如削蘋(píng)果時(shí),人依賴于刀,脫離了這個(gè)場(chǎng)景,依賴關(guān)系就不存在了。
- 箭頭和連線:帶箭頭的虛線,指向被使用者。
- 適用場(chǎng)景:類圖。
- 泛化(generalization)
- 關(guān)系:是一種繼承的關(guān)系,比如貓是動(dòng)物的一種。
- 箭頭和連線:帶三角的實(shí)線,箭頭指向父類。
- 適用場(chǎng)景:類圖。
- 實(shí)現(xiàn)(realization)
- 關(guān)系:是一種實(shí)現(xiàn)的關(guān)系,比如用例和用例實(shí)現(xiàn)的關(guān)系,接口與實(shí)現(xiàn)類的關(guān)系。
- 箭頭和連線:帶三角的虛線,箭頭指向用例實(shí)現(xiàn)或接口類。
- 適用場(chǎng)景:用例圖,類圖。
- 聚合(aggregation)
- 關(guān)系:是整體與部分的關(guān)系,且部分可以離開(kāi)整體而單獨(dú)存在。生命周期各自獨(dú)立。如車(chē)和輪胎是聚合關(guān)系,輪胎離開(kāi)車(chē)仍然可以存在。
- 箭頭和連線:帶空心菱形的實(shí)線,菱形指向整體。
- 適用場(chǎng)景:類圖。
- 組合(composition)
- 關(guān)系:是整體與部分的關(guān)系,但部分不能離開(kāi)整體而單獨(dú)存在。同生同滅。如公司和部門(mén)是組合關(guān)系,沒(méi)有公司就不存在部門(mén)。
- 箭頭和連線:帶實(shí)心(黑色實(shí)心:要死一起死,良心是黑的)菱形的實(shí)線,菱形指向整體。
- 適用場(chǎng)景:類圖。
關(guān)聯(lián)關(guān)系和依賴關(guān)系的區(qū)別:
- 關(guān)聯(lián)關(guān)系是靜態(tài)天然的聯(lián)系,依賴關(guān)系是動(dòng)態(tài)臨時(shí)的聯(lián)系。
此外還有只用于用例中的關(guān)系:
- 擴(kuò)展(extends)
- 關(guān)系:用于在用例模型中說(shuō)明向基本用例中的某個(gè)擴(kuò)展點(diǎn)插入擴(kuò)展用例。
- 箭頭和連線:帶箭頭的虛線加版型
<
。> - 特點(diǎn):用例可選。
- 包含(include)
- 關(guān)系:用于在用例模型中說(shuō)明在執(zhí)行基本用例的用例實(shí)例過(guò)程中插入的行為段。
- 箭頭和連線:帶箭頭的虛線加版型
<
。> - 特點(diǎn):用例必需。
6.1.10 組件
組件定位:實(shí)現(xiàn)特定功能的邏輯代碼模塊。比如分布式應(yīng)用架構(gòu)下,將業(yè)務(wù)目標(biāo)拆成多個(gè)功能,每個(gè)功能作為組件獨(dú)立部署。這樣這些組件也能被其他場(chǎng)景復(fù)用。
6.1.11 節(jié)點(diǎn)
節(jié)點(diǎn)定位:表示應(yīng)用程序的部署單元。比如分布式應(yīng)用的環(huán)境中,服務(wù)器或設(shè)備會(huì)有很多,就需要通過(guò)節(jié)點(diǎn)來(lái)體現(xiàn)物理部署的情況。
-
UML
+關(guān)注
關(guān)注
0文章
122瀏覽量
30873 -
面向?qū)ο?/span>
+關(guān)注
關(guān)注
0文章
64瀏覽量
9994 -
編程設(shè)計(jì)
+關(guān)注
關(guān)注
0文章
9瀏覽量
6463
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論