官术网_书友最值得收藏!

5.2 包圖

在UML中,對類進行分組時使用包。大多數面向對象的語言都提供了類似UML包的機制,用于組織及避免類間的名稱沖突。例如,Java中的包機制、C#中的命名空間。用戶可以使用UML包為這些結構建模。

5.2.1 包

包(Package)是UML中的主要結構,它是一種對模型元素進行成組組織的通用機制。它把語義上相近的可能一起變更的模型元素組織在同一個包中,方便理解復雜的系統,控制系統結構各部分間的接縫。

包是一個概念性的模型管理的圖形工具,只在軟件的開發過程中存在。包所提供的功能與Windows中的文件夾完全相同,它不僅僅有助于建模人員組織模型中的元素,而且也使建模人員能控制對包中內容的訪問。另外,包還具有高內聚、低耦合的特點。

包在UML中用類似文件夾符號表示的模型元素表示,系統中的每個元素都只能為一個包所有,一個包可以嵌套在另外一個包中。下面將從6個方面詳細介紹包。

1.包的名稱

包的圖標是由一個大矩形和其左上角帶一個小矩形組成的,每個包都必須有一個與其他包不同的名稱。包的名稱可以放在左上角的矩形內,也可以放在下面的大矩形中。

通常可以使用一個簡單的字符串或路徑名作為包的名稱。換句話說,包的名稱以其外包的包名作為前綴,其中使用兩個冒號分隔包的名稱。包的名稱可以由任意數目的字母、數字和標點符號組成。另外,在包名下可以使用括在花括號中的文字(約束)說明包的性質,如“{abstract}”和“{version}”。如下圖所示演示了包的名稱。

從上圖可以看出:如果包的內容沒有被顯示在大矩形中,那么可以把該包的名稱放在大矩形中;如果包的內容被顯示在大矩形中,那么可把該包的名稱放在左上角的小矩形中。

注意

在一個包中,不同種類的元素可以有相同的名稱,這樣在同一個包中對一個類命名為Name,對一個構件也可以命名為Name。但是,為了不造成混亂,最好一個包中的所有元素命名都是唯一的。

2.包所擁有的元素

包只是一種一般性的分組機制,在這個分組機制中可以放置UML類元,如類定義、用例定義、裝填定義和類元之間的關系等。在一個包中可以放置3種類型的元素,它們分別如下。

□ 包自身所擁有的元素,如類、接口、組件、節點和用例等。

□ 從另一個包中合并或導入的元素。

□ 另外一個包所訪問的元素。

3.包元素的可見性

包的可見性用來控制包外界的元素對包內的元素的訪問權限。一個包中的元素在包外的可見性,通過在元素名稱前加上一個可見性符號來指示。其可見性包括公有的、私有的和可保護的,它們分別使用“+”“-”和“#”來表示。具體說明如下。

□ + 對所有的包都是可見的。

□ - 只能對該包的子包是可見的。

□ # 對外包是不可見的。

在UML中,包內元素之間的可見性規則如下。

□ 一個包內定義的元素在同一個包內可見。

□ 如果某一個元素在一個包內可見,則它在所有嵌套在該包內的包中可見。

□ 如果一個包和另一個包之間存在<<access>>或<<import>>依賴關系,則后一個包內具有公共可見性的元素在前一個包內可見。

□ 如果一個包是另一個包的子包,則父包內具有公共可見性和保護可見性的元素在子包內可見。

4.包的嵌套

包可以擁有其他包作為包內的元素,子包又可以擁有自己的子包,這樣可以構成一個系統的嵌套結構。包的嵌套層數一般以2~3層為宜。嵌套的包與包之間也存在著可見性問題。具體說明如下。

□ 里層包中的元素既能訪問其外層包中定義的可見性為公共的元素,也能訪問其外層包通過訪問或引入依賴而得來的元素。

□ 一個包要訪問它的內部包的元素,就與內部包有引入、訪問關系或使用限定名。

□ 里層包中的元素的名稱會掩蓋外層包中的同名元素的名稱,在這種情況下需要用限定名引用外層包中的同名元素。

5.劃分和組織包

了解過包的知識后,下面主要介紹如何劃分和組織包。主要分為4個方面:識別低層包、合并或組織包、標識包中的模型和建立包間的關系。它們的具體說明如下。

□ 識別低層包 每個具有泛化關系或聚合關系的元素位于一個包中;關聯密集的類劃分到一個包;獨立的類暫時作為一個包。

□ 合并或組織包 如果低層包數量過多則把它們合并,或者使用高層包組織它們。組織包的層次時應該遵循兩個原則:層次不宜過多和包的劃分不是唯一的。

□ 標識包中的模型 對每一個包確定哪些元素在包外是可訪問的,把它們標記為公共的。把所有其他的元素標記為受保護的或私有的。

□ 建立包間的關系 根據需要在包之間建立引入依賴、訪問依賴或泛化關系。

6.包的用處

包的用處包括以下3部分。

□ 組織相關元素,以便于管理和復用。包是一個命名空間,外部使用要加限定名。

□ 包引入放松了限制,被引入的元素與引入包中的元素可以進行關聯,或建立泛化關系。

□ 便于組合可復用的元建模特征,以創建擴展的建模語言,即把被合并包的特征結合到合并包,以定義新的語言。

5.2.2 導入包

當一個包導入另外一個包時,該包里的元素能夠使用被導入包里的元素,而不必在使用時通過包名指定其中的元素。例如,當使用某個包中的類時如果未將包導入,則需要使用包名加類名的形式引用指定的類。在導入關系中,被導入的包稱作目標包。要在UML中顯示導入關系,需要畫一條從包連接到目標包的依賴性箭頭,再加上字符import,如下圖所示。

導入包時,只有目標包中的Public元素是可用的。如下圖所示,將security包導入User包后,在User包中只能使用Identity類,而不能使用Creden類。

不僅包中的元素具有可見性,導入關系本身也有可見性。導入可以是公共導入,也可以是私有導入。公共導入意味著被導入的元素在它們導入后的包里具有Public可見性,私有導入則表示被導入的元素在它們導入后的包里具有Private可見性。公共導入仍然使用import表示,私有導入則使用access表示。

在一個包導入另一個包時,其導入的可見性import和access產生的效果是不同的。具有Public可見性的元素在其導入后的包中具有Public可見性,它們的可見性會進一步傳遞上去,而被私有導入的元素則不會。例如,在下圖所示的包模型中,包B公共導入包C并且私有導入包D,因此包B可以使用包C和D中的Public元素,包A公共導入包B,但是包A只能看見包B中的Public元素,以及包C中的Public元素,而不能看見包D中的Public元素。因為包A、B、C之間是公共導入,而包B與C之間是私有導入。

5.2.3 包圖概述

包以及類所建立的圖形就是包圖,使用包圖可以將相關元素歸入一個系統,一個包中可以包含子包、圖表或單個元素。包圖經常用于查看包之間的依賴性。因為一個包所依賴的其他包若發生變化,則該包可能會被破壞,所以理解包之間的依賴性對軟件的穩定性至關重要。

包圖是維護和控制系統總體結構的重要建模工具。對復雜系統進行建模時,經常需要處理大量的類、接口、組件、節點等元素,這時有必要對它們進行分組。把語義相近并傾向于同一變化的元素組織起來加入同一個包中,以便于理解和處理整個模型。

包組織UML元素,如類。包的內容可以畫在包內,也可以畫在包外,并以線條連接。包圖可以應用在任何一種UML圖上,如下圖所示演示了包圖的兩種表示方法。

再如,下圖所示演示了包圖的一個簡單示例。

注意

包圖幾乎可以組織所有UML元素,而不僅僅是類。例如,包可以對用例進行分組。另外,在包中也可以包含其他包,在企業級應用程序中經常見到深層的嵌套包。例如,編程語言Java和C#都提供了嵌套包。

1.包圖中包的標準構造型

UML的所有擴展機制都適用于包,建模人員可用標記值為包增加新的特性,也可用衍型給出新類型的包。UML定義了5種應用于包的標準衍型,它們也叫作包的構造型。其具體說明如下。

□ Facade 說明包僅僅是其他一些包的視圖,只包含對另外一個包所擁有的模型元素的引用,只用作另外一個包的部分內容的公共視圖。

□ Framework 說明一個包代表模型架構。

□ Stub 說明一個包是另一個包的公共內容的服務代理。

□ Subsystem 說明一個包代表系統模型的一個獨立部分,即子系統。

□ System 說明一個包代表系統模型。

2.包圖的作用

包圖的作用如下所示。

□ 描述需求的高階概述(用例圖)。

□ 描述設計的高階概述(類圖)。

□ 在邏輯上把一個復雜的圖模塊化。

□ 組織源代碼(命名空間)。

3.類包圖

包圖可以由任何一種UML構成,通常是UML用例圖或類圖,把UML類圖組織到包圖中可稱作類包圖。創建類包圖可以在邏輯組織上設計系統,但是需要采用以下規則。

□ 把一個框架的所有類放置到相同的包中,形成一個系統包。

□ 把具有繼承關系的類放在相同的包中,比如通信包。

□ 將彼此間有聚合或組合關系的類放在同一個包中。

□ 將彼此合作頻繁的類放在一個包中。

如下圖所示演示了類包圖的一個實例。

4.用例包圖

用例最主要的需求是artifact,用例的目的是描述系統需求,而用例包圖的目的則是用來組織使用需求。用例包圖的組織規則如下。

□ 把關聯的用例放在一起:包含(Included)、擴展(Extend)或泛化(Generalization)用例放在同一個包中。

□ 組織用例應該以主要角色的需求為基礎。

在用例包圖中可以包含角色,這有助于把包放在上下文中理解,這樣包圖就會更加容易為讀者所理解。另外用戶也可以水平地排列用例包圖。

5.構建包圖的注意事項

包圖的使用非常簡單,但是要注意以下幾個方面。

(1)包的命名要簡單,要具有描述性。

(2)使用的目的是為了簡化UML圖形表示。

(3)包應該連貫。

(4)避免包間的循環依賴。

(5)包依賴應該反映內部關系。

5.2.4 包之間的關系

包與包之間最常用的關系是依賴關系與泛化關系,下面將詳細介紹它們的相關知識。

1.依賴關系

有時一個包中的類需要用到另一個包中的類,這就造成包之間的依賴性,建模人員必須使用<<access>>或<<import>>的依賴。<<import>>的依賴也可以叫作輸入依賴或引入依賴。<<access>>叫作訪問依賴,它的表示方法是在虛箭線上標有構造型<<access>>,箭頭從輸入方的包指向輸出方的包。如下圖所示演示了一個關于包與包之間的依賴關系。

根據包內元素可見性的規則,從上圖中可以得出以下幾個常見的結論。

由于A所在的包U嵌套在C所在的包Y中,而Y所在的包又嵌套在E所在的包X中,因此A能夠看見C和E。

由于包Y有一個指向包Z的<<access>>依賴,而A又嵌套在包Y中,因此A和C都能夠看見D。

由于D和E是在包V的外圍包中定義的,因此包B和F能夠看見D和E。

由于B和F的外圍包X具有一條指向包Y的<<access>>依賴,因此B和F都能夠看見C。

雖然<<access>>依賴關系和<<import>>依賴關系都可以用來描述客戶包對提供者包的訪問關系,并且都不能進行傳遞,但是它們之間還是有細微的區別的:<<import>>依賴關系使提供者包中的內容增加到客戶包中,但是<<access>>依賴關系不會增加客戶包中的內容。因此,在使用<<import>>關系時,建模人員應該注意不要讓客戶包和提供者包中元素的名稱沖突。

包之間的復雜依賴會導致軟件脆弱,因為一個包里的改變會造成依賴它的其他包被破壞。如果包之間的依賴性具有循環關系,應以各種方式切斷循環。

2.泛化關系

泛化關系是表達事物的一般和特殊的關系,如果兩個包之間有泛化關系,意指其中的特殊性包必須遵循一般性包的接口。包與包之間的泛化關系和類間的泛化關系很相似,因此涉及泛化關系的包也像類那樣遵循可替換性原則。如下圖所示演示了包間的基本泛化關系。

5.2.5 包圖和類圖的區別

包圖是在UML中用類似于文件夾的符號表示的模型元素的組合,系統中的每個元素都只能為一個包所有。到目前為止,用戶已了解了包圖和類圖的相關知識,而下表列出了包圖和類圖的主要區別。

主站蜘蛛池模板: 安达市| 张家港市| 凉城县| 木兰县| 呼玛县| 城固县| 玉溪市| 新津县| 宁安市| 阿拉善右旗| 利川市| 怀宁县| 莎车县| 马关县| 界首市| 德昌县| 磴口县| 祁东县| 咸宁市| SHOW| 罗甸县| 固安县| 乐平市| 宁晋县| 开化县| 田东县| 山丹县| 吉林市| 兰考县| 海南省| 天峻县| 锡林浩特市| 泌阳县| 鄂尔多斯市| 宜城市| 大方县| 甘泉县| 三穗县| 万州区| 北碚区| 六安市|