最近都在學(xué)習(xí)軟件設(shè)計(jì)方面的實(shí)踐,就打算好好學(xué)習(xí)uml方面相關(guān)的知識(shí)细疚,就重新整理下uml一些核心元素的概念的。
版型
版型剖毯,在大象UML學(xué)習(xí)一書中提到了這個(gè)詞。這個(gè)詞是對(duì)一個(gè)UML元素基礎(chǔ)定義的拓展教馆,舉個(gè)例子逊谋,比如在java當(dāng)中,我們把接口土铺、邊界類胶滋、實(shí)體類、抽象類等都是類的版型悲敷。這就是版型究恤。uml中幾乎每一個(gè)元模型都有很多版型,例如用例有"業(yè)務(wù)用例"后德、"業(yè)務(wù)用例實(shí)現(xiàn)"等版型部宿。
版型只是UML的一種拓展手段,本身不會(huì)涉及思想和方法探遵,而是我們?cè)诮5牟煌A段窟赏,為了區(qū)分視圖的不同觀點(diǎn)妓柜,會(huì)采用不同的圖來表示箱季,例如:"業(yè)務(wù)用例"、"業(yè)務(wù)用例實(shí)現(xiàn)"就是專門應(yīng)用在業(yè)務(wù)建模場(chǎng)合的棍掐,重要的不是業(yè)務(wù)用例的版型長(zhǎng)什么樣藏雏,而是理解當(dāng)用例用于獲取捕獲需求時(shí),用例會(huì)有一些特別的意義作煌。
參與者
參與者在建模過程中處于核心地位的掘殴,是在系統(tǒng)之外與系統(tǒng)交互的某人或者某物。
如何確定一個(gè)系統(tǒng)的參與者
舉個(gè)場(chǎng)景: 小王到銀行去開戶粟誓,向大廳經(jīng)理詢問了辦理手續(xù)奏寨,填寫了表單,交給柜臺(tái)職員鹰服,拿到了銀行存折病瞳,在這個(gè)場(chǎng)景中,誰是參與者?
確定參與者需要先確定系統(tǒng)的邊界悲酷,確定了邊界套菜,就可以接著去確定誰是參與者。怎么確定邊界呢设易?可以參考下面兩個(gè)問題逗柴。
- 確定誰對(duì)系統(tǒng)有明確的要求和目標(biāo)并且主動(dòng)發(fā)出動(dòng)作?
- 該系統(tǒng)是為誰服務(wù)的顿肺?
看上面的例子戏溺,我們看第一個(gè)問題渣蜗,首先,小王有著明確的目標(biāo):開戶于购,并且主動(dòng)發(fā)出開戶動(dòng)作袍睡。2. 系統(tǒng)運(yùn)作的結(jié)果是給小王提供開戶的服務(wù)。所在可以確定小王是參與者肋僧,而大廳經(jīng)理和職員都不滿足條件斑胜,在小王沒有主動(dòng)發(fā)出申請(qǐng),他們不會(huì)動(dòng)作嫌吠,所以我們可以確定小王是參與者止潘,然后明確了系統(tǒng)的邊界了,大廳經(jīng)理和職員都是邊界以內(nèi)的辫诅。
參與者是可以是非人的凭戴,比如計(jì)算機(jī)系統(tǒng),一個(gè)計(jì)時(shí)器炕矮,一個(gè)傳感器或JMS信息么夫。
參與者的版型
- 業(yè)務(wù)主角: 特別用于定義業(yè)務(wù)的參與者
- 業(yè)務(wù)工人:被動(dòng)的參與了業(yè)務(wù)的參與者。
- 涉眾: 涉眾是與要建設(shè)這個(gè)系統(tǒng)有利益相關(guān)的一切人和事肤视。比如投資方等等
4.用戶: 用戶是指系統(tǒng)的使用者档痪,用戶是參與者的代表或者說是參與者的實(shí)例或代理,并非所有的參與者都是用戶邢滑,但是一個(gè)用戶可以代理多個(gè)參與者腐螟。
5.角色: 角色是參與者的職責(zé)。
概括: 參與者是涉眾的代表困后,它代表涉眾對(duì)系統(tǒng)利益的要求乐纸,并向系統(tǒng)題出建設(shè)要求,參與者通過代理給其他用戶或者將自身實(shí)例化成用戶來使用系統(tǒng)摇予,參與者的職責(zé)可以用角色來歸納汽绢,用戶唄指定扮演哪個(gè)角色或者哪些角色因此來獲得參與者的職責(zé)。
用例
用例定義了一組用例實(shí)例侧戴,其中每個(gè)實(shí)例都是系統(tǒng)所執(zhí)行的一系列操作宁昭,這些操作生成特定的主角可以觀測(cè)的值。
通俗來講就是救鲤,一個(gè)用例就是與參與者交互的久窟,并且給參與者提供可以觀測(cè)的有意義的一系列活動(dòng)的集合。所謂用例就是要完成一件事本缠,需要做一系列的活動(dòng)斥扛,而做這件事,可以有很多不同的辦法和步驟,也可能會(huì)遇到各種各樣意外的情況稀颁,因此這件事由許多不同的情況的集合構(gòu)成芬失,在UML稱為用例場(chǎng)景,一個(gè)場(chǎng)景就是一個(gè)用例的實(shí)例匾灶。
一個(gè)完整的用例定義由參與者棱烂、前置條件、場(chǎng)景阶女、后置條件構(gòu)成
用例的特征
- 相對(duì)獨(dú)立颊糜,不需要與其他用例交互來完成參與者的目的。
- 用戶的執(zhí)行結(jié)果對(duì)參與者來說是可以觀測(cè)和有意義的秃踩。
3.用例必須由一個(gè)參與者發(fā)起衬鱼。 - 重點(diǎn): 一個(gè)用例就是一個(gè)需求單元、分析單元憔杨、設(shè)計(jì)單元鸟赫、開發(fā)單元、測(cè)試單元甚至部署單元消别。
用例的粒度
粒度的概念相信不用再解釋了抛蚤,一個(gè)用例的粒度大小如何確定才是實(shí)踐中比較重要的,可以分享的經(jīng)驗(yàn)是寻狂,在項(xiàng)目過程中根據(jù)階段的不同岁经,可以使用不用的粒度。
在業(yè)務(wù)建模階段荆虱,用例的粒度以每個(gè)用例能夠說明一件完整的事情為宜蒿偎,既一個(gè)用例可以描述一些完整的業(yè)務(wù)流程朽们。
在業(yè)務(wù)分析階段怀读,即概念建模階段,用例的粒度以每個(gè)用例能描述一個(gè)完整的事件流為宜骑脱〔思希可以理解為一個(gè)用例面熟一項(xiàng)完整的業(yè)務(wù)中的一個(gè)步驟。
在系統(tǒng)建模階段叁丧,用例視角是針對(duì)計(jì)算機(jī)的啤誊,因此用例的粒度以一個(gè)用例能夠描述操作者與計(jì)算機(jī)的一次完整交互為宜,例如填寫申請(qǐng)單拥娄、審核申請(qǐng)單蚊锹、派發(fā)任務(wù)等等。
粒度的選擇主要還是因?yàn)檫吔缯J(rèn)定不同而產(chǎn)生的稚瘾,如果對(duì)選擇粒度感到問難牡昆,可以看自己是否選擇了一個(gè)正確的邊界,或者越過了這個(gè)邊界摊欠。
例子:用例的版型
1.業(yè)務(wù)用例
專門用于需求階段的業(yè)務(wù)建模丢烘,在為業(yè)務(wù)領(lǐng)域建模時(shí)應(yīng)當(dāng)使用這種版型柱宦。業(yè)務(wù)用例專門用于業(yè)務(wù)建模,在需求階段的業(yè)務(wù)建模播瞳,就是沒有計(jì)算機(jī)參與的掸刊,目前客觀存在的業(yè)務(wù)領(lǐng)域。它的參與者是業(yè)務(wù)主角赢乓。范圍是業(yè)務(wù)范圍忧侧,而不是系統(tǒng)范圍,所以不需要計(jì)算機(jī)參與牌芋。
2.概念用例
概念用例用于概念建模苍柏,一般很少使用。
3.系統(tǒng)用例
系統(tǒng)用例沒有定義姜贡,就是我們正常所說的用例试吁。系統(tǒng)用例就是用來定義系統(tǒng)范圍、獲取功能性需求的楼咳,因此系統(tǒng)用例的含義就是熄捍,系統(tǒng)用例是軟件系統(tǒng)開發(fā)的全部范圍。
4.邊界
邊界本質(zhì)上是面向?qū)ο蠓椒ǖ囊粋€(gè)很重要的概念母怜,與封裝的概念師出同源余耽,面向?qū)ο罄铮魏螌?duì)象都有邊界苹熏,外界只能通過邊界來認(rèn)識(shí)對(duì)象碟贾。對(duì)有形的邊界,比如電視劇轨域,邊界就是屏幕面板袱耽,但對(duì)于無形的,比如系統(tǒng)邊界干发,倒不如說是需求的集合邊界朱巨,確定好需求,才能確定邊界枉长。
5.業(yè)務(wù)實(shí)體
業(yè)務(wù)實(shí)體就是代表業(yè)務(wù)角色執(zhí)行業(yè)務(wù)用例時(shí)所處理的或者使用的“事冀续、物”,一個(gè)業(yè)務(wù)實(shí)體經(jīng)常代表某個(gè)或者許多業(yè)務(wù)用例實(shí)例有價(jià)值的事物。
業(yè)務(wù)實(shí)體一般來自現(xiàn)實(shí)世界必峰,我們?cè)诮r(shí)洪唐,一定能找到與它對(duì)應(yīng)的事物。舉個(gè)例子: 飯店的業(yè)務(wù)實(shí)體有菜單和飲料飯菜等吼蚁,在機(jī)場(chǎng)凭需,機(jī)票和登機(jī)牌就是業(yè)務(wù)實(shí)體,業(yè)務(wù)實(shí)體一定是在分析業(yè)務(wù)流程中發(fā)現(xiàn)的,而業(yè)務(wù)流程實(shí)際上就是業(yè)務(wù)用例場(chǎng)景功炮,最后業(yè)務(wù)實(shí)體其實(shí)就是類的一個(gè)版型溅潜,具有類的所有屬性。
6.包
包是UML中非常實(shí)用的一個(gè)元素薪伏,主要作用就是容納并未其他元素分類滚澜,它可以容納任何UML元素,比如用例嫁怀,業(yè)務(wù)實(shí)體设捐,、類圖等塘淑,也包括了子包萝招,在Rose可以看到有三個(gè)默認(rèn)的頂級(jí)包,Use Case View存捺、Logic View和Component View槐沼,在其下可以按需要建立無限層次的分包。
關(guān)于分包捌治,好像是隨意的岗钩,但其實(shí)不然,UML對(duì)于分包是有一些指導(dǎo)原則的肖油,分包的好壞由包之間的依賴關(guān)系來評(píng)判兼吓,事實(shí)上,在UML中森枪,包之間關(guān)系只有依賴關(guān)系视搏,好的分包需要高內(nèi)聚低耦合。
7.分析類
分析類用于獲取系統(tǒng)中的職責(zé)簇县袱,他們代表系統(tǒng)中的原型類浑娜,是系統(tǒng)必須處理的主要抽象概念的“第一道關(guān)口”,分析類還可以產(chǎn)生系統(tǒng)設(shè)計(jì)的主要抽象===系統(tǒng)的射擊類和子系統(tǒng)显拳。
分析類是業(yè)務(wù)需求向系統(tǒng)設(shè)計(jì)轉(zhuǎn)化過程中最主要的元素棚愤,他們?cè)诟邔哟纬橄蟪鱿到y(tǒng)實(shí)現(xiàn)業(yè)務(wù)需求的原因搓萧,業(yè)務(wù)需求通過分析類邏輯化杂数。這么說很模糊,我們看下分析類的分類就清楚了瘸洛。
分析類分類
- 邊界類
邊界類是一種用于對(duì)系統(tǒng)外部環(huán)境與其內(nèi)部運(yùn)作之間進(jìn)行建模的類揍移,這種交互包括轉(zhuǎn)換事件,并記錄系統(tǒng)表示方式比如接口中的變更反肋,在從需求向?qū)崿F(xiàn)轉(zhuǎn)換的過程中那伐,任何有交互的兩個(gè)關(guān)鍵對(duì)象,都需要考慮建立邊界類。
這么說很模糊罕邀,對(duì)現(xiàn)實(shí)世界中畅形,邊界類的實(shí)例可以是窗口、通信協(xié)議诉探、傳感器等日熬,在計(jì)算機(jī)中,可以是一個(gè)消息中間件肾胯,一個(gè)驅(qū)動(dòng)程序竖席,一組對(duì)象接口甚至任意一個(gè)類,總之敬肚,無論是現(xiàn)實(shí)世界還是計(jì)算機(jī)世界毕荐,當(dāng)我們打算對(duì)對(duì)象A以及對(duì)象B的交互進(jìn)行建模時(shí),邊界類都可以充當(dāng)這一個(gè)載體艳馒。
看一些需要邊界類的場(chǎng)景:
- 參與者與用例之間
例如:參與者通過一個(gè)網(wǎng)頁憎亚,一組窗口來使用用例的功能。 - 用例與用例之間如果有交互弄慰,應(yīng)當(dāng)建立邊界類虽填。
一個(gè)用例要訪問另一個(gè)用例,直接訪問用例對(duì)象是不好的結(jié)構(gòu)曹动,這樣將導(dǎo)致緊耦合的發(fā)生斋日,而邊界類可以解耦,類似門面模式墓陈,實(shí)現(xiàn)時(shí)恶守,可以演化為一組API,JMS或者代理類贡必。 - 用例與系統(tǒng)之外的非人對(duì)象兔港,比如第三方支付系統(tǒng),當(dāng)建立邊界類仔拟。
這正常是因?yàn)楫悩?gòu)系統(tǒng)衫樊、異構(gòu)數(shù)據(jù)、訪問權(quán)限等利花,具體實(shí)現(xiàn)時(shí)科侈,要演化為中介和通信協(xié)議。中介例如網(wǎng)關(guān)炒事、通信中間件臀栈、代理服務(wù)器、SOA這種挠乳,通信協(xié)議就是Http協(xié)議等权薯。 - 相關(guān)聯(lián)的對(duì)象有明顯的獨(dú)立性要求
最后姑躲,從架構(gòu)角度來講,邊界類一位于展示層盟蚣。
邊界類的特征:
可以提高系統(tǒng)可用性黍析,解耦。
- 控制類
對(duì)于一個(gè)或幾個(gè)用例所特有的控制行為進(jìn)行建模屎开,控制對(duì)象通抽先裕控制其他對(duì)象,因此他們的行為具有協(xié)調(diào)性質(zhì)牍戚。從架構(gòu)角度上侮繁,控制類主要位于業(yè)務(wù)邏輯層,控制類的獲取對(duì)架構(gòu)設(shè)計(jì)中的業(yè)務(wù)邏輯層有著重要的指導(dǎo)意義如孝。
3.實(shí)體類
就是業(yè)務(wù)實(shí)體宪哩,javaBean對(duì)象,通常都是永久性第晰,所具有的屬性和關(guān)系是長(zhǎng)期需要的锁孟,有時(shí)甚至在系統(tǒng)的整個(gè)生命期都需要。
在設(shè)計(jì)階段茁瘦,實(shí)體類代表了Pojo類品抽,一系列pojo類,從架構(gòu)角度上甜熔,實(shí)體類主要位于數(shù)據(jù)持久層圆恤。
分析類的三高
分析類的抽象層次有三高的特點(diǎn)。
高于設(shè)計(jì)實(shí)現(xiàn)腔稀,高于語言實(shí)現(xiàn)盆昙,高于實(shí)現(xiàn)方式
8. 設(shè)計(jì)類
設(shè)計(jì)類是系統(tǒng)實(shí)施一個(gè)或者多個(gè)的抽象,設(shè)計(jì)類所應(yīng)對(duì)應(yīng)的對(duì)象取決于實(shí)施語言焊虏,設(shè)計(jì)類用于設(shè)計(jì)模型中淡喜,它直接使用與編程語言相同的語言來描述。對(duì)于java語言中的接口诵闭。設(shè)計(jì)類由類型炼团、屬性和方法構(gòu)成。關(guān)系
在UML中關(guān)系是非常重要的概念疏尿,它抽象出對(duì)象之間的聯(lián)系瘟芝,讓對(duì)象構(gòu)成某個(gè)特定的結(jié)構(gòu)。在UML中關(guān)系一共有9種润歉,下面將一一介紹:
- 關(guān)聯(lián)關(guān)系
使用一條直線表示模狭,描述不同類的對(duì)象之間的關(guān)系,是一種靜態(tài)關(guān)系踩衩,在代碼中以實(shí)例變量的成員實(shí)現(xiàn)嚼鹉。
- 依賴關(guān)系
使用帶箭頭的虛線表示,A-------> B,A依賴于B驱富。描述對(duì)象運(yùn)行時(shí)會(huì)用到另一個(gè)對(duì)象的關(guān)系锚赤,是一種臨時(shí)性關(guān)系,只在運(yùn)行時(shí)產(chǎn)生褐鸥。一般而言线脚,依賴關(guān)系在代碼中以類構(gòu)造方法、類方法等的傳入?yún)?shù)叫榕。與關(guān)聯(lián)關(guān)系不同浑侥,被依賴對(duì)象,會(huì)導(dǎo)致依賴對(duì)象的屬性或者行為的修改晰绎。
- 拓展關(guān)系
特別用于在用例模型中說明向基本用例中的某個(gè)拓展點(diǎn)插入拓展用例,
一般來水荞下,拓展用例是帶有抽象屬性的伶选,代表用例場(chǎng)景中的某個(gè)“支流”,由特定的拓展點(diǎn)觸發(fā)而啟動(dòng)尖昏,所以嚴(yán)格來說仰税,拓展用例,應(yīng)用在概念模型中抽诉,通過分析業(yè)務(wù)用例場(chǎng)景抽象出關(guān)鍵的可選核心業(yè)務(wù)而形成拓展用例陨簇。
與包含關(guān)系不同的是,拓展用例是可選的迹淌,而不是必須的塞帐,沒有這個(gè)用例,基本用例也是完整的巍沙。舉個(gè)例子: 在接電話過程中葵姥,另外一個(gè)電話進(jìn)來了,我們可以保留當(dāng)前電話句携,接聽另一個(gè)也可以不保留當(dāng)前電話榔幸,是否保留取決于個(gè)人的決定,而不是必須的矮嫉。
- 包含關(guān)系
特別用于用例模型,說明在執(zhí)行基本用例實(shí)例的過程中插入的行為段蠢笋。
與拓展用例類似拨齐,但是他是必須的,可以代表在各自不同基本用例中復(fù)用的行為。
舉個(gè)例子: 比如你去銀行辦理各種業(yè)務(wù)妹卿,無論取錢、轉(zhuǎn)賬稿茉、存錢歼狼,都必須驗(yàn)證賬號(hào)和密碼掏导,因此可以將這部分的行為抽取出來,形成包含用例羽峰。
- 實(shí)現(xiàn)關(guān)系
,特別用于在用例模型中連接用例和用例實(shí)現(xiàn)梅屉,說明基本用例的一個(gè)實(shí)現(xiàn)方式值纱。
基本用例描繪了一個(gè)業(yè)務(wù)目標(biāo),但是該目標(biāo)有多種實(shí)現(xiàn)方式坯汤,每種途徑都對(duì)應(yīng)一種用例實(shí)現(xiàn)來表示虐唠,那用例實(shí)現(xiàn)與基本用例就構(gòu)成了實(shí)現(xiàn)關(guān)系。換句話說玫霎,每個(gè)實(shí)現(xiàn)都實(shí)現(xiàn)了基本用例的業(yè)務(wù)目標(biāo)凿滤。
比如繳納電話費(fèi),此時(shí)有三種用例實(shí)現(xiàn)庶近,此時(shí)就是三種實(shí)現(xiàn)關(guān)系翁脆。
- 精化關(guān)系
反番,用于用例模型,一個(gè)基本用例可以分解出許多更小的精化用例叉钥,可以更細(xì)致的展示用例的核心業(yè)務(wù)罢缸。
與泛化關(guān)系不同的是,精化關(guān)系表示基本對(duì)象分解更精細(xì)的子對(duì)象投队,子對(duì)象沒有增加枫疆、減少、改變基本對(duì)象的行為和屬性敷鸦,但在泛化關(guān)系中息楔,基本對(duì)象被泛化成子對(duì)象后,子對(duì)象繼承了基本對(duì)象的所有特征扒披,并且子對(duì)象可以添加值依、改變基本對(duì)象的行為和屬性。
還有精化只用于建模碟案,而泛化等同于實(shí)現(xiàn)語言中的繼承愿险。
-
泛化關(guān)系
可以用于建模的任意一個(gè)階段,說明兩個(gè)對(duì)象之間的繼承關(guān)系价说,這個(gè)應(yīng)該都很熟悉了辆亏。
-
聚合關(guān)系
聚合關(guān)系主要作用在類圖风秤,用于表示實(shí)體對(duì)象之間的關(guān)系,表達(dá)整體由部分構(gòu)成的語義褒链,比如一個(gè)部門由多個(gè)員工構(gòu)成唁情。與組合關(guān)系不同的是疑苔,聚合的整體和部分的不是強(qiáng)依賴的甫匹,整體不存在了,部分依然可以存在惦费。
-
組合關(guān)系
表示A組成B或者B由A組成兵迅。在Rose中沒有采用這種方式,而是采用帶箭頭的空心菱形薪贫。也是用于類圖恍箭,跟聚合區(qū)別是,如果整體不存在了瞧省,部分也會(huì)消亡扯夭。