UML圖繪制的注意點(diǎn)和實(shí)例分析
先百度一下,Unified Modeling Language (UML)又稱統(tǒng)一建模語(yǔ)言或標(biāo)準(zhǔn)建模語(yǔ)言,是始于1997年一個(gè)OMG標(biāo)準(zhǔn),它是一個(gè)支持模型化和軟件系統(tǒng)開(kāi)發(fā)的圖形化語(yǔ)言,為軟件開(kāi)發(fā)的所有階段提供模型化和可視化支持,包括由需求分析到規(guī)格,到構(gòu)造和配置。
UML可以看做用于系統(tǒng)設(shè)計(jì)階段給開(kāi)發(fā)做參考的一種方式,其很多圖需要用到面向?qū)ο蟪绦虻乃季S。畫UML圖是產(chǎn)品經(jīng)理的必備技能之一。
廢話不多說(shuō),本文介紹一下最常見(jiàn)的幾個(gè)UML圖:類圖、用例圖、狀態(tài)圖、序列圖、活動(dòng)圖,以及一個(gè)并不屬于UML,但也有很大作用的數(shù)據(jù)流圖。每張圖詳細(xì)介紹一下畫法、注意點(diǎn)和具體案例。相關(guān)的概念、元素等則簡(jiǎn)單介紹。
一、類圖
類圖是UML圖中看起來(lái)最復(fù)雜的一個(gè)圖。它與數(shù)據(jù)庫(kù)和面向?qū)ο缶幊痰穆?lián)系比較緊密。沒(méi)學(xué)過(guò)面向?qū)ο蠡蛘邤?shù)據(jù)庫(kù)的同學(xué)剛開(kāi)始畫類圖可能比較吃力。
一句話介紹一下類:類即相同屬性、操作、關(guān)系和語(yǔ)義的對(duì)象的描述。類的組成:屬性、操作。
類圖描述系統(tǒng)中類的靜態(tài)結(jié)構(gòu)。它的作用是定義系統(tǒng)中的類, 表示類之間的關(guān)系(關(guān)聯(lián), 依賴, 聚合等),描述類的內(nèi)部結(jié)構(gòu)(屬性, 方法等)。一個(gè)類長(zhǎng)什么樣看下圖。
類圖有涉及到面向?qū)ο蟮闹R(shí),在此不一一敘述。圖中有些看不懂的名詞請(qǐng)自行百度。
類之間通過(guò)關(guān)系連接起來(lái)。類圖中的關(guān)系很多,在此介紹最常見(jiàn)的關(guān)聯(lián)關(guān)系。關(guān)聯(lián)關(guān)系是一種擁有的關(guān)系,它使一個(gè)類知道另一個(gè)類的屬性和方法。關(guān)聯(lián)關(guān)系的類通過(guò)箭頭連接起來(lái)。
下面分析具體案例:公司圖書管理系統(tǒng),包括借書、還書、申請(qǐng)買書的操作。借書過(guò)程:?jiǎn)T工發(fā)起借書申請(qǐng),由行政人員去圖書館拿書給員工。還書買書類似。后面的圖也是用這個(gè)案例。
這幅圖就是借書系統(tǒng)的類圖。要簡(jiǎn)化的話可以將可見(jiàn)性符號(hào)和屬性的類型省略。圖中的空心三角形應(yīng)該為箭頭。
員工、書、訂單三個(gè)類比較容易理解,代表了三個(gè)抽象的實(shí)體。借書類則是員工和書之間借書行為的一個(gè)抽象,連接了員工和書,記錄了借書這個(gè)狀態(tài)中的一些信息,以及借還書操作。買書同理。
列幾條類圖繪制的要點(diǎn)。
- 類的操作是針對(duì)類自身的操作,而不是它去操作人家。比如書這個(gè)類有上架下架的操作,是書自己被上架下架,不能因?yàn)樯霞芟录苁枪芾韱T的動(dòng)作而把它放在管理員的操作里。
- 兩個(gè)相關(guān)聯(lián)的類,需要在關(guān)聯(lián)的類中加上被關(guān)聯(lián)類的ID,并且箭頭指向被關(guān)聯(lián)類。可以理解為數(shù)據(jù)表中的外鍵。比如借書和書,借書需要用到書的信息,因此借書類需包含書的ID,箭頭指向書。
- 由于業(yè)務(wù)復(fù)雜性,一個(gè)顯示中的實(shí)體可能會(huì)被分為多個(gè)類,這是很正常的,類不是越少越好。類的設(shè)計(jì)取決于怎樣讓后臺(tái)程序的操作更加簡(jiǎn)單。比如單看邏輯,借書類可以不存在,它的信息可以放在書這個(gè)類里。然而借還書的書的上架下架完全不是一回事,借書類對(duì)借書的操作更加方便,不需要去重復(fù)改動(dòng)書這個(gè)類中的內(nèi)容。此外,如果書和借書是1對(duì)多的關(guān)系,那就必須分為兩個(gè)類。
- 類圖中的規(guī)范問(wèn)題,比如不同關(guān)系需要不同的箭頭(本文只介紹了1種關(guān)系),可見(jiàn)性符號(hào)等。
二、用例圖
用例圖是最常見(jiàn)的一種圖。用例圖概括了用例中角色和系統(tǒng)之間的關(guān)系,描述了系統(tǒng)功能需求,角色和系統(tǒng)的交互以及系統(tǒng)的反應(yīng)。
用例圖有參與者、用例、關(guān)系組成。參與者就是系統(tǒng)中的用戶身份。用例是系統(tǒng)中的一個(gè)功能的概括。關(guān)系是參與者或者與用例的聯(lián)系。其中關(guān)系可以分為關(guān)聯(lián)、泛化、包含和擴(kuò)展4種關(guān)系。關(guān)系的運(yùn)用是用例圖最難的部分。4種關(guān)系的說(shuō)明:
關(guān)聯(lián)是參與者和用例之間的關(guān)系,用箭頭;
- 泛化是參與者與用例或用例之間的關(guān)系,意思是特殊化。比如吃飯和吃晚飯。兩者的本質(zhì)是一樣的。符號(hào)用空心的三角形。箭頭為被指向。
- 包含是用例之間的關(guān)系,意思是一個(gè)用例包含另一個(gè)子用例。子用例是必須存在的,沒(méi)有子用例則功能不能完成。符號(hào)在箭頭的線上加<<include>>。箭頭為去指向。
- 擴(kuò)展也是用例之間的關(guān)系,意思是一個(gè)用例可以擴(kuò)展出一個(gè)子用例。與包含不同的是,這個(gè)子用例是不一定要存在的,沒(méi)有也一樣能完成功能。符號(hào)在箭頭線上加<<extend>>。箭頭為被指向。
還是上面那個(gè)圖書管理的案例
行政人員和員工是參與者,中間的這些是用例。這幅圖用例之間大部分都是包含關(guān)系,比如借書包括申請(qǐng)、查找、借閱這三個(gè)子用例,都是必須的。而圖書續(xù)借不是必須的,因此只是擴(kuò)展的用例。批量購(gòu)書是購(gòu)書的一個(gè)特例,和購(gòu)書本質(zhì)是相同的,因此作為泛化的關(guān)系。
繪制的注意點(diǎn):
- 用例之間的關(guān)系,尤其是包含和泛化的區(qū)別,可以這樣區(qū)分,試著把包含的用例讓泛化的用例來(lái)包含后,看看是不是同樣成立
- 箭頭指向,泛化和擴(kuò)展的指向和包含是反的
- 用例的表達(dá)是動(dòng)詞+名詞的形式,只有一個(gè)動(dòng)作或者名詞的不是用例。比如所有書籍,是否可借等表述就不是用例。
三、狀態(tài)圖
狀態(tài)圖是UML中相對(duì)比較簡(jiǎn)單的一張圖,用得也沒(méi)前兩種圖多。狀態(tài)圖是描述一個(gè)實(shí)體基于事件反應(yīng)的動(dòng)態(tài)行為,顯示了該實(shí)體所有可能的狀態(tài),以及事件發(fā)生時(shí)狀態(tài)的轉(zhuǎn)移條件。
總結(jié)一句話,狀態(tài)圖就是把類的狀態(tài)的改變連城一張圖。狀態(tài)圖的元素包括狀態(tài)、轉(zhuǎn)移和動(dòng)作。元素的形式如下圖所示,黑點(diǎn)分別為起始點(diǎn),矩形為狀態(tài),箭頭上時(shí)狀態(tài)改變的動(dòng)作和事件。
狀態(tài)圖可以看做是類圖的補(bǔ)充,因?yàn)闋顟B(tài)本身就是類的狀態(tài)。狀態(tài)圖的繪制過(guò)程很簡(jiǎn)單,只要先把類的狀態(tài)羅列,然后按順序連起來(lái),最后寫上動(dòng)作或條件即可。上圖中連接線上依次為事件、判斷條件和動(dòng)作,簡(jiǎn)化起來(lái)只要寫一個(gè)就行。
圖書館借書的狀態(tài)圖如下圖所示。
圖書的狀態(tài)為在館、被借閱、借出等,該狀態(tài)圖就是把狀態(tài)連接起來(lái)。
狀態(tài)圖的注意點(diǎn):
- 狀態(tài)圖不是流程圖!連起來(lái)的是狀態(tài)不是動(dòng)作!看似簡(jiǎn)單但很多人第一次繪制都會(huì)把狀態(tài)圖畫成流程圖類物質(zhì)。比如上圖中,提交申請(qǐng)、借書等都不是狀態(tài),只能作為動(dòng)作在連接線上出現(xiàn)。
- 狀態(tài)圖的狀態(tài)是系統(tǒng)中類的狀態(tài),現(xiàn)實(shí)中發(fā)生但與系統(tǒng)無(wú)關(guān)的情況都不能被算作是狀態(tài)。比如書被查找中,被翻閱中等現(xiàn)實(shí)里的狀態(tài),并沒(méi)有系統(tǒng)的操作,因此不是狀態(tài)。
四、序列圖
序列圖是用來(lái)描述對(duì)象之間消息發(fā)送的先后次序,闡明對(duì)象之間的交互過(guò)程以及系統(tǒng)執(zhí)行過(guò)程某一具體時(shí)刻將會(huì)發(fā)生什么事件。抽象地概括,序列圖就是把主體之間傳遞消息的操作以及消息本身按順序排列出來(lái)。
序列圖的元素包括對(duì)象、生命線、控制焦點(diǎn)、消息。每個(gè)元素的樣式如下圖所示。
序列圖的消息主要分為3種,調(diào)用(同步),發(fā)送(異步),和返回。同步調(diào)用消息是指發(fā)送者把控制傳遞給接收者,然后停止活動(dòng),等待消息返回。它是一種即時(shí)的關(guān)系,返回消息需要直接放在這條消息之后。用實(shí)心的三角形表示(如上圖的第一條線)。
異步發(fā)送消息是指發(fā)送者把消息發(fā)送過(guò)去后,繼續(xù)自己的活動(dòng),不需要等待消息返回來(lái)。返回消息可以在幾個(gè)過(guò)程之后。用半個(gè)箭頭表示(指留下上半個(gè)箭頭)。
返回消息就是上述兩種消息調(diào)用后所返回的消息,用虛線和普通的箭頭顯示,如上圖。
當(dāng)然,一般不需要返回的消息用普通箭頭就可以。
圖書館借書的序列圖如下所示。
從員工發(fā)起借書申請(qǐng)到借書成功的信息。對(duì)象之間的交互包括借書申請(qǐng)、查找、借書操作等。查找書和借書操作需要直接從系統(tǒng)返回消息。
序列圖的注意點(diǎn):
- 第一個(gè)對(duì)象是某操作者,第一步肯定是與系統(tǒng)進(jìn)行交互。如果畫詳細(xì)點(diǎn)的話可以再加個(gè)界面,第一步與界面交互,再界面與系統(tǒng)交互。
- 確定哪些情況要同步或者異步的返回信息。返回信息必須是與發(fā)送消息的對(duì)象一致,方向相反。
- 主體有對(duì)象和參與者兩種情況,對(duì)象和參與者要區(qū)別表示。員工就是參與者,系統(tǒng)是對(duì)象。
- 畫圖規(guī)范問(wèn)題,在交互過(guò)程中要有連續(xù)的控制焦點(diǎn),不能中斷也不能沒(méi)有。
五、活動(dòng)圖
活動(dòng)圖是展示業(yè)務(wù)用例實(shí)現(xiàn)的工作流程,描述活動(dòng)活動(dòng)的順序,展現(xiàn)從一個(gè)活動(dòng)到另一個(gè)活動(dòng)的控制流,強(qiáng)調(diào)每一步動(dòng)作和產(chǎn)生的結(jié)果。也就是說(shuō),活動(dòng)圖將系統(tǒng)的活動(dòng)連接起來(lái),是流程圖的詳細(xì)化。
活動(dòng)圖的元素有動(dòng)作狀態(tài)、動(dòng)作流、對(duì)象、對(duì)象流、分支合并,泳道等?;顒?dòng)圖的元素比較豐富,直接用圖書館的案例來(lái)分析。
三塊是泳道,分別是不同的對(duì)象。黑圓點(diǎn)是開(kāi)始和結(jié)束,中間是活動(dòng)和順序。矩形是活動(dòng)中需要涉及到的對(duì)象。粗線和菱形是合并分叉的標(biāo)志。
整個(gè)系統(tǒng)的業(yè)務(wù)流程如活動(dòng)的順序所示。發(fā)起借書申請(qǐng)時(shí)需要傳遞借書申請(qǐng)這個(gè)對(duì)象,因此需要添加對(duì)象。查找圖書后的菱形分叉表示判斷,分出兩個(gè)不同的活動(dòng)。粗線后的兩個(gè)活動(dòng)表示都在借書申請(qǐng)后一步執(zhí)行。
活動(dòng)圖的注意點(diǎn):
- 菱形和粗線(分叉)很容易錯(cuò)誤。粗線分叉是和的關(guān)系,表示都要做,菱形是或的關(guān)系,表示二選一,分開(kāi)與合并都是這樣,不要搞錯(cuò)
- 一個(gè)活動(dòng)只能唯一出現(xiàn)在一個(gè)泳道,不能跨泳道。對(duì)象可以跨泳道。
- 所有活動(dòng)必須連線,而對(duì)象是輔助的作用,去掉對(duì)象也要保證所有活動(dòng)連線。
- 規(guī)范問(wèn)題,比如開(kāi)始和結(jié)束的標(biāo)記不能漏
六、數(shù)據(jù)流圖
數(shù)據(jù)流圖雖然并不是UML圖,然而同樣很重要,而且畫圖的難度比較大。數(shù)據(jù)流圖簡(jiǎn)稱DFD,它從數(shù)據(jù)傳遞和加工角度,以圖形方式來(lái)表達(dá)系統(tǒng)的邏輯功能、數(shù)據(jù)在系統(tǒng)內(nèi)部的邏輯流向和邏輯變換過(guò)程。簡(jiǎn)單的說(shuō),就是數(shù)據(jù)的流程圖。
數(shù)據(jù)流圖的元素有外部實(shí)體、數(shù)據(jù)加工、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)流,如下圖所示。
數(shù)據(jù)流圖的原理,就是把每個(gè)數(shù)據(jù)加工按照順序用數(shù)據(jù)流連起來(lái)。系統(tǒng)外部輸入和輸出的數(shù)據(jù)則用外部實(shí)體來(lái)表達(dá)。每一步加工需要用到的數(shù)據(jù)存儲(chǔ),或者生成的數(shù)據(jù)存儲(chǔ),都用數(shù)據(jù)存儲(chǔ)來(lái)表示。每個(gè)數(shù)據(jù)加工都需要按序號(hào)命名。
由于系統(tǒng)數(shù)據(jù)的復(fù)雜性,不可能將所有數(shù)據(jù)操作畫在一張數(shù)據(jù)流圖上。需要進(jìn)行分層操作,先畫整體的數(shù)據(jù)流圖即頂層圖,再逐步細(xì)化,分為好幾張圖。
圖書館借書的數(shù)據(jù)流圖如下:
頂層圖:
0層圖
由于系統(tǒng)比較簡(jiǎn)單,因此一共只有兩層圖。頂層是整個(gè)系統(tǒng)和外部的數(shù)據(jù)交換狀態(tài),底層是詳細(xì)的數(shù)據(jù)流動(dòng)。數(shù)據(jù)加工分為三塊,借書申請(qǐng)檢查,圖書查找和圖書借閱。借書申請(qǐng)由員工提交,合格的申請(qǐng)發(fā)給管理員。
底層圖的加工用1、2等數(shù)字命名。如果0層圖后還有1層圖,則用1.1,2.1來(lái)命名。如果有1層圖,則需要分多張,如上圖中的加工有1、2、3,則1層圖要分3張,分別描繪這三步加工的詳細(xì)步驟。
數(shù)據(jù)流圖的注意點(diǎn):
- 所有步驟都是數(shù)據(jù)的流動(dòng),不要把現(xiàn)實(shí)中實(shí)體的流動(dòng)畫進(jìn)去。比如書,把書給員工,就不是系統(tǒng)中數(shù)據(jù)的流動(dòng),因此不能畫進(jìn)去。
- 外部實(shí)體之間不能有數(shù)據(jù)傳輸,不能在員工和管理員之間直接畫箭頭。
- 頂層系統(tǒng)只能有1個(gè)數(shù)據(jù)加工,然后一個(gè)個(gè)展開(kāi)來(lái),不能在頂層圖畫兩個(gè)或以上的數(shù)據(jù)加工。
- 頂層系統(tǒng)的輸入、輸出數(shù)據(jù),應(yīng)該和所有底層系統(tǒng)的輸入輸出數(shù)據(jù)一致,不能多出來(lái)或少。比如上圖頂層圖中員工的借書申請(qǐng),管理員的合格申請(qǐng),在所有底層圖中有且只能有這些數(shù)據(jù),不能在員工和管理員的數(shù)據(jù)流中多出一個(gè)數(shù)據(jù)。
- 如果一層有多幅圖,每幅圖之間的數(shù)據(jù)要能夠銜接起來(lái)。比如2圖書查找和3圖書借閱都有自己的子流程,那么2圖書查找的數(shù)據(jù)流圖結(jié)束后,就必須輸出圖書信息,3圖書借閱的數(shù)據(jù)流圖也必須要用到2傳遞的圖書信息。這點(diǎn)原理和上一點(diǎn)一樣。
就寫這么多。上述的案例是根據(jù)自身的業(yè)務(wù)來(lái)制定的,每個(gè)圖的案例也有一些地方會(huì)不夠完善。
本文由 @潘帕斯雄鷹 原創(chuàng)投稿,并經(jīng)人人都是產(chǎn)品經(jīng)理編輯。未經(jīng)許可,禁止轉(zhuǎn)載。
你們看得到里面的圖嗎?我這打開(kāi)都裂了
Uml圖詳解
如果做過(guò)開(kāi)發(fā)、了解面向?qū)ο缶幊汤斫膺@些很簡(jiǎn)單,但是現(xiàn)在做產(chǎn)品設(shè)計(jì)時(shí)基本上不用這些了?原型+泳道圖+高質(zhì)量的PRD交付給開(kāi)發(fā)即可
嗯。。簡(jiǎn)單易懂!不錯(cuò),對(duì)于to B而言,針對(duì)業(yè)務(wù)邊界和需求梳理都是利器了,甚至可以細(xì)化到字段、操作、事件、返回值這種顆粒度。以前就畫流程圖了,然后一直叭叭叭的一遍一遍的講,寫很多注釋。我覺(jué)得可以解放了,哈哈!我比較懶!不太愛(ài)寫文字注釋!
看懵了
mark,看了前三個(gè),明天繼續(xù)。
想問(wèn)下這些都要用什么工具來(lái)畫?
visio
很多根據(jù)都可以,共同協(xié)作用Visio最好,你自己梳理,Axure、excel、甚至畫圖都可以
我只想說(shuō)現(xiàn)在做產(chǎn)品設(shè)計(jì) 還需要畫這些圖嗎? ??
寫的不錯(cuò),但是過(guò)于簡(jiǎn)單,如果實(shí)例列舉如微信,OFO,京東商品詳情頁(yè)等這些常用的會(huì)更好。
邏輯性缺失
能否詳細(xì)說(shuō)明?
??
講得很好,只是舉的借書例子不好,所以看起來(lái)復(fù)雜
頗為復(fù)雜
贊