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