包圖的基本概念: 包圖是用來描述模型中的包和所包含元素的組織方式的圖,是維護和控制系統總體結構的重要內容。
包圖能夠組織許多UML中的元素,不過其最常用的用途是用來組織用例圖和類圖。
包圖中包含包元素以及包之間的關系。與其他圖類似,包圖中可以創建注解和約束。
包的概念: 包是用於把模型組織成層次結構的通用機制,它不能執行。
包名:包有簡單名、路徑名
包中的元素:包中可以容納各種高級的模型元素,如類和類的關系、狀態機、用例圖、交互、協作等,甚至是一個完整的UML圖。
另外,包中還可以含有包,這被稱為包的嵌套。
包元素的可見性:控制包外元素對包內元素的訪問權限。
公有(+):只要當前包被引入,包內的公共元素即對引入者可見。
保護(#):僅對當前包的子包可見。
私有(-):僅對該包可見,外部無法訪問。
另外,如果某元素對於一個包是可見的,則它對於嵌套在這個包中的任何包都是可見的。
包的構造型:可以使用構造型來描述包的種類。UML預定義了一些構造型,用戶也可自行定義新的構造型。
高內聚,低耦合:
在外部觀察包時,可以將內部元素視作一個整體,方便將多個元素一同處理。
包內部的元素應該保證有相似、相同的語義,或者其元素有同時更改和變化的性質。
注:在實際應用中,包對包含的元素的作用相當於C++和C#中命名空間的概念或Java中的包概念。和這些概念不同的是,UML包中的內容不限於類和接口,包中的元素種類要豐富的多。
元素的分包原則:
1)元素不能“狡兔三窟”:樹形結構的一個節點不能同時擁有兩個父節點,一個元素也不允許在兩個包中重復出現。
2)相同包內元素不能重名:包所具有的命名空間的作用要求用一個包中的同種類元素名稱必須是唯一的。
3)包內元素要緊密聯系:分在同一個包中的元素應該具有某些相同的性質,即包的高內聚性。
4)包與包盡可能保持獨立:包和包之間需要盡可能減少耦合度,要求包內元素與外部元素有盡可能少的依賴關系。
包的依賴關系:
包之間的依賴關系實際上是從一個更高的層次來描述包內某些元素之間的依賴關系。也就是說,如果不同包中任何元素之間存在着一個依賴,則兩個包之間就存在着依賴關系。
包之間的依賴關系首先需要包中的某些元素具有某種外部可見性,即可以被包外部的元素所引用。
容易出現的問題:循環依賴
循環依賴的出現是令人困惑、也是非常容易產生錯誤的。尤其是當依賴關系表示包的引入時,循環依賴會導致將模型轉化成代碼后因為包之間互相引入而出現錯誤。
解決方案:重新分包,引入第三個包,重新建立依賴關系。
包圖的建模技術
對成組元素建模
瀏覽模型中的元素,找出概念或語義上接近的元素分組。
將分好組的元素組織在一個包里,同時考慮包的嵌套。
對每一個包,區分哪些元素需要在包外被訪問,進而確定包內元素的可見性。這一步驟類似於類的封裝過程:沒有必要對外開放的元素一定要預先標注為私有,隨后逐一檢查,如果必須開放再考慮開放可見性為受保護或公有。若設計完成時發現部分公有元素未被使用,還應該將這些元素重新置為私有元素。
使用引入依賴顯式地在包之間建立關系。
對體系結構視圖建模
我們已經知道,視圖是對系統的組織和結構的某個方面的投影,表達了對系統某個方面的關注。理論上,我們完全可以利用包元素來創建自己的體系結構視圖。實際上,現在絕大部分的UML建模工具的視圖結構也是使用包元素來划分其體系結構視圖的。