如果你在做設(shè)計(jì)過(guò)程中有一些困惑,如:不會(huì)找用例、兩個(gè)用例圖分不清楚、不知道自己畫(huà)的對(duì)不對(duì)。那么希望本文能幫助厘清上面幾個(gè)問(wèn)題,真正掌握用例圖,在后面的設(shè)計(jì)中能運(yùn)用的得心應(yīng)手。 在做設(shè)計(jì)的時(shí)候你是否有以下困惑?
1.不會(huì)找用例:業(yè)務(wù)用例、系統(tǒng)用例又都是啥???我該如何把用例寫(xiě)對(duì)???
2.兩個(gè)用例圖分不清楚:業(yè)務(wù)用例圖和系統(tǒng)用例圖感覺(jué)好像啊,似乎沒(méi)啥區(qū)別???
3.不知道自己畫(huà)的對(duì)不對(duì):照貓畫(huà)虎畫(huà)了個(gè)用例圖,但是我也不知道畫(huà)的對(duì)不對(duì),萬(wàn)一評(píng)審的人也不會(huì)呢,就這樣交差吧? 如果你在做設(shè)計(jì)過(guò)程中有以上困惑,那么希望本文能幫助厘清上面幾個(gè)問(wèn)題,真正掌握用例圖,在后面的設(shè)計(jì)中能運(yùn)用的得心應(yīng)手。
一、如何識(shí)別正確的用例
首先看用例的概念,百科上定義“用例是軟件工程或系統(tǒng)工程中對(duì)系統(tǒng)如何反應(yīng)外界請(qǐng)求的描述,是一種通過(guò)用戶的使用場(chǎng)景來(lái)獲取需求的技術(shù)”。什么意思呢,這里我引用《大象:Thinking in UML》里面的一段話來(lái)解釋下這個(gè)定義
這個(gè)世界的功能性體現(xiàn)在,首先有某人的一個(gè)愿望,這個(gè)愿望驅(qū)使人去做事并獲得一個(gè)確定的結(jié)果。如果沒(méi)有愿望,功能性就無(wú)從談起。一個(gè)系統(tǒng)就是由各種各樣的愿望組成的,換句話說(shuō),各種各樣的人為著各自的目的做著各種各樣的事情共同組成了一個(gè)系統(tǒng)。如果我們要描述一個(gè)系統(tǒng)的功能性需求,就要找到對(duì)這個(gè)系統(tǒng)有愿望的人,讓他們來(lái)說(shuō)明他們會(huì)在這個(gè)系統(tǒng)里做什么事,想要什么結(jié)果。如果所有對(duì)系統(tǒng)有愿望的人要做的所有事情都找全了,那這個(gè)系統(tǒng)的功能性就被確定下來(lái)了。
用例的一個(gè)最主要的特征是它是相對(duì)獨(dú)立的。這意味著它不需要與其他用例交互而獨(dú)自完成參與者的目的,也就是說(shuō)用例從“功能”上說(shuō)是完備的。用例本質(zhì)體現(xiàn)了系統(tǒng)參與者的愿望,不能完整達(dá)到參與者愿望的不能稱為用例。例如取錢是一個(gè)有效的用例,填寫(xiě)取款單卻不是,因?yàn)橥暾哪康氖侨〉藉X,沒(méi)有人會(huì)為了填寫(xiě)取款單而專門跑一趟銀行的。 用例有兩種,業(yè)務(wù)用例和系統(tǒng)用例,那么我們?nèi)绾螠?zhǔn)確的識(shí)別用例呢?接下來(lái)我們就對(duì)業(yè)務(wù)用例、系統(tǒng)用例逐一分析。
1.1 業(yè)務(wù)用例
業(yè)務(wù)用例的定義是業(yè)務(wù)執(zhí)行者希望通過(guò)和所研究組織交互獲得的價(jià)值。 我們可以看到一個(gè)關(guān)鍵詞--價(jià)值,這個(gè)價(jià)值不是指你(組織)能提供什么而是指我(執(zhí)行者)想要什么,這個(gè)時(shí)候就需要把視角放在組織外部,切換到執(zhí)行者上,看看他希望從組織獲得什么,而不是把視角放在組織內(nèi)部,看組織能提供什么。比如說(shuō)以餐館這個(gè)組織為例,其業(yè)務(wù)執(zhí)行者主要是顧客,雖然餐館可以提供零錢兌換、球賽播放、充電寶租借等服務(wù),但是顧客來(lái)餐館就是為了吃飯的,顧客->就餐就是餐館的業(yè)務(wù)用例,提供就餐服務(wù)就是餐館這個(gè)組織最大的價(jià)值。
?
試想一個(gè)餐館如果不圍繞“提供物美價(jià)廉的就餐服務(wù)”這一理念去經(jīng)營(yíng),而是飯菜質(zhì)量做的很差,提供了很多充電寶服務(wù),那么這個(gè)餐館的結(jié)果可想而知。
1.2 系統(tǒng)用例
說(shuō)完業(yè)務(wù)用例我們?cè)賮?lái)看看系統(tǒng)用例,系統(tǒng)用例的定義是系統(tǒng)能夠?yàn)閳?zhí)行者提供的、涉眾可以接受的價(jià)值。其中的幾個(gè)概念:
1.系統(tǒng)
封裝了自身的數(shù)據(jù)和行為,能獨(dú)立對(duì)外提供服務(wù)的東西才能稱為系統(tǒng)。需要注意的系統(tǒng)是一個(gè)整體,系統(tǒng)可能會(huì)有很多子系統(tǒng)。比如銀行轉(zhuǎn)賬交易時(shí)候需要做風(fēng)控,如果有商家向銀行售賣交易系統(tǒng),那么風(fēng)控這個(gè)子系統(tǒng)肯定是包含在整個(gè)交易系統(tǒng)內(nèi)的,一起打包賣給銀行的。
2.系統(tǒng)執(zhí)行者
系統(tǒng)執(zhí)行者的定義是在所研究系統(tǒng)外,與該系統(tǒng)發(fā)生功能性交互的其他系統(tǒng)。這里需要注意幾點(diǎn):
系統(tǒng)執(zhí)行者一定是在系統(tǒng)外的,可以是人或者其他系統(tǒng);
系統(tǒng)執(zhí)行者必須是要和系統(tǒng)有交互的;
系統(tǒng)執(zhí)行者不一定是業(yè)務(wù)執(zhí)行者;
3.涉眾
涉眾是與要建設(shè)的業(yè)務(wù)系統(tǒng)相關(guān)的一切人和事,系統(tǒng)執(zhí)行者也是涉眾的一部分。
這里還是以餐館為例,假如顧客是通過(guò)口頭告訴服務(wù)員(不是自己掃碼下單)我要點(diǎn)啥菜,服務(wù)員通過(guò)下單系統(tǒng)為顧客下單,那么研究這個(gè)下單系統(tǒng)可以得出:
1.系統(tǒng)執(zhí)行者:服務(wù)員,雖然顧客作為餐館這個(gè)組織的業(yè)務(wù)執(zhí)行者,但是與下單系統(tǒng)直接交互的是服務(wù)員,所以服務(wù)員才是點(diǎn)餐系統(tǒng)的系統(tǒng)執(zhí)行者;
2.涉眾,這個(gè)就很多了,顧客、服務(wù)員、餐館老板、廚師等等都是涉眾,因?yàn)槎际窍聠蜗到y(tǒng)的利益關(guān)系者;
a.顧客擔(dān)心自己下單沒(méi)成功,等了很久不上菜; b.服務(wù)員擔(dān)心沒(méi)出單導(dǎo)致顧客投訴,自己獎(jiǎng)金被扣; c.老板擔(dān)心系統(tǒng)故障引起很多顧客投訴,生意受到影響;
d.廚師擔(dān)心下單系統(tǒng)分配不合理,所有的菜都分配給自己做;
一般這個(gè)下單系統(tǒng)可以登錄、下單,查看下單記錄,這些都是下單系統(tǒng)的一些功能。我們?cè)賮?lái)回顧下系統(tǒng)用例的概念:系統(tǒng)用例指的是系統(tǒng)能夠?yàn)閳?zhí)行者提供的、涉眾可以接受的價(jià)值。那我們接下來(lái)就從每個(gè)涉眾的視角分析一下對(duì)這些功能的需要情況。
登錄 | 下單 | 查看下單記錄 | |
服務(wù)員 | 我需要,要不然別人下錯(cuò)單了怪我頭上咋辦 | I need it! | 我需要,方便查看顧客菜品上齊了沒(méi) |
顧客 | I don't care! | 能不能下單直接影響我能不能吃上飯 | 我也需要,得打印出來(lái)我的菜單,結(jié)賬時(shí)候好核對(duì) |
老板 | 我也需要,可以看看服務(wù)員的工作情況 | 下單系統(tǒng)不能下單我買它來(lái)干啥 | 我需要,方便訂單管理,也方便看看哪個(gè)菜客人點(diǎn)的最多 |
廚師 | I don't care! | 不能下單誰(shuí)告訴我該做什么菜 | 我需要,要不然說(shuō)我少做了一道菜沒(méi)法解釋 |
所以,從上可以得出下單、查看下單記錄滿足系統(tǒng)用例的概念,系統(tǒng)用例圖如下?
?
可以看到,和業(yè)務(wù)用例不同的是在研究系統(tǒng)用例時(shí)我們需要把視角切換到系統(tǒng),從系統(tǒng)出發(fā)看看能為執(zhí)行者提供什么樣的、涉眾都可以接受價(jià)值。?
Tips:
1.用例的名字一般是動(dòng)賓結(jié)構(gòu),也就是“動(dòng)詞+名詞”,但是不嚴(yán)格要求的。比如“成果分析”這個(gè)行業(yè)術(shù)語(yǔ)沒(méi)必要硬倒過(guò)來(lái)改成“分析成果”
2.老老實(shí)實(shí)去研究業(yè)務(wù)流程,做好業(yè)務(wù)建模,盡量從業(yè)務(wù)序列圖中映射出系統(tǒng)用例,這樣得到的系統(tǒng)用例才是是最真實(shí)的。
3.用例是可以有主執(zhí)行者和輔執(zhí)行者的:主執(zhí)行者從執(zhí)行者指向用例,而輔執(zhí)行者從用例指向執(zhí)行者,主執(zhí)行者發(fā)起用例的交互,輔執(zhí)行者在交互過(guò)程中被動(dòng)參與進(jìn)來(lái)。一般說(shuō)來(lái),輔執(zhí)行者是人肉系統(tǒng)的情況比較少,更多時(shí)候是另一個(gè)非人智能系統(tǒng)。
4.主執(zhí)行者和輔執(zhí)行者是相對(duì)于用例來(lái)說(shuō)的,“ xx 是xx用例的主/輔執(zhí)行者” 是正確的,“ xx 是xx系統(tǒng)的主/輔執(zhí)行者” 說(shuō)法是錯(cuò)誤的。
二、如何區(qū)分業(yè)務(wù)用例圖和系統(tǒng)用例圖
相信經(jīng)過(guò)上面的分析,你已經(jīng)發(fā)現(xiàn)了兩個(gè)用例圖的異同點(diǎn),如果沒(méi)有,我再貼一下兩個(gè)圖(便于對(duì)比下單系統(tǒng)就簡(jiǎn)化成下單這個(gè)一個(gè)用例),便于更直觀的對(duì)比:
?
沒(méi)錯(cuò),兩個(gè)圖的最大的不同就是有無(wú)“/”,業(yè)務(wù)用例圖在業(yè)務(wù)執(zhí)行者和業(yè)務(wù)用例上是有“/”的,系統(tǒng)用例圖在系統(tǒng)執(zhí)行者和系統(tǒng)用例圖上沒(méi)有“/”,就是這么簡(jiǎn)單。所以現(xiàn)在再看到下面這個(gè)幾個(gè)圖,你是不是可以一眼看出其中的問(wèn)題了。?
?
三、如何用 PlantUML 畫(huà)出規(guī)范的用例圖
PlantUML 是一個(gè)快速創(chuàng)建 UML 圖形的組件或者可以說(shuō)是語(yǔ)言,通過(guò)簡(jiǎn)單和直觀的語(yǔ)言來(lái)定義圖形。其在學(xué)習(xí)成本、效率、團(tuán)隊(duì)協(xié)同以及維護(hù)成本上都有比較大的優(yōu)勢(shì),所以推薦使用 PlantUML 來(lái)畫(huà)圖。
用例圖畫(huà)起來(lái)其實(shí)很簡(jiǎn)單,主要就是四個(gè)要素,這里以系統(tǒng)用例為例,四個(gè)要素分別是系統(tǒng)、執(zhí)行者、用例、關(guān)系。
3.1 系統(tǒng)
系統(tǒng)用一個(gè)矩形塊表示,在 UML語(yǔ)法中是rectangle。如下:
@startuml rectangle "xx 系統(tǒng)" { } @enduml
?
3.2 執(zhí)行者
執(zhí)行者是用火材人表示,在 UML 語(yǔ)法中是actor,主要有兩種寫(xiě)法,如下:
@startuml '系統(tǒng)執(zhí)行者的兩種寫(xiě)法' actor Actor1 :Actor2: '業(yè)務(wù)執(zhí)行者的兩種寫(xiě)法' actor/ Actor3 :Actor4:/ @enduml
3.3 用例
用例是用一個(gè)橢圓表示。在UML 語(yǔ)法中是usecase ,業(yè)務(wù)用例和系統(tǒng)用例的兩種寫(xiě)法如下:
@startuml usecase/ " 業(yè)務(wù)用例 1" as UC1 '業(yè)務(wù)用例的第二種寫(xiě)法:() + 用例名稱 + /' (業(yè)務(wù)用例 2)/ as UC3 usecase "系統(tǒng)用例 1" as UC2 '系統(tǒng)用例的第二種寫(xiě)法:() + 用例名稱 ' (系統(tǒng)用例 2) @enduml
?
3.4 關(guān)系
系統(tǒng)用例圖中關(guān)系主要有四種,分別是關(guān)聯(lián)、包含、擴(kuò)展、泛化。
3.4.1 關(guān)聯(lián)
關(guān)聯(lián)是執(zhí)行者和用例之間的一種關(guān)系,一般用實(shí)線 + 實(shí)心箭頭表示:
@startuml actor Actor rectangle "xx系統(tǒng)" { usecase "系統(tǒng)用例 1" as UC1 } Actor -> UC1 @enduml
這里有一點(diǎn)需要注意的是,雖然表示關(guān)聯(lián)關(guān)系可以直接用實(shí)線如A-B這樣表示,但是在用例圖中我們盡量用實(shí)線+箭頭表示,否則如下:?
?
你無(wú)法區(qū)分 Actor1 和 Actor2 誰(shuí)是主執(zhí)行者誰(shuí)是輔執(zhí)行者,又或者兩個(gè)都是主執(zhí)行者?加上箭頭后就非常容易區(qū)分,如下
3.4.2 包含
包含是用例之間的一種關(guān)系,其中一個(gè)用例(稱為基本用例)的行為包含了另一個(gè)用例(稱為包含用例)的行為,用虛線箭頭 + <
包含關(guān)系意味著包含用例是基本用例中不可缺少的一個(gè)執(zhí)行步驟,如果缺少了該包含用例,基本用例就會(huì)變得不完整,可類比類圖中對(duì)象之間的組合關(guān)系。使用包含關(guān)系的兩個(gè)場(chǎng)景:
當(dāng)基本用例較復(fù)雜時(shí),可以分解出一些包含用例;
當(dāng)兩個(gè)或以上的基本用例存在一些重復(fù)行為時(shí),可以提煉出一個(gè)包含用例;
@startuml '加入下面代碼指定方向,使 UML 從左往右更直觀' left to right direction actor Actor rectangle "xx系統(tǒng)" { usecase "基本用例" as UC1 usecase "包含用例 1" as UC2 usecase "包含用例 2" as UC3 } Actor --> UC1 UC1 ..> UC2 : <> UC1 ..> UC3 : < > @enduml?
上面我用了Actor --> UC1、UC1 ..> UC2,有興趣的可以換成->、.>看看效果
3.4.3 擴(kuò)展關(guān)系
擴(kuò)展是用例之間的一種關(guān)系,其中一個(gè)用例(稱為擴(kuò)展用例)的行為增強(qiáng)了另一個(gè)用例(稱為基本用例)的行為,用虛線箭頭 + <
擴(kuò)展用例是對(duì)基本用例的一種補(bǔ)充或強(qiáng)化,即使沒(méi)有該擴(kuò)展用例,對(duì)基本用例也不會(huì)產(chǎn)生直接影響,基本用例自身仍然是完整的。也就是說(shuō)擴(kuò)展用例是基本用例的一種可能的補(bǔ)充,如購(gòu)買運(yùn)費(fèi)險(xiǎn)就是對(duì)下單這一用例的擴(kuò)展,買不買運(yùn)費(fèi)險(xiǎn)都不影響下單。
@startuml left to right direction actor Actor rectangle "xx系統(tǒng)" { usecase "基本用例" as UC1 usecase "擴(kuò)展用例" as UC2 } Actor --> UC1 UC1 <.. UC2 : <> @enduml
3.4.4 泛化
泛化關(guān)系也可以稱作繼承關(guān)系(類比類圖中的泛化),用一個(gè)實(shí)線 + 空心箭頭來(lái)表示,可以表示執(zhí)行者間的關(guān)系也可以表示用例之間的關(guān)系。
@startuml left to right direction actor Actor rectangle "xx系統(tǒng)" { usecase "支付" as UC1 usecase "微信支付" as UC2 usecase "支付寶支付" as UC3 } Actor --> UC1 UC1 <|-- UC2 UC1 <|-- UC3 @enduml
?
四、一個(gè)案例
這里我們以某銀行的 App 為例,作為銀行的一個(gè)系統(tǒng)我們對(duì)其進(jìn)行分析:
1.系統(tǒng):那自然是這個(gè) App
2.系統(tǒng)執(zhí)行者
a.主執(zhí)行者:一般來(lái)銀行辦業(yè)務(wù)的客戶都是主執(zhí)行者,包括個(gè)人用戶和企業(yè)用戶;
b.輔執(zhí)行者:銀行,用戶在 App 辦理的所有業(yè)務(wù)都需要銀行來(lái)配合執(zhí)行;
3.系統(tǒng)用例:作為銀行的線上業(yè)務(wù),包含轉(zhuǎn)賬、查詢余額、理財(cái)、貸款。
4.關(guān)系:這里需要注意的是轉(zhuǎn)賬過(guò)多有可能會(huì)超過(guò)限額,這個(gè)時(shí)候會(huì)提示超限;在辦貸款業(yè)務(wù)之前,銀行肯定會(huì)對(duì)用戶的資產(chǎn)進(jìn)行評(píng)估,這樣才能決定其貸款額度。
@startuml left to right direction actor 客戶 as Actor actor 銀行 as Actor2 rectangle "某銀行App" { usecase "轉(zhuǎn)賬" as UC1 usecase "查詢余額" as UC2 usecase "理財(cái)" as UC3 usecase "貸款" as UC4 usecase "評(píng)估資產(chǎn)" as UC5 usecase "提示限額" as UC6 } Actor <|-up- 個(gè)人用戶 Actor <|-up- 企業(yè)用戶 Actor --> UC1 Actor --> UC2 Actor --> UC3 Actor --> UC4 UC1 ----> Actor2 UC2 ----> Actor2 UC3 ----> Actor2 UC4 ----> Actor2 UC4 .left.> UC5 :<整體用例圖如下:> UC1 <.down. UC6 :< > @enduml
審核編輯:黃飛
-
UML
+關(guān)注
關(guān)注
0文章
122瀏覽量
30835 -
測(cè)試用例
+關(guān)注
關(guān)注
0文章
20瀏覽量
7116
原文標(biāo)題:如何畫(huà)出規(guī)范的UML用例圖
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論