1、基本認(rèn)識(shí)
- UML——Unified modeling language UML (統(tǒng)一建模語(yǔ)言)臣樱, 是一種用于軟件系統(tǒng)分析和設(shè)計(jì)的語(yǔ)言工具兆龙,它用
于幫助軟件開(kāi)發(fā)人員進(jìn)行思考和記錄思路的結(jié)果 - UML 本身是一套符號(hào)的規(guī)定,就像數(shù)學(xué)符號(hào)和化學(xué)符號(hào)一樣,這些符號(hào)用于描述軟件模型中的各個(gè)元素和他
們之間的關(guān)系粹排,比如類、接口伟葫、實(shí)現(xiàn)恨搓、泛化、依賴筏养、組合斧抱、聚合等
可以簡(jiǎn)單分為三類:
- 用例圖(use case)
- 靜態(tài)結(jié)構(gòu)圖:類圖、對(duì)象圖渐溶、包圖辉浦、組件圖、部署圖
- 動(dòng)態(tài)行為圖:交互圖(時(shí)序圖與協(xié)作圖)茎辐、狀態(tài)圖宪郊、活動(dòng)圖
2、UML類圖
類圖是UML圖中的一種,描述類與類之間的關(guān)系:
- 用于描述系統(tǒng)中的類(對(duì)象)本身的組成和類(對(duì)象)之間的各種靜態(tài)關(guān)系拖陆。
2)類之間的關(guān)系: 依賴弛槐、泛化(繼承)、實(shí)現(xiàn)依啰、關(guān)聯(lián)乎串、聚合與組合。.
關(guān)系圖:
相關(guān)符號(hào):
2.1 依賴
只要在類中用到了對(duì)方速警,他們之間就產(chǎn)生了依賴關(guān)系
產(chǎn)生依賴:
- 類中用到了對(duì)方
2)如果是類的成員屬性
.
3)如果是方法的返回類型
4)是方法接收的參數(shù)類型
5)方法中使用到
依賴圖:
2.2叹誉、泛化
泛化關(guān)系實(shí)際上就是繼承關(guān)系
2.3 、實(shí)現(xiàn)
實(shí)現(xiàn)關(guān)系就是類實(shí)現(xiàn)接口
2.3闷旧、關(guān)聯(lián)
關(guān)聯(lián)關(guān)系實(shí)際上就是類
與類
之間的聯(lián)系长豁,他是依賴關(guān)系
的特例
關(guān)聯(lián)具有導(dǎo)航性:即雙向關(guān)系或單向關(guān)系,
關(guān)系具有多重性:一對(duì)一
忙灼,一對(duì)多
匠襟,多對(duì)多
2.4、聚合
聚合關(guān)系(Aggregation) 表示的是整體和部分的關(guān)系,整體與部分可以分開(kāi)宅此。聚合關(guān)系是關(guān)聯(lián)關(guān)系的特例机错,所
以他具有關(guān)聯(lián)的導(dǎo)航性與多重性爬范。
如:一臺(tái)電腦由鍵盤(keyboard)父腕、顯示器(monitor),鼠標(biāo)等組成;組成電腦的各個(gè)配件是可以從電腦上分離出來(lái)
的青瀑,使用帶空心菱形的實(shí)線來(lái)表示: .
** 2.5璧亮、組合**
組合關(guān)系:也是整體與部分的關(guān)系,但是整體與部分不可以分開(kāi)斥难。
如:筆記本的cpu等組件枝嘶,一出廠就自帶。
1哑诊、為什么需要類圖群扶?類圖的作用
我們做項(xiàng)目的需求分析,最開(kāi)始往往得到的是一堆文字镀裤,請(qǐng)看下面這堆文字:
本項(xiàng)目是在一期的基礎(chǔ)上增加對(duì)電纜竞阐、通訊工程的管理和施工詳細(xì)數(shù)據(jù)的記錄和統(tǒng)計(jì),使整個(gè)系統(tǒng)更好的管理各工程項(xiàng)目從中標(biāo)開(kāi)始到竣工驗(yàn)收的全部過(guò)程和資料和分析施工過(guò)程的數(shù)據(jù)暑劝。
本系統(tǒng)將一條或一個(gè)標(biāo)段的架空電力線路工程定為一個(gè)單位工程骆莹,即系統(tǒng)中的一個(gè)工程項(xiàng)目;每個(gè)單位工程分為若干個(gè)分部工程担猛;每個(gè)分部工程分為若干個(gè)分項(xiàng)工程幕垦;每個(gè)分項(xiàng)工程中又分為若干相同單元工程。
這是關(guān)于系統(tǒng)情況的一段概述傅联,里面充斥了大量的術(shù)語(yǔ)先改、概念,如果你不是專業(yè)人士蒸走,恐怕難以讀懂上述文字仇奶。
項(xiàng)目初期,我們往往對(duì)業(yè)務(wù)一無(wú)所知载碌,我們最急迫需要解決的問(wèn)題就是理清楚這些業(yè)務(wù)概念以及它們的關(guān)系猜嘱,如果能用好類圖,你將能深入地剖析系統(tǒng)業(yè)務(wù)嫁艇。
用下面這個(gè)UML圖來(lái)描述是否清晰了許多呢朗伶?
在上圖中,各個(gè)類之間是關(guān)聯(lián)關(guān)系步咪,也就是擁有的關(guān)系论皆。
類圖(Class diagram)主要用于描述系統(tǒng)的結(jié)構(gòu)化設(shè)計(jì)。類圖也是最常用的UML圖,用類圖可以顯示出類点晴、接口以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系感凤。
2、怎么畫類圖粒督?用什么工具陪竿?
使用工具:Visio或者processon在線作圖
在類圖中一共包含了以下幾種模型元素,分別是:類(Class)屠橄、接口(Interface)以及類之間的關(guān)系族跛。
2.1 類(Class)
在面向?qū)ο螅∣O) 編程中,類是對(duì)現(xiàn)實(shí)世界中一組具有相同特征的物體的抽象锐墙。
2.2 接口(Interface)
接口是一種特殊的類礁哄,具有類的結(jié)構(gòu)但不可被實(shí)例化,只可以被實(shí)現(xiàn)(繼承)溪北。在UML中桐绒,接口使用一個(gè)帶有名稱的小圓圈來(lái)進(jìn)行表示。
2.3之拨、類圖中關(guān)系(relation)
在UML類圖中茉继,常見(jiàn)的有以下幾種關(guān)系: 泛化(Generalization), 實(shí)現(xiàn)(Realization),關(guān)聯(lián)(Association)敦锌,聚合(Aggregation)馒疹,組合(Composition),依賴(Dependency)
1. 泛化(Generalization)
【泛化關(guān)系】:是一種繼承關(guān)系乙墙,表示一般與特殊的關(guān)系颖变,它指定了子類如何特化父類的所有特征和行為。
例如:老虎是動(dòng)物的一種听想,即有老虎的特性也有動(dòng)物的共性腥刹。
【箭頭指向】:帶三角箭頭的實(shí)線,箭頭指向父類
2. 實(shí)現(xiàn)(Realization)
【實(shí)現(xiàn)關(guān)系】:是一種類與接口的關(guān)系汉买,表示類是接口所有特征和行為的實(shí)現(xiàn).
【箭頭指向】:帶三角箭頭的虛線衔峰,箭頭指向接口
3. 關(guān)聯(lián)(Association)
【關(guān)聯(lián)關(guān)系】:是一種擁有的關(guān)系,它使一個(gè)類知道另一個(gè)類的屬性和方法蛙粘;如:老師與學(xué)生垫卤,
丈夫與妻子關(guān)聯(lián)可以是雙向的,也可以是單向的出牧。
雙向的關(guān)聯(lián)可以有兩個(gè)箭頭或者沒(méi)有箭頭穴肘,單向的關(guān)聯(lián)有一個(gè)箭頭。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶普通箭頭的實(shí)心線舔痕,指向被擁有者
上圖中评抚,老師與學(xué)生是雙向關(guān)聯(lián)豹缀,老師有多名學(xué)生,學(xué)生也可能有多名老師慨代。
但學(xué)生與某課程間的關(guān)系為單向關(guān)聯(lián)耘柱,一名學(xué)生可能要上多門課程娇唯,課程是個(gè)抽象的東西他不擁有學(xué)生组去。
下圖為自身關(guān)聯(lián):
4. 聚合(Aggregation)
【聚合關(guān)系】:是整體與部分的關(guān)系潮饱,且部分可以離開(kāi)整體而單獨(dú)存在寓辱。
如車和輪胎是整體和部分的關(guān)系笤受,輪胎離開(kāi)車仍然可以存在弊添。
聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種惠拭,是強(qiáng)的關(guān)聯(lián)關(guān)系;關(guān)聯(lián)和聚合在語(yǔ)法上無(wú)法區(qū)分江滨,必須考察具體的邏輯關(guān)系。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶空心菱形的實(shí)心線厌均,菱形指向整體
5. 組合(Composition)
【組合關(guān)系】:是整體與部分的關(guān)系唬滑,但部分不能離開(kāi)整體而單獨(dú)存在。
如公司和部門是整體和部分的關(guān)系棺弊,沒(méi)有公司就不存在部門晶密。
組合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系還要強(qiáng)的關(guān)系模她,
它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分的對(duì)象的生命周期稻艰。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶實(shí)心菱形的實(shí)線,菱形指向整體
6. 依賴(Dependency)
【依賴關(guān)系】:是一種使用的關(guān)系侈净,即一個(gè)類的實(shí)現(xiàn)需要另一個(gè)類的協(xié)助尊勿,
所以要盡量不使用雙向的互相依賴.
【代碼表現(xiàn)】:局部變量、方法的參數(shù)或者對(duì)靜態(tài)方法的調(diào)用
【箭頭及指向】:帶箭頭的虛線畜侦,指向被使用者
各種關(guān)系的強(qiáng)弱順序:
泛化 = 實(shí)現(xiàn) > 組合 > 聚合 > 關(guān)聯(lián) > 依賴
下面這張UML圖元扔,比較形象地展示了各種類圖關(guān)系:
類圖繪制的要點(diǎn)
1.類的操作是針對(duì)類自身的操作,而不是它去操作人家旋膳。比如書這個(gè)類有上架下架的操作澎语,是書自己被上架下架,不能因?yàn)樯霞芟录苁枪芾韱T的動(dòng)作而把它放在管理員的操作里验懊。
2.兩個(gè)相關(guān)聯(lián)的類擅羞,需要在關(guān)聯(lián)的類中加上被關(guān)聯(lián)類的ID,并且箭頭指向被關(guān)聯(lián)類义图〖跚危可以理解為數(shù)據(jù)表中的外鍵。比如借書和書歌溉,借書需要用到書的信息垄懂,因此借書類需包含書的ID骑晶,箭頭指向書。
3.由于業(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è)類公给。
4.類圖中的規(guī)范問(wèn)題,比如不同關(guān)系需要不同的箭頭蜘渣,可見(jiàn)性符號(hào)等淌铐。
3、類圖的分類
軟件在分析與設(shè)計(jì)兩個(gè)階段各自會(huì)繪制一套UML類圖蔫缸,而且是由分析師和設(shè)計(jì)師兩個(gè)不同的角色繪制的腿准。那么這兩套UML類圖有什么異同呢?下面將解釋這個(gè)問(wèn)題拾碌。
領(lǐng)域UML類圖vs實(shí)現(xiàn)UML類圖
上文提到吐葱,在軟件分析與設(shè)計(jì)過(guò)程中,會(huì)由兩種角色產(chǎn)生兩套UML類圖倦沧。一般情況下唇撬,分析師繪制的UML類圖叫做“領(lǐng)域UML類圖”,而設(shè)計(jì)師繪制的UML類圖叫做“實(shí)現(xiàn)UML類圖”展融。這里要聲明窖认,這兩個(gè)名詞是我的習(xí)慣性叫法,并不是大家都認(rèn)同的通用叫法告希。下面扑浸,我對(duì)這兩種UML類圖給出我的定義:
領(lǐng)域UML類圖:產(chǎn)生于分析階段,由系統(tǒng)分析師繪制燕偶,主要作用是描述業(yè)務(wù)實(shí)體的靜態(tài)結(jié)構(gòu)喝噪,包括業(yè)務(wù)實(shí)體、各個(gè)業(yè)務(wù)實(shí)體所具有的業(yè)務(wù)屬性及業(yè)務(wù)操作指么、業(yè)務(wù)實(shí)體之間具有的關(guān)系酝惧。
雖然這個(gè)UML類圖也叫“UML類圖”榴鼎,但是說(shuō)實(shí)話,它和編程中的“類”實(shí)在是沒(méi)啥關(guān)系晚唇,因?yàn)樽詈蟮南到y(tǒng)中可能根本沒(méi)有類和它們對(duì)應(yīng)巫财,而且很多最后系統(tǒng)中的類如控制類和界面類這套UML類圖中也沒(méi)有。也就是說(shuō)這套圖和具體技術(shù)無(wú)關(guān)哩陕,也不是畫給程序員看的平项,它只是表達(dá)業(yè)務(wù)領(lǐng)域中的一個(gè)靜態(tài)結(jié)構(gòu)。下面給個(gè)例子:
這是一個(gè)選課系統(tǒng)的簡(jiǎn)單領(lǐng)域分析UML類圖悍及∶銎埃可以看到,主要實(shí)體有教師心赶、學(xué)生扣讼、課程和開(kāi)課安排。每個(gè)實(shí)體標(biāo)注了其在業(yè)務(wù)上具有的屬性和方法园担。而且圖中還標(biāo)明了實(shí)體間的關(guān)系届谈。
但是,最終系統(tǒng)中可能沒(méi)有一個(gè)學(xué)生類和其對(duì)應(yīng)弯汰。因?yàn)樽罱K系統(tǒng)中有哪些類、各個(gè)類有什么屬性湖雹、方法依賴于所選擇的平臺(tái)和架構(gòu)咏闪。例如,如果使用了Struts2摔吏,則會(huì)存在很多Action類鸽嫂,而使用了ASP.NETMVC,則會(huì)有很多Controller類等征讲,所以据某,領(lǐng)域UML類圖只于業(yè)務(wù)有關(guān),和具體實(shí)現(xiàn)及編碼等計(jì)算機(jī)技術(shù)無(wú)關(guān)诗箍。
實(shí)現(xiàn)UML類圖:
實(shí)現(xiàn)UML類圖:產(chǎn)生于設(shè)計(jì)階段癣籽,由系統(tǒng)設(shè)計(jì)師繪制,其作用是描述系統(tǒng)的架構(gòu)結(jié)構(gòu)滤祖、指導(dǎo)程序員編碼筷狼。它包括系統(tǒng)中所有有必要指明的實(shí)體類、控制類匠童、界面類及與具體平臺(tái)有關(guān)的所有技術(shù)性信息埂材。
就像上面的領(lǐng)域UML類圖,如果你把它交給程序員編碼汤求,我想程序員會(huì)瘋掉俏险,因?yàn)樗鼪](méi)有提供任何編碼的依據(jù)严拒。假如我們使用的是.NET平臺(tái)分層架構(gòu),并使用ASP.NETMVC竖独,則設(shè)計(jì)師應(yīng)該在實(shí)現(xiàn)UML類圖中繪制出所有的實(shí)體類裤唠、數(shù)據(jù)訪問(wèn)類、業(yè)務(wù)邏輯類和界面類预鬓,界面類又分為視圖類巧骚、控制器類等等,還要表示出IoC和Aop等信息格二,并明確指出各個(gè)類的屬性劈彪、方法,不能有遺漏顶猜,因?yàn)樽罱K程序員實(shí)現(xiàn)程序的依據(jù)就是實(shí)現(xiàn)UML類圖沧奴。
總結(jié)
最后,我們總結(jié)一下要點(diǎn):
1.軟件分析與設(shè)計(jì)是編碼前的兩個(gè)階段长窄,其中分析僅與業(yè)務(wù)有關(guān)滔吠,而與技術(shù)無(wú)關(guān)。設(shè)計(jì)以分析為基礎(chǔ)挠日,主要與具體技術(shù)有關(guān)疮绷。
2.分析階段由分析師繪制領(lǐng)域UML類圖,設(shè)計(jì)階段由設(shè)計(jì)師繪制實(shí)現(xiàn)UML類圖嚣潜。
3.領(lǐng)域UML類圖表示系統(tǒng)的靜態(tài)領(lǐng)域結(jié)構(gòu)冬骚,其中的類不與最終程序中的類對(duì)應(yīng);設(shè)計(jì)UML類圖表示系統(tǒng)的技術(shù)架構(gòu)懂算,是程序員的編碼依據(jù)只冻,其中的類與系統(tǒng)中的類對(duì)應(yīng)。
4.領(lǐng)域UML類圖中類的屬性與操作僅關(guān)注與業(yè)務(wù)相關(guān)的部分计技,實(shí)現(xiàn)UML類圖中的屬性與操作要包括最終需要實(shí)現(xiàn)的全部方法與操作喜德。