今天,本號(hào)將給各位伙伴們介紹一下UML中的包圖。
包是對(duì)UML中各模型元素進(jìn)行組織管理的一種機(jī)制,它把概念上相似、有關(guān)聯(lián)的模型元素(包括靜態(tài)的和動(dòng)態(tài)的)組織到一個(gè)包中,形成具有各種功能或用途的模塊,并可以控制包中元素的可見(jiàn)性,以方便人們更好的理解復(fù)雜的系統(tǒng)。
包圖由包之間的關(guān)系組成,通過(guò)包之間關(guān)系的描述來(lái)展現(xiàn)系統(tǒng)各個(gè)模塊之間的依賴(lài)關(guān)系。
它類(lèi)似于操作系統(tǒng)中的文件夾,因此,它在UML中也使用類(lèi)似的文件夾符號(hào)來(lái)表示。
在同一層級(jí)內(nèi),每個(gè)包應(yīng)有一個(gè)與其它包不同的名稱(chēng)。
包的名稱(chēng)有兩種形式:
(1)簡(jiǎn)單名稱(chēng)(Simple Name)
簡(jiǎn)單名稱(chēng)僅包含包的名稱(chēng)字符串,如下面的例子:
(2)路徑名稱(chēng)(Path Name)
在很多情況下,包內(nèi)又包含其它包,則在外圍使用包內(nèi)的某個(gè)包時(shí)可以使用路徑名稱(chēng)來(lái)指明包的路徑,其基本語(yǔ)法是:
外部包名稱(chēng)::本包名稱(chēng)
如下圖所示的情形:
上圖中表明“Borrow”這個(gè)包位于“SystemInterface”包內(nèi)。
但在Rose中使用了另外一種表示方法,即:本包名稱(chēng)(from外部包名稱(chēng))。
如下圖所示的情形:
其含義是“Borrow”包是來(lái)自“SystemInterface”包內(nèi)的。
包是一種分組機(jī)制,所以包內(nèi)可以包含UML中任何元素,如類(lèi)、用例、接口、組件、節(jié)點(diǎn)等,也可以包含其它包、用例圖、協(xié)作圖、序列圖等。
包中的元素可見(jiàn)性主要包含三種:
(1)公有的(public)
通過(guò)在元素前添加“+”符號(hào)來(lái)表示,則該元素對(duì)所有引入該包的元素可見(jiàn)。
(2)私有的(private)
通過(guò)在元素前添加“-”符號(hào)來(lái)表示,則該元素只能被同一個(gè)包內(nèi)的元素可見(jiàn)。
(3)保護(hù)的(protected)
通過(guò)在元素前添加“#”符號(hào)來(lái)表示,則該元素對(duì)繼承該包的包中元素可見(jiàn)。
下圖給出了包內(nèi)元素的三種可見(jiàn)性的表示方法:
上圖中的三個(gè)類(lèi)“class A”、"class B"和“class C”的可見(jiàn)性分別是公有的、私有的和保護(hù)的。
包之間的關(guān)系主要有依賴(lài)關(guān)系和泛化關(guān)系。
(1)依賴(lài)關(guān)系
包之間的依賴(lài)關(guān)系是指兩個(gè)包內(nèi)的若干元素之間存在著依賴(lài)。
依賴(lài)使用虛線(xiàn)箭頭表示。箭頭由依賴(lài)包指向被依賴(lài)的包。
下圖表示的是兩個(gè)包之間的依賴(lài)關(guān)系。
包之間的依賴(lài)關(guān)系可以是泛化、實(shí)現(xiàn)、導(dǎo)入等。
導(dǎo)入依賴(lài)(import dependency)是指允許一個(gè)包中的元素存取另外一個(gè)包中的元素,可以在虛線(xiàn)箭頭上添加<<import>>構(gòu)造型來(lái)表示。
在Rose中不支持給依賴(lài)添加構(gòu)造型。
導(dǎo)入依賴(lài)不具有傳遞性。
(2)泛化關(guān)系
包之間的泛化關(guān)系類(lèi)似于類(lèi)之間的泛化關(guān)系。
包之間的這種泛化關(guān)系是指其中的特殊包可以替換一般包中的元素,并可以添加新的元素。
在Rose中不支持給包添加泛化關(guān)系,實(shí)際上包之間的泛化也是一種依賴(lài)關(guān)系。
在Rose中,給出了包的一些構(gòu)造型,并使用不同的圖形或標(biāo)記來(lái)表示。
下圖給出了Rose中提供的一些包的構(gòu)造型。
在上圖中,從上到下,從左到右分別表示業(yè)務(wù)分析模型(Business Analysis Model)、業(yè)務(wù)系統(tǒng)(Buesiness System)、業(yè)務(wù)用例分析模型(Business Use Case Analysis Model)、域包(Domain Package)、層(Layer)和子系統(tǒng)(Subsystem)。
根據(jù)需要可以選擇相應(yīng)的構(gòu)造型,能夠快速識(shí)別出包的作用。
在實(shí)際建模中可以遵循以下原則:
(1)重用等價(jià)原則
對(duì)于同類(lèi)可重用的模型元素盡量放到一個(gè)包中,不要把可重用模型元素和不可重用的模型元素混到一個(gè)包中。
(2)共同重用原則
把同一個(gè)應(yīng)用要重用的多個(gè)模型元素放到同一個(gè)包中,以減少包間的依賴(lài),提高包的獨(dú)立性。
(3)共同封閉原則
把可能同時(shí)修改,同時(shí)維護(hù)的模型元素放到一個(gè)包中,以便于今后維護(hù)和升級(jí)。
(4)非循環(huán)依賴(lài)原則
包之間的依賴(lài)關(guān)系不要形成循環(huán):即不要出現(xiàn)A依賴(lài)B,B又依賴(lài)于A的現(xiàn)象,或者多個(gè)包形成循環(huán)依賴(lài)。
嚴(yán)格來(lái)講,包圖并不是真正意義上的UML圖,但在模型元素分類(lèi)、模型結(jié)構(gòu)和程序命名空間中扮演者重要的作用。
在實(shí)際建模過(guò)程中,可以使用下面的做法來(lái)繪制包圖:
(1)分析系統(tǒng)的模型元素,把概念上或語(yǔ)義上相近的模型元素納入到一個(gè)包中;
(2)對(duì)包中的每個(gè)元素標(biāo)識(shí)其可見(jiàn)性;
(3)確定包與包之間的依賴(lài)關(guān)系;
(4)繪制包圖,并對(duì)包圖進(jìn)行優(yōu)化。
在Rose中的用例視圖、邏輯視圖和組件視圖中都可以創(chuàng)建包。
(1)創(chuàng)建包
創(chuàng)建包可以通過(guò)以下三種方式來(lái)完成:
①使用菜單欄中的“Tools”(工具)->“Create”(新建)->“Package”(包)來(lái)創(chuàng)建一個(gè)包,選擇該菜單后,鼠標(biāo)形狀將變成“+”,這時(shí)在繪圖區(qū)的任意位置點(diǎn)擊一下,則完成了包的創(chuàng)建。
②在左側(cè)對(duì)象瀏覽器的某個(gè)節(jié)點(diǎn)上(如邏輯視圖),右擊該節(jié)點(diǎn),然后選擇“New”(新建)->“Package”(包),則完成了一個(gè)包的創(chuàng)建,如果要在繪圖中使用這個(gè)包,則直接把它拖拽到繪圖區(qū)即可。
③在對(duì)象瀏覽器和繪圖區(qū)中間的工具箱中選擇包工具后,在繪圖區(qū)中點(diǎn)擊一下即完成了一個(gè)包的創(chuàng)建。
Rose中,每創(chuàng)建一個(gè)包,都會(huì)在左側(cè)對(duì)象瀏覽器中創(chuàng)建一個(gè)文件夾節(jié)點(diǎn),所以,在Rose中,包更偏向于對(duì)模型的組織和分類(lèi)。
(2)包的重命名
在左側(cè)對(duì)象瀏覽器的包上右擊,然后選擇“Rename”則可以對(duì)包重新命名。
也可以在繪圖區(qū)的包上,右擊然后選擇“Open Specification...”,在彈出的如下圖所示的對(duì)話(huà)框中的“Name”項(xiàng)中對(duì)其重命名。
(3)設(shè)置包的構(gòu)造型
右擊一個(gè)包,然后在彈出的菜單中選擇“Open Specification...”,則打開(kāi)如下圖所示的對(duì)話(huà)框,在“Stereotype”的下拉列表中選擇Rose中已經(jīng)設(shè)定的一些構(gòu)造型。
用戶(hù)根據(jù)需要也可以直接在下拉列表中輸入構(gòu)造型的名稱(chēng)。
用戶(hù)輸入的構(gòu)造型,將以“<<用戶(hù)輸入的名稱(chēng)>>”的形式進(jìn)行顯示。
下面給出了用戶(hù)輸入的構(gòu)造型的情形。
(4)給包添加元素
用戶(hù)創(chuàng)建完包后,可以雙擊打開(kāi)包,在包中直接建立相關(guān)模型,如用例圖、狀態(tài)圖、活動(dòng)圖、類(lèi)圖等。
用戶(hù)也可以通過(guò)下面兩種方式為包添加元素。
①右擊包,然后選擇“Open Specification...”,在打開(kāi)的對(duì)話(huà)框中,選擇“Detail”選項(xiàng)卡,在下面的“Diagrams”中會(huì)列出包中已有的元素,用戶(hù)在列表中右擊,可以選擇插入新的建模圖形,創(chuàng)建的同時(shí)可以給新建的圖形命名。
如下圖所示:
完成創(chuàng)建并命名后的效果如下圖所示:
在上面的圖中,雙擊新建的元素標(biāo)題,就可以打開(kāi)它,并在里面進(jìn)行相關(guān)的建模。
②在左側(cè)瀏覽器中的對(duì)應(yīng)包節(jié)點(diǎn)上右擊,然后選擇“New”(新建),然后在下級(jí)菜單中選擇相應(yīng)的元素類(lèi)型即可。如下圖所示的情形。
(5)添加包之間的聯(lián)系
上面已經(jīng)說(shuō)過(guò),在Rose中,只支持包之間的依賴(lài)聯(lián)系,同時(shí)不支持給聯(lián)系添加構(gòu)造型。
如果添加依賴(lài)聯(lián)系,則在工具箱中選擇“Dependency”箭頭,從“依賴(lài)包”上點(diǎn)擊后按住鼠標(biāo)左鍵到“被依賴(lài)包”上松開(kāi)鼠標(biāo)后,即完成了一個(gè)依賴(lài)關(guān)系的建立。
下面給出包圖的兩個(gè)例子來(lái)說(shuō)明包圖的具體使用方法。
第一個(gè)例子反映的是在建模過(guò)程中各模型元素的組織情況,使用包按照系統(tǒng)分析設(shè)計(jì)的階段來(lái)組織各種模型。
下面的包圖例子描述了系統(tǒng)開(kāi)發(fā)中各元素的組織情況。
UI中包含了使用的各種用戶(hù)界面,BLL中包含了業(yè)務(wù)邏輯處理的各種類(lèi)或接口,DAL中包含了數(shù)據(jù)訪問(wèn)層的相關(guān)類(lèi),Common中存放的是系統(tǒng)各個(gè)模塊共用的一些組件或類(lèi)是內(nèi)容。
以上內(nèi)容介紹了UML中包圖的相關(guān)知識(shí)及在Rose中繪制包圖的方法,如有問(wèn)題,請(qǐng)留言說(shuō)明。
新聞熱點(diǎn)
疑難解答
圖片精選