1、基本認識
- UML——Unified modeling language UML (統(tǒng)一建模語言), 是一種用于軟件系統(tǒng)分析和設(shè)計的語言工具,它用
于幫助軟件開發(fā)人員進行思考和記錄思路的結(jié)果 - UML 本身是一套符號的規(guī)定,就像數(shù)學符號和化學符號一樣,這些符號用于描述軟件模型中的各個元素和他
們之間的關(guān)系,比如類、接口、實現(xiàn)、泛化、依賴、組合、聚合等
可以簡單分為三類:
- 用例圖(use case)
- 靜態(tài)結(jié)構(gòu)圖:類圖、對象圖、包圖、組件圖、部署圖
- 動態(tài)行為圖:交互圖(時序圖與協(xié)作圖)、狀態(tài)圖、活動圖
2、UML類圖
類圖是UML圖中的一種,描述類與類之間的關(guān)系:

- 用于描述系統(tǒng)中的類(對象)本身的組成和類(對象)之間的各種靜態(tài)關(guān)系。
2)類之間的關(guān)系: 依賴、泛化(繼承)、實現(xiàn)、關(guān)聯(lián)、聚合與組合。.
關(guān)系圖:

相關(guān)符號:

2.1 依賴
只要在類中用到了對方,他們之間就產(chǎn)生了依賴關(guān)系
產(chǎn)生依賴:
- 類中用到了對方
2)如果是類的成員屬性.
3)如果是方法的返回類型
4)是方法接收的參數(shù)類型
5)方法中使用到
依賴圖:

2.2、泛化
泛化關(guān)系實際上就是繼承關(guān)系
2.3 、實現(xiàn)
實現(xiàn)關(guān)系就是類實現(xiàn)接口
2.3、關(guān)聯(lián)
關(guān)聯(lián)關(guān)系實際上就是類與類之間的聯(lián)系,他是依賴關(guān)系的特例
關(guān)聯(lián)具有導(dǎo)航性:即雙向關(guān)系或單向關(guān)系,
關(guān)系具有多重性:一對一,一對多,多對多
2.4、聚合
聚合關(guān)系(Aggregation) 表示的是整體和部分的關(guān)系,整體與部分可以分開。聚合關(guān)系是關(guān)聯(lián)關(guān)系的特例,所
以他具有關(guān)聯(lián)的導(dǎo)航性與多重性。
如:一臺電腦由鍵盤(keyboard)、顯示器(monitor),鼠標等組成;組成電腦的各個配件是可以從電腦上分離出來
的,使用帶空心菱形的實線來表示: .

** 2.5、組合**
組合關(guān)系:也是整體與部分的關(guān)系,但是整體與部分不可以分開。
如:筆記本的cpu等組件,一出廠就自帶。

1、為什么需要類圖?類圖的作用
我們做項目的需求分析,最開始往往得到的是一堆文字,請看下面這堆文字:
本項目是在一期的基礎(chǔ)上增加對電纜、通訊工程的管理和施工詳細數(shù)據(jù)的記錄和統(tǒng)計,使整個系統(tǒng)更好的管理各工程項目從中標開始到竣工驗收的全部過程和資料和分析施工過程的數(shù)據(jù)。
本系統(tǒng)將一條或一個標段的架空電力線路工程定為一個單位工程,即系統(tǒng)中的一個工程項目;每個單位工程分為若干個分部工程;每個分部工程分為若干個分項工程;每個分項工程中又分為若干相同單元工程。
這是關(guān)于系統(tǒng)情況的一段概述,里面充斥了大量的術(shù)語、概念,如果你不是專業(yè)人士,恐怕難以讀懂上述文字。
項目初期,我們往往對業(yè)務(wù)一無所知,我們最急迫需要解決的問題就是理清楚這些業(yè)務(wù)概念以及它們的關(guān)系,如果能用好類圖,你將能深入地剖析系統(tǒng)業(yè)務(wù)。
用下面這個UML圖來描述是否清晰了許多呢?

在上圖中,各個類之間是關(guān)聯(lián)關(guān)系,也就是擁有的關(guān)系。
類圖(Class diagram)主要用于描述系統(tǒng)的結(jié)構(gòu)化設(shè)計。類圖也是最常用的UML圖,用類圖可以顯示出類、接口以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系。
2、怎么畫類圖?用什么工具?
使用工具:Visio或者processon在線作圖
在類圖中一共包含了以下幾種模型元素,分別是:類(Class)、接口(Interface)以及類之間的關(guān)系。
2.1 類(Class)
在面向?qū)ο螅∣O) 編程中,類是對現(xiàn)實世界中一組具有相同特征的物體的抽象。

2.2 接口(Interface)
接口是一種特殊的類,具有類的結(jié)構(gòu)但不可被實例化,只可以被實現(xiàn)(繼承)。在UML中,接口使用一個帶有名稱的小圓圈來進行表示。

2.3、類圖中關(guān)系(relation)
在UML類圖中,常見的有以下幾種關(guān)系: 泛化(Generalization), 實現(xiàn)(Realization),關(guān)聯(lián)(Association),聚合(Aggregation),組合(Composition),依賴(Dependency)
1. 泛化(Generalization)
【泛化關(guān)系】:是一種繼承關(guān)系,表示一般與特殊的關(guān)系,它指定了子類如何特化父類的所有特征和行為。
例如:老虎是動物的一種,即有老虎的特性也有動物的共性。
【箭頭指向】:帶三角箭頭的實線,箭頭指向父類

2. 實現(xiàn)(Realization)
【實現(xiàn)關(guān)系】:是一種類與接口的關(guān)系,表示類是接口所有特征和行為的實現(xiàn).
【箭頭指向】:帶三角箭頭的虛線,箭頭指向接口

3. 關(guān)聯(lián)(Association)
【關(guān)聯(lián)關(guān)系】:是一種擁有的關(guān)系,它使一個類知道另一個類的屬性和方法;如:老師與學生,
丈夫與妻子關(guān)聯(lián)可以是雙向的,也可以是單向的。
雙向的關(guān)聯(lián)可以有兩個箭頭或者沒有箭頭,單向的關(guān)聯(lián)有一個箭頭。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶普通箭頭的實心線,指向被擁有者

上圖中,老師與學生是雙向關(guān)聯(lián),老師有多名學生,學生也可能有多名老師。
但學生與某課程間的關(guān)系為單向關(guān)聯(lián),一名學生可能要上多門課程,課程是個抽象的東西他不擁有學生。
下圖為自身關(guān)聯(lián):

4. 聚合(Aggregation)
【聚合關(guān)系】:是整體與部分的關(guān)系,且部分可以離開整體而單獨存在。
如車和輪胎是整體和部分的關(guān)系,輪胎離開車仍然可以存在。
聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強的關(guān)聯(lián)關(guān)系;關(guān)聯(lián)和聚合在語法上無法區(qū)分,必須考察具體的邏輯關(guān)系。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶空心菱形的實心線,菱形指向整體

5. 組合(Composition)
【組合關(guān)系】:是整體與部分的關(guān)系,但部分不能離開整體而單獨存在。
如公司和部門是整體和部分的關(guān)系,沒有公司就不存在部門。
組合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系還要強的關(guān)系,
它要求普通的聚合關(guān)系中代表整體的對象負責代表部分的對象的生命周期。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶實心菱形的實線,菱形指向整體

6. 依賴(Dependency)
【依賴關(guān)系】:是一種使用的關(guān)系,即一個類的實現(xiàn)需要另一個類的協(xié)助,
所以要盡量不使用雙向的互相依賴.
【代碼表現(xiàn)】:局部變量、方法的參數(shù)或者對靜態(tài)方法的調(diào)用
【箭頭及指向】:帶箭頭的虛線,指向被使用者

各種關(guān)系的強弱順序:
泛化 = 實現(xiàn) > 組合 > 聚合 > 關(guān)聯(lián) > 依賴
下面這張UML圖,比較形象地展示了各種類圖關(guān)系:

類圖繪制的要點
1.類的操作是針對類自身的操作,而不是它去操作人家。比如書這個類有上架下架的操作,是書自己被上架下架,不能因為上架下架是管理員的動作而把它放在管理員的操作里。
2.兩個相關(guān)聯(lián)的類,需要在關(guān)聯(lián)的類中加上被關(guān)聯(lián)類的ID,并且箭頭指向被關(guān)聯(lián)類??梢岳斫鉃閿?shù)據(jù)表中的外鍵。比如借書和書,借書需要用到書的信息,因此借書類需包含書的ID,箭頭指向書。
3.由于業(yè)務(wù)復(fù)雜性,一個顯示中的實體可能會被分為多個類,這是很正常的,類不是越少越好。類的設(shè)計取決于怎樣讓后臺程序的操作更加簡單。比如單看邏輯,借書類可以不存在,它的信息可以放在書這個類里。然而借還書和書的上架下架完全不是一回事,借書類對借書的操作更加方便,不需要去重復(fù)改動書這個類中的內(nèi)容。此外,如果書和借書是1對多的關(guān)系,那就必須分為兩個類。
4.類圖中的規(guī)范問題,比如不同關(guān)系需要不同的箭頭,可見性符號等。
3、類圖的分類
軟件在分析與設(shè)計兩個階段各自會繪制一套UML類圖,而且是由分析師和設(shè)計師兩個不同的角色繪制的。那么這兩套UML類圖有什么異同呢?下面將解釋這個問題。
領(lǐng)域UML類圖vs實現(xiàn)UML類圖
上文提到,在軟件分析與設(shè)計過程中,會由兩種角色產(chǎn)生兩套UML類圖。一般情況下,分析師繪制的UML類圖叫做“領(lǐng)域UML類圖”,而設(shè)計師繪制的UML類圖叫做“實現(xiàn)UML類圖”。這里要聲明,這兩個名詞是我的習慣性叫法,并不是大家都認同的通用叫法。下面,我對這兩種UML類圖給出我的定義:
領(lǐng)域UML類圖:產(chǎn)生于分析階段,由系統(tǒng)分析師繪制,主要作用是描述業(yè)務(wù)實體的靜態(tài)結(jié)構(gòu),包括業(yè)務(wù)實體、各個業(yè)務(wù)實體所具有的業(yè)務(wù)屬性及業(yè)務(wù)操作、業(yè)務(wù)實體之間具有的關(guān)系。
雖然這個UML類圖也叫“UML類圖”,但是說實話,它和編程中的“類”實在是沒啥關(guān)系,因為最后的系統(tǒng)中可能根本沒有類和它們對應(yīng),而且很多最后系統(tǒng)中的類如控制類和界面類這套UML類圖中也沒有。也就是說這套圖和具體技術(shù)無關(guān),也不是畫給程序員看的,它只是表達業(yè)務(wù)領(lǐng)域中的一個靜態(tài)結(jié)構(gòu)。下面給個例子:

這是一個選課系統(tǒng)的簡單領(lǐng)域分析UML類圖??梢钥吹?,主要實體有教師、學生、課程和開課安排。每個實體標注了其在業(yè)務(wù)上具有的屬性和方法。而且圖中還標明了實體間的關(guān)系。
但是,最終系統(tǒng)中可能沒有一個學生類和其對應(yīng)。因為最終系統(tǒng)中有哪些類、各個類有什么屬性、方法依賴于所選擇的平臺和架構(gòu)。例如,如果使用了Struts2,則會存在很多Action類,而使用了ASP.NETMVC,則會有很多Controller類等,所以,領(lǐng)域UML類圖只于業(yè)務(wù)有關(guān),和具體實現(xiàn)及編碼等計算機技術(shù)無關(guān)。
實現(xiàn)UML類圖:
實現(xiàn)UML類圖:產(chǎn)生于設(shè)計階段,由系統(tǒng)設(shè)計師繪制,其作用是描述系統(tǒng)的架構(gòu)結(jié)構(gòu)、指導(dǎo)程序員編碼。它包括系統(tǒng)中所有有必要指明的實體類、控制類、界面類及與具體平臺有關(guān)的所有技術(shù)性信息。
就像上面的領(lǐng)域UML類圖,如果你把它交給程序員編碼,我想程序員會瘋掉,因為它沒有提供任何編碼的依據(jù)。假如我們使用的是.NET平臺分層架構(gòu),并使用ASP.NETMVC,則設(shè)計師應(yīng)該在實現(xiàn)UML類圖中繪制出所有的實體類、數(shù)據(jù)訪問類、業(yè)務(wù)邏輯類和界面類,界面類又分為視圖類、控制器類等等,還要表示出IoC和Aop等信息,并明確指出各個類的屬性、方法,不能有遺漏,因為最終程序員實現(xiàn)程序的依據(jù)就是實現(xiàn)UML類圖。
總結(jié)
最后,我們總結(jié)一下要點:
1.軟件分析與設(shè)計是編碼前的兩個階段,其中分析僅與業(yè)務(wù)有關(guān),而與技術(shù)無關(guān)。設(shè)計以分析為基礎(chǔ),主要與具體技術(shù)有關(guān)。
2.分析階段由分析師繪制領(lǐng)域UML類圖,設(shè)計階段由設(shè)計師繪制實現(xiàn)UML類圖。
3.領(lǐng)域UML類圖表示系統(tǒng)的靜態(tài)領(lǐng)域結(jié)構(gòu),其中的類不與最終程序中的類對應(yīng);設(shè)計UML類圖表示系統(tǒng)的技術(shù)架構(gòu),是程序員的編碼依據(jù),其中的類與系統(tǒng)中的類對應(yīng)。
4.領(lǐng)域UML類圖中類的屬性與操作僅關(guān)注與業(yè)務(wù)相關(guān)的部分,實現(xiàn)UML類圖中的屬性與操作要包括最終需要實現(xiàn)的全部方法與操作。