UML圖繪制的注意點和實例分析

先百度一下,Unified Modeling Language (UML)又稱統(tǒng)一建模語言或標(biāo)準(zhǔn)建模語言,是始于1997年一個OMG標(biāo)準(zhǔn),它是一個支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言,為軟件開發(fā)的所有階段提供模型化和可視化支持,包括由需求分析到規(guī)格,到構(gòu)造和配置。
UML可以看做用于系統(tǒng)設(shè)計階段給開發(fā)做參考的一種方式,其很多圖需要用到面向?qū)ο蟪绦虻乃季S。畫UML圖是產(chǎn)品經(jīng)理的必備技能之一。
廢話不多說,本文介紹一下最常見的幾個UML圖:類圖、用例圖、狀態(tài)圖、序列圖、活動圖,以及一個并不屬于UML,但也有很大作用的數(shù)據(jù)流圖。每張圖詳細介紹一下畫法、注意點和具體案例。相關(guān)的概念、元素等則簡單介紹。
一、類圖
類圖是UML圖中看起來最復(fù)雜的一個圖。它與數(shù)據(jù)庫和面向?qū)ο缶幊痰穆?lián)系比較緊密。沒學(xué)過面向?qū)ο蠡蛘邤?shù)據(jù)庫的同學(xué)剛開始畫類圖可能比較吃力。
一句話介紹一下類:類即相同屬性、操作、關(guān)系和語義的對象的描述。類的組成:屬性、操作。
類圖描述系統(tǒng)中類的靜態(tài)結(jié)構(gòu)。它的作用是定義系統(tǒng)中的類, 表示類之間的關(guān)系(關(guān)聯(lián), 依賴, 聚合等),描述類的內(nèi)部結(jié)構(gòu)(屬性, 方法等)。一個類長什么樣看下圖。

類圖有涉及到面向?qū)ο蟮闹R,在此不一一敘述。圖中有些看不懂的名詞請自行百度。
類之間通過關(guān)系連接起來。類圖中的關(guān)系很多,在此介紹最常見的關(guān)聯(lián)關(guān)系。關(guān)聯(lián)關(guān)系是一種擁有的關(guān)系,它使一個類知道另一個類的屬性和方法。關(guān)聯(lián)關(guān)系的類通過箭頭連接起來。
下面分析具體案例:公司圖書管理系統(tǒng),包括借書、還書、申請買書的操作。借書過程:員工發(fā)起借書申請,由行政人員去圖書館拿書給員工。還書買書類似。后面的圖也是用這個案例。

這幅圖就是借書系統(tǒng)的類圖。要簡化的話可以將可見性符號和屬性的類型省略。圖中的空心三角形應(yīng)該為箭頭。
員工、書、訂單三個類比較容易理解,代表了三個抽象的實體。借書類則是員工和書之間借書行為的一個抽象,連接了員工和書,記錄了借書這個狀態(tài)中的一些信息,以及借還書操作。買書同理。
列幾條類圖繪制的要點。
- 類的操作是針對類自身的操作,而不是它去操作人家。比如書這個類有上架下架的操作,是書自己被上架下架,不能因為上架下架是管理員的動作而把它放在管理員的操作里。
- 兩個相關(guān)聯(lián)的類,需要在關(guān)聯(lián)的類中加上被關(guān)聯(lián)類的ID,并且箭頭指向被關(guān)聯(lián)類??梢岳斫鉃閿?shù)據(jù)表中的外鍵。比如借書和書,借書需要用到書的信息,因此借書類需包含書的ID,箭頭指向書。
- 由于業(yè)務(wù)復(fù)雜性,一個顯示中的實體可能會被分為多個類,這是很正常的,類不是越少越好。類的設(shè)計取決于怎樣讓后臺程序的操作更加簡單。比如單看邏輯,借書類可以不存在,它的信息可以放在書這個類里。然而借還書的書的上架下架完全不是一回事,借書類對借書的操作更加方便,不需要去重復(fù)改動書這個類中的內(nèi)容。此外,如果書和借書是1對多的關(guān)系,那就必須分為兩個類。
- 類圖中的規(guī)范問題,比如不同關(guān)系需要不同的箭頭(本文只介紹了1種關(guān)系),可見性符號等。
二、用例圖
用例圖是最常見的一種圖。用例圖概括了用例中角色和系統(tǒng)之間的關(guān)系,描述了系統(tǒng)功能需求,角色和系統(tǒng)的交互以及系統(tǒng)的反應(yīng)。
用例圖有參與者、用例、關(guān)系組成。參與者就是系統(tǒng)中的用戶身份。用例是系統(tǒng)中的一個功能的概括。關(guān)系是參與者或者與用例的聯(lián)系。其中關(guān)系可以分為關(guān)聯(lián)、泛化、包含和擴展4種關(guān)系。關(guān)系的運用是用例圖最難的部分。4種關(guān)系的說明:
關(guān)聯(lián)是參與者和用例之間的關(guān)系,用箭頭;
- 泛化是參與者與用例或用例之間的關(guān)系,意思是特殊化。比如吃飯和吃晚飯。兩者的本質(zhì)是一樣的。符號用空心的三角形。箭頭為被指向。
- 包含是用例之間的關(guān)系,意思是一個用例包含另一個子用例。子用例是必須存在的,沒有子用例則功能不能完成。符號在箭頭的線上加<<include>>。箭頭為去指向。
- 擴展也是用例之間的關(guān)系,意思是一個用例可以擴展出一個子用例。與包含不同的是,這個子用例是不一定要存在的,沒有也一樣能完成功能。符號在箭頭線上加<<extend>>。箭頭為被指向。
還是上面那個圖書管理的案例

行政人員和員工是參與者,中間的這些是用例。這幅圖用例之間大部分都是包含關(guān)系,比如借書包括申請、查找、借閱這三個子用例,都是必須的。而圖書續(xù)借不是必須的,因此只是擴展的用例。批量購書是購書的一個特例,和購書本質(zhì)是相同的,因此作為泛化的關(guān)系。
繪制的注意點:
- 用例之間的關(guān)系,尤其是包含和泛化的區(qū)別,可以這樣區(qū)分,試著把包含的用例讓泛化的用例來包含后,看看是不是同樣成立
- 箭頭指向,泛化和擴展的指向和包含是反的
- 用例的表達是動詞+名詞的形式,只有一個動作或者名詞的不是用例。比如所有書籍,是否可借等表述就不是用例。
三、狀態(tài)圖
狀態(tài)圖是UML中相對比較簡單的一張圖,用得也沒前兩種圖多。狀態(tài)圖是描述一個實體基于事件反應(yīng)的動態(tài)行為,顯示了該實體所有可能的狀態(tài),以及事件發(fā)生時狀態(tài)的轉(zhuǎn)移條件。
總結(jié)一句話,狀態(tài)圖就是把類的狀態(tài)的改變連城一張圖。狀態(tài)圖的元素包括狀態(tài)、轉(zhuǎn)移和動作。元素的形式如下圖所示,黑點分別為起始點,矩形為狀態(tài),箭頭上時狀態(tài)改變的動作和事件。

狀態(tài)圖可以看做是類圖的補充,因為狀態(tài)本身就是類的狀態(tài)。狀態(tài)圖的繪制過程很簡單,只要先把類的狀態(tài)羅列,然后按順序連起來,最后寫上動作或條件即可。上圖中連接線上依次為事件、判斷條件和動作,簡化起來只要寫一個就行。
圖書館借書的狀態(tài)圖如下圖所示。
圖書的狀態(tài)為在館、被借閱、借出等,該狀態(tài)圖就是把狀態(tài)連接起來。
狀態(tài)圖的注意點:
- 狀態(tài)圖不是流程圖!連起來的是狀態(tài)不是動作!看似簡單但很多人第一次繪制都會把狀態(tài)圖畫成流程圖類物質(zhì)。比如上圖中,提交申請、借書等都不是狀態(tài),只能作為動作在連接線上出現(xiàn)。
- 狀態(tài)圖的狀態(tài)是系統(tǒng)中類的狀態(tài),現(xiàn)實中發(fā)生但與系統(tǒng)無關(guān)的情況都不能被算作是狀態(tài)。比如書被查找中,被翻閱中等現(xiàn)實里的狀態(tài),并沒有系統(tǒng)的操作,因此不是狀態(tài)。
四、序列圖
序列圖是用來描述對象之間消息發(fā)送的先后次序,闡明對象之間的交互過程以及系統(tǒng)執(zhí)行過程某一具體時刻將會發(fā)生什么事件。抽象地概括,序列圖就是把主體之間傳遞消息的操作以及消息本身按順序排列出來。
序列圖的元素包括對象、生命線、控制焦點、消息。每個元素的樣式如下圖所示。

序列圖的消息主要分為3種,調(diào)用(同步),發(fā)送(異步),和返回。同步調(diào)用消息是指發(fā)送者把控制傳遞給接收者,然后停止活動,等待消息返回。它是一種即時的關(guān)系,返回消息需要直接放在這條消息之后。用實心的三角形表示(如上圖的第一條線)。
異步發(fā)送消息是指發(fā)送者把消息發(fā)送過去后,繼續(xù)自己的活動,不需要等待消息返回來。返回消息可以在幾個過程之后。用半個箭頭表示(指留下上半個箭頭)。
返回消息就是上述兩種消息調(diào)用后所返回的消息,用虛線和普通的箭頭顯示,如上圖。
當(dāng)然,一般不需要返回的消息用普通箭頭就可以。
圖書館借書的序列圖如下所示。
從員工發(fā)起借書申請到借書成功的信息。對象之間的交互包括借書申請、查找、借書操作等。查找書和借書操作需要直接從系統(tǒng)返回消息。

序列圖的注意點:
- 第一個對象是某操作者,第一步肯定是與系統(tǒng)進行交互。如果畫詳細點的話可以再加個界面,第一步與界面交互,再界面與系統(tǒng)交互。
- 確定哪些情況要同步或者異步的返回信息。返回信息必須是與發(fā)送消息的對象一致,方向相反。
- 主體有對象和參與者兩種情況,對象和參與者要區(qū)別表示。員工就是參與者,系統(tǒng)是對象。
- 畫圖規(guī)范問題,在交互過程中要有連續(xù)的控制焦點,不能中斷也不能沒有。
五、活動圖
活動圖是展示業(yè)務(wù)用例實現(xiàn)的工作流程,描述活動活動的順序,展現(xiàn)從一個活動到另一個活動的控制流,強調(diào)每一步動作和產(chǎn)生的結(jié)果。也就是說,活動圖將系統(tǒng)的活動連接起來,是流程圖的詳細化。
活動圖的元素有動作狀態(tài)、動作流、對象、對象流、分支合并,泳道等?;顒訄D的元素比較豐富,直接用圖書館的案例來分析。

三塊是泳道,分別是不同的對象。黑圓點是開始和結(jié)束,中間是活動和順序。矩形是活動中需要涉及到的對象。粗線和菱形是合并分叉的標(biāo)志。
整個系統(tǒng)的業(yè)務(wù)流程如活動的順序所示。發(fā)起借書申請時需要傳遞借書申請這個對象,因此需要添加對象。查找圖書后的菱形分叉表示判斷,分出兩個不同的活動。粗線后的兩個活動表示都在借書申請后一步執(zhí)行。
活動圖的注意點:
- 菱形和粗線(分叉)很容易錯誤。粗線分叉是和的關(guān)系,表示都要做,菱形是或的關(guān)系,表示二選一,分開與合并都是這樣,不要搞錯
- 一個活動只能唯一出現(xiàn)在一個泳道,不能跨泳道。對象可以跨泳道。
- 所有活動必須連線,而對象是輔助的作用,去掉對象也要保證所有活動連線。
- 規(guī)范問題,比如開始和結(jié)束的標(biāo)記不能漏
六、數(shù)據(jù)流圖
數(shù)據(jù)流圖雖然并不是UML圖,然而同樣很重要,而且畫圖的難度比較大。數(shù)據(jù)流圖簡稱DFD,它從數(shù)據(jù)傳遞和加工角度,以圖形方式來表達系統(tǒng)的邏輯功能、數(shù)據(jù)在系統(tǒng)內(nèi)部的邏輯流向和邏輯變換過程。簡單的說,就是數(shù)據(jù)的流程圖。
數(shù)據(jù)流圖的元素有外部實體、數(shù)據(jù)加工、數(shù)據(jù)存儲和數(shù)據(jù)流,如下圖所示。

數(shù)據(jù)流圖的原理,就是把每個數(shù)據(jù)加工按照順序用數(shù)據(jù)流連起來。系統(tǒng)外部輸入和輸出的數(shù)據(jù)則用外部實體來表達。每一步加工需要用到的數(shù)據(jù)存儲,或者生成的數(shù)據(jù)存儲,都用數(shù)據(jù)存儲來表示。每個數(shù)據(jù)加工都需要按序號命名。
由于系統(tǒng)數(shù)據(jù)的復(fù)雜性,不可能將所有數(shù)據(jù)操作畫在一張數(shù)據(jù)流圖上。需要進行分層操作,先畫整體的數(shù)據(jù)流圖即頂層圖,再逐步細化,分為好幾張圖。
圖書館借書的數(shù)據(jù)流圖如下:
頂層圖:

0層圖

由于系統(tǒng)比較簡單,因此一共只有兩層圖。頂層是整個系統(tǒng)和外部的數(shù)據(jù)交換狀態(tài),底層是詳細的數(shù)據(jù)流動。數(shù)據(jù)加工分為三塊,借書申請檢查,圖書查找和圖書借閱。借書申請由員工提交,合格的申請發(fā)給管理員。
底層圖的加工用1、2等數(shù)字命名。如果0層圖后還有1層圖,則用1.1,2.1來命名。如果有1層圖,則需要分多張,如上圖中的加工有1、2、3,則1層圖要分3張,分別描繪這三步加工的詳細步驟。
數(shù)據(jù)流圖的注意點:
- 所有步驟都是數(shù)據(jù)的流動,不要把現(xiàn)實中實體的流動畫進去。比如書,把書給員工,就不是系統(tǒng)中數(shù)據(jù)的流動,因此不能畫進去。
- 外部實體之間不能有數(shù)據(jù)傳輸,不能在員工和管理員之間直接畫箭頭。
- 頂層系統(tǒng)只能有1個數(shù)據(jù)加工,然后一個個展開來,不能在頂層圖畫兩個或以上的數(shù)據(jù)加工。
- 頂層系統(tǒng)的輸入、輸出數(shù)據(jù),應(yīng)該和所有底層系統(tǒng)的輸入輸出數(shù)據(jù)一致,不能多出來或少。比如上圖頂層圖中員工的借書申請,管理員的合格申請,在所有底層圖中有且只能有這些數(shù)據(jù),不能在員工和管理員的數(shù)據(jù)流中多出一個數(shù)據(jù)。
- 如果一層有多幅圖,每幅圖之間的數(shù)據(jù)要能夠銜接起來。比如2圖書查找和3圖書借閱都有自己的子流程,那么2圖書查找的數(shù)據(jù)流圖結(jié)束后,就必須輸出圖書信息,3圖書借閱的數(shù)據(jù)流圖也必須要用到2傳遞的圖書信息。這點原理和上一點一樣。
就寫這么多。上述的案例是根據(jù)自身的業(yè)務(wù)來制定的,每個圖的案例也有一些地方會不夠完善。
本文由 @潘帕斯雄鷹 原創(chuàng)投稿,并經(jīng)人人都是產(chǎn)品經(jīng)理編輯。未經(jīng)許可,禁止轉(zhuǎn)載。
你們看得到里面的圖嗎?我這打開都裂了
Uml圖詳解
如果做過開發(fā)、了解面向?qū)ο缶幊汤斫膺@些很簡單,但是現(xiàn)在做產(chǎn)品設(shè)計時基本上不用這些了?原型+泳道圖+高質(zhì)量的PRD交付給開發(fā)即可
嗯。。簡單易懂!不錯,對于to B而言,針對業(yè)務(wù)邊界和需求梳理都是利器了,甚至可以細化到字段、操作、事件、返回值這種顆粒度。以前就畫流程圖了,然后一直叭叭叭的一遍一遍的講,寫很多注釋。我覺得可以解放了,哈哈!我比較懶!不太愛寫文字注釋!
看懵了
mark,看了前三個,明天繼續(xù)。
想問下這些都要用什么工具來畫?
visio
很多根據(jù)都可以,共同協(xié)作用Visio最好,你自己梳理,Axure、excel、甚至畫圖都可以
我只想說現(xiàn)在做產(chǎn)品設(shè)計 還需要畫這些圖嗎? ??
寫的不錯,但是過于簡單,如果實例列舉如微信,OFO,京東商品詳情頁等這些常用的會更好。
邏輯性缺失
能否詳細說明?
??
講得很好,只是舉的借書例子不好,所以看起來復(fù)雜
頗為復(fù)雜
贊