[注] 本文不是包圖的基礎教程, 只是包圖的圖形總結.
學習UML圖形
推薦閱讀<UML參考手冊>第2版. http://www.umlchina.com/
推薦微軟的開發軟體設計模型 http://msdn.microsoft.com/zh-cn/library/dd409436.aspx
包圖主要用來表現包和它所包含元素的組織, 包圖最常用的用途是用來組織用例圖和類圖, 儘管它不侷限於這些UML元素.
〇 概述
包圖可使用的工具集(EA工具箱)有:
一 包圖元素
1. 包
Package, 圖形表示為一個資料夾, 包的版型(StereoType)有:
1) 普通包, 表示為一個資料夾, 如圖Package1和Package4
2) 其它包, 表示為一個資料夾+書名號包含的具體版型或特殊符號, 如圖Package2和Package3
2. 類
Class, 圖形表示為一個實心矩形或圓形(橢圓)[+一系列附加符號], 類的版型(StereoType)有:
1) 普通類, 表示為一個實心矩形, 如圖Class1
2) 邊界類, 表示為一個實心圓形+實豎線, 如圖Class2
3) 實體類, 表示為一個實心圓形+實橫線, 如圖Class3
4) 控制類, 表示為一個實心圓形+在圓周上的箭頭, 如圖Class4
5) 其它類, 表示為一個實心矩形或圓形(橢圓)+書名號包含的具體版型或特殊符號, 如圖Class 5, 6, 7 ...
[注1] 類圖示變化最大, 版型最多, 必須根據所屬的檢視或圖形進行識別, 如Class2在包圖和類圖中稱為邊界類, 在活動圖中同樣的圖示應稱為邊界物件.
[注2] 類圖示的矩形表示和Artifact相似, 都是實心矩形, 區別方法是Artifact圖示會含有Icon, 而類圖示一般幾何元素拼湊.
[注3] 類圖示的橢圓表示和用例相似, 都是實心橢圓, 但用例不會出現在類圖上, 類也不應該出現在用例圖上, 因此不會衝突.
[注4] 包圖上的類一般引用類圖, 類圖內部的畫法, 參見類圖部分. (下同)
3. 介面
Interface, 圖形表示為一個實心矩形+書名號包含的interface字樣, 介面沒有版型(StereoType).
介面是特殊的類, 因此圖示和類相同, 書名號包含的interface是其區別與類的唯一方式.
注意: 介面如果沒有明確的詳細操作,也可以畫成一個圓環。當畫成圓環的時候,到這個環形標柱的實現連線沒有目標箭頭。
4. 資料型別
DataType, 圖形表示為一個實心矩形+書名號包含的datatype(或其它)字樣, 資料型別的版型(StereoType)有:
1) 資料型別, 表示為一個實心矩形+書名號包含的interface字樣, 如圖DataType1
2) 基本型別, 表示為一個實心矩形+書名號包含的interface字樣, 如圖PrimitiveType1
3) 列舉型別, 表示為一個實心矩形+書名號包含的interface字樣, 如圖Enumeration1
4) 表格型別, 表示為一個實心矩形+書名號包含的interface字樣, 如圖Table1
5) 訊號型別, 表示為一個實心矩形+書名號包含的interface字樣, 如圖Signal1
6) 其它型別, 表示為一個實心矩形+書名號包含的其它字樣, 如圖DataType 2, 3, 4 ...
[注4] 資料型別用來描述形如列舉, 結構, 表格等特殊的資料型別或類, 同樣的, 使用不同的版型是為了定義更準確.
5. 關係
5.1 包與包之間的關係
1) 合併 merge, 表示為一條虛線+單向空心箭頭+書名號包含的merge字樣, 箭頭指向被合併的包, 如圖Controller合併GenApply
包合併定義了一個包的內容是如何被另一個包擴充套件的關係(包合併定義了源包元素與目標包同名元素之間的泛化關係).
2) 匯入(引入) import/access, 表示為一條虛線+單向空心箭頭+書名號包含的import/access字樣, 箭頭指向被合併的包, 如圖Controller匯入Interger
包匯入是一種允許採用非限定性名稱訪問來自於另一個名稱空間中的元素的關係.
3) 巢狀 nesting, 表示為一條實線+帶十字線的實心圓, 圓遠離被合併的包, 如圖Controller巢狀ConnSeq(即ConnSeq被巢狀)
源包和目標包間的巢狀連線符說明目標包完全包含源包.
5.2 類與類(介面/資料型別)之間的關係
本圖中使用的例子來自 http://blog.csdn.net/tianhai110/article/details/6339565
1) 實現 realization, 表示為一條虛線+單向空心箭頭, 箭頭指向被實現的介面
2) 泛化 generalization, 表示為一條實線+單向空心箭頭, 箭頭指向被泛化的基(父)類
3) 依賴 dependency, 表示為一條虛線[+單向或雙向開口箭頭], 單向箭頭表示單向依賴
4) ① 關聯 association, 表示為一條實線[+單向或雙向開口箭頭], 單向箭頭表示單向關聯
4) ② 聚合 aggregation , 表示為一條實線[+單向空心菱形], 空心菱形箭頭指向目標類或父類
4) ③ 組合 composition, 表示為一條實線[+單向實心菱形], 實心菱形箭頭指向目標類或父類
[注5] 應避免雙向依賴.
[注6] 幾種關係所表現出的強弱程度從弱到強依次是: 依賴<關聯<聚合<組合(即耦合度: 組合>聚合>關聯>依賴).
6. 可見性
6.1 包的可見性
Package Visibility, 使用版型(StereoType)表示, <<import>>表示public, <<access>>表示private
[注] import VS access:
Ordering在import匯入Products和Pricing後可直接使用Products和Pricing包內的元素;
Ordering在access匯入Storage後仍可直接使用Storage包內的元素;
而當Ordering被其它包引用時, 其它包只能直接使用Products和Pricing包內的元素, 不能直接使用Storage包內的元素; 但仍可採用Storage::Goods這樣的限定性名訪問Storage包中的元素.
6.2 類(介面/資料型別)的可見性
Class Visibility, 使用 +/-/#/~ 符號表示
1) 公共 public, 用 + 號表示, 如圖Storage包內Goods類的GetCount成員
2) 私有 private, 用 - 號表示, 如圖Storage包內Goods類的Count屬性
3) 保護 protected, 用 # 號表示, 如圖Storage包內Goods類的SetCount成員
4) 包 package, 用 ~ 號表示, 代表包內可見, 如圖Storage包內Goods類的Test成員
二 UML通用元素
參見UML參考手冊中的特性描述部分, 如一些註釋元素, 不單隻能畫到用例圖中, 而是通用的可以畫到任何UML圖形上的.
如圖邊界右上角的註釋元素
三 包圖總結
本節中出現的建議可應用到任何一種UML圖的包應用上, 並非只是包圖上.
1. 包的命名要簡單, 具有描述性
例如Shipping, Customer, Enrollment和Manage, 這樣包包含了些什麼就非常的清楚了.
2. 應用包是為了簡化圖
通常在一個圖變得笨重, 單一頁中列印不下的時候引入包. 換句話說, 遵循通用指南一一把大的圖重新組織為較小的圖, 你需要對模型使用分而治之的方法.
3. 包應該連貫
你插入包中的任何東西都應該有意義, 都需要考慮包中的其餘內容. 為了確定一個包是否連貫, 一個好的經驗法則是你是否能夠用一個短的, 描述性的名稱為包命名.
如果你做不到這一點, 你或許就已經把幾個不相關的事務放到包中了.
4. 在包上用版型註明架構層
我們通常會把設計組織到架構層次中, 例如user interface, business/domain, persistence/data和infrastructure/system.
5. 避免包間的迴圈依賴
包A依賴於包B, 包B依賴於包C, 而包C依賴於包A, 這就形成了迴圈: A-B-C-A, Knoernschild (2002)建議儘量避免出現這種情況.
因為包之間彼此緊密耦合, 將來的維護和改進將變得困難. 迴圈依賴是一個很好的訊號, 意味著你需要重構一個或多個的包, 把導致迴圈依賴的因素從包中除掉.
6. 包依賴應該反映內部關係
當一個包依賴於另一個時, 這意味著兩個包的內容間存在著一個或多個的關係. 例如: 如果是一個用例包圖, 那麼就有可能兩個用例之間存在includes, extends, 或繼承關係, 而兩個用例分別處於不同的包中.
總結來自 http://developer.51cto.com/art/201007/209059.htm
相關連結:
UML 結構圖之用例圖 總結 http://www.cnblogs.com/snowyying/p/UML_UseCase.html
轉載請保持原文完整. http://www.cnblogs.com/snowyying/p/3898567.html