溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

UML包圖中的包引入和包合并講解

發(fā)布時(shí)間:2021-09-16 17:00:03 來(lái)源:億速云 閱讀:171 作者:chen 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“UML包圖中的包引入和包合并講解”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1包引入

包引入(packageimport,參見(jiàn)USS的7.3.39節(jié))是一種允許采用非限定性名稱(chēng)訪問(wèn)來(lái)自于另一個(gè)命名空間中的元素的關(guān)系。假如我們有一個(gè)包A和一個(gè)包B,如果包A沒(méi)有引入包B,那么包A在訪問(wèn)包B時(shí),必須采用限定性名,比如B::Integer。當(dāng)包A引入了包B以后,則可以采用非限定性名稱(chēng)進(jìn)行訪問(wèn),此時(shí)A可以直接用Integer來(lái)訪問(wèn)包B中的Integer。對(duì)于包的引入,其如同C++語(yǔ)言中的usingnamespace關(guān)鍵字,也如同于Java語(yǔ)言中的import關(guān)鍵字。

圖1是包引入在UML規(guī)范中的語(yǔ)法定義,從圖中你可以看出它包含一個(gè)importingNamespace和一個(gè)importedPackage,其意思是將importedPackage引入到importingNamespace。此外,我們可以看出PackageImport“是一個(gè)”直接關(guān)系。還需注意的是PackageImport包含一個(gè)visibility屬性用于表示包引入關(guān)系的可見(jiàn)性。在UML規(guī)范中定義了這一屬性值可以是public或是private。其含義是:如果一個(gè)包引入可見(jiàn)性是public,那么,被引入的包可以被命名空間之外的其它元素訪問(wèn);如果一個(gè)包引入可見(jiàn)性是private,那么被引入的包只能被命名空間中的元素訪問(wèn),而命名空間外的元素不能訪問(wèn)。這與我們編成語(yǔ)言中的public和private的含意是一樣的。

UML包圖中的包引入和包合并講解

圖1包引入在UML規(guī)范中的語(yǔ)法

圖2是包引入的一個(gè)例子,其中也示例了包引入關(guān)系在UML中的表示方法。可以看出包引入關(guān)系與依賴(lài)關(guān)系的表示方法是相同的。在包引入的表示方法中,帶有箭頭一側(cè)的包被引入到?jīng)]有箭頭一側(cè)的包中,這可以從圖1中的語(yǔ)法定義看出,因?yàn)閕mportedPackage是target。你可能要問(wèn),圖1中只定義了包引入是將一個(gè)包引入到命名空間中,但圖2中卻是將包引入到包中,這樣對(duì)嗎?還記得《UML包圖中的包和命名空間》中所提及的包在UML中的語(yǔ)法定義嗎?因?yàn)榘菑拿羁臻g繼承來(lái)的,也就是說(shuō)包“是一個(gè)”命名空間!

UML包圖中的包引入和包合并講解

圖2包引入的一個(gè)例子

前面所說(shuō)的包引入的可見(jiàn)性分為public和private,在UML中分別采用不通的圖型(sterotype)來(lái)區(qū)分。public對(duì)應(yīng)<<import>>圖型,而private對(duì)應(yīng)<<access>>圖型,這一點(diǎn)在圖2中也有示例。從圖2中我們可以看出,ShoppingCart包引入了Auxiliary包和Types包,當(dāng)引入了以后在ShoppingCart包中可以直接采用非限定性名對(duì)兩個(gè)引入包中的元素進(jìn)行訪問(wèn)。此外,Types包還可以被ShoppingCart包之外的元素訪問(wèn),因?yàn)槠湟腙P(guān)系的可見(jiàn)性是public,也就是說(shuō)WebShop包引入了ShoppingCart包后,也可以直接采用非限定性名訪問(wèn)Types包中的元素。由于Auxiliary包引入到ShoppingCart包的可見(jiàn)性是private,所以,雖然WebShop引入了ShoppingCart包,但并不能采用非限定性名訪問(wèn)Auxiliary包。當(dāng)然,WebShop包仍然采用Auxiliary::xyz這樣的限定性名訪問(wèn)Auxiliary包中的元素。我們還可以理解為,<<import>>關(guān)系是可傳遞的,但<<access>>關(guān)系則不可以。

2包合并

UML包圖中包合并(packagemerge,參見(jiàn)USS的7.3.40節(jié))定義了一個(gè)包的內(nèi)容是如何被另一個(gè)包擴(kuò)展的關(guān)系。包合并關(guān)系表示將兩個(gè)包的內(nèi)容合并在一起從而得到一個(gè)新的合并包,當(dāng)然,這種合并關(guān)系也隱含了對(duì)被合并包的擴(kuò)展。圖3列出了UML規(guī)范中包合并關(guān)系的語(yǔ)法。

UML包圖中的包引入和包合并講解 
圖3UML規(guī)范中可打包元素的語(yǔ)法

圖4是使用包合并的一個(gè)例子,包合并關(guān)系在UML圖中的表示與依賴(lài)關(guān)系是一樣的。從圖3中的語(yǔ)法可以看出箭頭(target)所指向的包是被合并的包。圖4中我們能看到三個(gè)包,即Merged包、Merging包和Importing包。我們還可以看到Merging包將Merged包合并了,以及Importing包引入了Merging包。三個(gè)包中都有一個(gè)A類(lèi),這里的A類(lèi)只是為了說(shuō)明方便,其實(shí),包中可以有其它的元素,那三個(gè)包中的A類(lèi)在合并前后有什么關(guān)系呢?

UML包圖中的包引入和包合并講解

圖4包合并的一個(gè)例子

為了方便理解這一問(wèn)題,請(qǐng)看圖5。UML包圖的包合并中的加號(hào)表示的是合并這個(gè)操作,等號(hào)的左邊表示合并之前,而等號(hào)的右邊表示合并之后。在合并之前,我們可以看出Merged::A和Merging::A分別是一個(gè)扇形,但合并之后Merging::A就變成了一個(gè)圓,因?yàn)镸erged包被合并進(jìn)了Merging包,這個(gè)合并操作是站在Merging包的角度來(lái)看的。從Merged包的角度來(lái)看,不論是合并前或是后,都是一個(gè)扇形,這還是比較好理解的,因?yàn)樗仟?dú)立的,并沒(méi)有合并其它的包。對(duì)于Merging包我們還可以這樣理解,在合并之前,無(wú)論是從包里頭看還是從包外頭看都是一個(gè)扇形。但在合并之后,從里面看來(lái)A還是一個(gè)扇形,但從外面來(lái)看卻是一個(gè)圓。

UML包圖中的包引入和包合并講解

圖5

有了上面對(duì)于包合并的理解后,我們就不難理解Importing包中的A了,顯然它是一個(gè)圓,是從Merging包的外部來(lái)看引入的A。

3總結(jié)

包引入這一關(guān)系是為了讓一個(gè)命名空間能更方便的引用另一個(gè)包中的元素,其方便性在于對(duì)于引入的包中的元素可以采用非限定性名的訪問(wèn)方式進(jìn)行訪問(wèn)。包合并關(guān)系概念的引入是為了建模包的增量式擴(kuò)展,即我們可以在已有的一個(gè)包上通過(guò)包合并從而得到一個(gè)功能更加完整或是強(qiáng)大的新包。為了讀懂UML規(guī)范,我們需要對(duì)包引入和包合并有很好的了解。

“UML包圖中的包引入和包合并講解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

uml
AI