介紹
一個"包圖"可以是任何一種的UML圖組成,通常是UML用例圖或UML類圖。 包是一個UML結構,它使得你能夠把諸如用例或類之類模型元件組織為組。 包被描述成資料夾,可以套用在任何一種UML圖上。 雖然包圖並非是正式的UML圖,但實際上他們是很有用處的, 創建一個包圖是為了∶ 描述你的需求高階概述。
描述你的設計的高階概述。
在邏輯上把一個複雜的圖模組化。
組織Java原始碼。
指南∶
類包圖
創建類包圖,以在邏輯上組織你的設計
創建UML組件圖,以在物理上組織你的設計
把子包放置在母包的下面
垂直地分層類包圖
用例包圖
創建用例包圖,以組織你的需求
在用例包圖上包含角色
水平地排列用例包圖
包
包的命名要簡單、具有描述性
套用包是為了簡化圖
包應該連貫
在包上用版型註明架構層
避免包間的循環依賴
包依賴應該反映內部關係
類包圖
1.創建類包圖,以在邏輯上組織你的設計
圖1描述了一個組織成包的UML類圖。 除了以下介紹的包原則之外,套用下列的規則來把UML類圖組織到包圖里:
把一個框架的所有類放置在相同的包中。 一般把相同繼承層次的類放在相同的包中。 彼此間有聚合或組合關係的類通常放在相同的包中。 彼此合作頻繁的類,信息能夠通過UML順序圖和UML合作圖反映出來的類,通常放在相同的包中。
圖1.一個類包圖。
2.創建UML組件圖,以在物理上組織你的設計。
如果你的組件比較接近技術,例如那些通過Enterprise Java Beans ( EJB)或Visual Basic的組件,你應該優先選擇UML組件圖來描述物理設計,而不是包圖。 圖1的版本源自於組件圖章節中。就像你看到的,這個圖最適用於物理設計。 永遠記住遵循敏捷建模(AM) ( Ambler 2002)的實踐--套用合適的Artifact,為工作挑選最好的模型。
3.把子包放置在母包的下面。
圖1描述了包間的繼承,你可以看到,繼承的包顯示在母包支下。 這和UML類圖中的在超類下面放置子類的指南是一致的。
4.垂直地分層類包圖。
包間的依賴表明,從屬的包的內容依賴於另一個包的內容,或結構上依賴於其它包的內容。 在圖1中你可以看到圖中的?類互動,領域類又使用基礎結構類,基礎結構類訪問資料庫。傳統的,這種分層的順序是以從上到下的方式描述的。
用例包圖
用例通常是面向對象開發方法學中的最主要的需求artifact,當你的方法是統一過程(Kruchten 2000; Ambler 2000)實例是尤其如此。而且對於大的項目包圖來說,通常是創建用來組織使用需求的。
1.創建用例包圖,以組織你的需求
除了以下介紹的包原則之外,套用下列的規則來把UML用例圖組織到包圖里:
把關聯的用例放在一起∶included、extending、和inheriting的用例放在相同的包中,就像base/parent用例一樣。
組織用例應該以主要主角的需要為基礎。 例如,在圖2中,Enrollment包包含與登記班級的學生有關的用例,一個大學提供的重要服務集合。
圖2.一個包含主要的包的UML用例包圖。
2.在用例包圖上包含角色
圖2包含包圖上的角色,這有助於把包放在上下文中理解,這樣包圖就會更容易為讀者所理解。
3.水平地排列用例包圖
用例包圖的主要客群是項目干係人。因此圖的組織應該能夠反映他們的需求。 圖2中的包是水平放置的,從左到右畫出的依賴關係反映了西方文化的閱讀習慣。
包
本節中出現的建議可套用到任何一種UML圖的包套用上,並非只是包圖上。
1.包的命名要簡單、具有描述性
在圖1和圖2中,包都有簡單的、描述性的名稱,例如Shipping、Customer、Enrollment和Manage Student Loans和Grants,這樣包包含了些什麼就非常的清楚了。
2.套用包是為了簡化圖
通常在一個圖變得笨重,單一頁中列印不下的時候引入包。換句話說,遵循通用指南--把大的圖重新組織為較小的圖,你需要對模型使用分而治之的方法。
3.包應該連貫
你插入包中的任何東西都應該有意義,都需要考慮包中的其餘內容。 為了確定一個包是否連貫,一個好的經驗法則是你是否能夠用一個短的,描述性的名稱為包命名。 如果你做不到這一點,你或許就已經把幾個不相關的事務放到包中了。
4.在包上用版型註明架構層
我們通常會把設計組織到架構層次中,例如user interface、business/domain、persistence/data、和infrastructure/system。 在圖1中你可以看到例如user interface、domain、infrastructure和database的版型套用包中,以反映通用的層。
5.避免包間的循環依賴
包A依賴於包B,包B依賴於包C,而包C依賴於包A,這就形成了一個循環:A-B-C- A, Knoernschild ( 2002)建議儘量避免出現這種情況。 因為包之間彼此緊密耦合,將來的維護和改進將變得困難。 循環依賴是一個很好的信號,意味著你需要重構一個或多個的包,把導致循環依賴的因素從包中除掉。
6.包依賴應該反映內部關係
當一個包依賴於另一個是,這意味著兩個包的內容間存在著一個或多個的關係。 例如:如果是一個用例包圖,那么就有可能兩個用例之間存在includes、 extends、或繼承關係,而兩個用例分別處於不同的包中。