統一建模語言(Unified Modeling Language,UML)是“繪製軟件藍圖的標準化語言。
UML 用來可視化、描述、構造和文檔化軟件密集系統的 人工製品”[Boo05]。
如果了 解 UML 的詞彙(圖示元素和它們的含義),就可以很輕鬆地理解和描述一 個系統,並向他人解釋該系統的設計。
Grady Booch、Jim Rumbaugh 和 Ivar Jackson 在 20 世紀90 年代中期 開發出了UML 語言。
目前的標準是 UML 2.3 ,也是 ISO 標準。因爲這個標準很新,所以很多舊的資料,(如[Gam95])都沒有 使用 UML 符號。
UML 2.3 提供了13 種不同的圖以供軟件建模使用。在本文中,將 僅討論類圖、部署圖、用例圖、順序圖、通信圖、活動圖和狀態圖。
應該注意,UML 圖有很多可選功能。UML 語言提供了這些選項(有時候是隱藏的), 使得軟件工程師能表達系統的所有重要方面。同時,還可以靈活地隱藏圖中那些與建模無關的部分,避免無關的細節將圖弄得雜亂。
因此,一種特殊功能的省略並不意味着該功能的缺 失,它可能意味着該功能被隱藏了。
在本文中,沒有介紹UML 圖的所有功能,而是重點介紹標準選項
類圖
爲了對類建模(包括類的屬性、操作和關係以及和其他類的聯繫), UML 提供了類圖, 類圖提供了系統的靜態或結構視圖。它並不顯示圖中類的對象之間通信的動態特性。
表示
類圖的主要元素是方框,方框是一些用來描述類和接口的圖符。
三部分
每個方框都被水平地劃分爲多個部分。
-
頂層部分包含類的名字
-
中間部分列出了類的屬性
屬性可以是一些數值,這些數值是由類從它的實例變量中計算出來的,或是從組成它的其他對象中得到的。比如, 對象可以時刻知道當前時間,在這種情況下,適合把時間作爲屬性,因爲可以在getter中經過計算獲取。如果將時間存在實例變量中,那麼這個時間就是死的。
實例變量和屬性:簡單解釋,實例對象是寫在類內方法外的變量,屬性是有getter和setter的實例變量
-
第三部分包含類的操作或行爲。
操作是指類的對象所能做的事情,通常實現爲類的方法。
圖 A1-1 介紹了一個簡單例子,用Thoroughbred(純種) 類對優良種馬建模。
它有三個屬性——mother、father 和 birthyear
還有三個操作—— getCurrentAge()、getFather() 和 getMother()。
圖中也有 一些隱藏的屬性和操作沒有顯示。
修飾
每個屬性都有名字、類型和可見性級別。類型和可見性都是可選的。
類型放在名字後面,並用冒號進行分隔。
可見性由前面的-、#、~ 或+指定,分別代表私有、 受保護、包或公有可見性。
在圖A1-1 中,所有屬性都是 私有的,由前面的減號(-)指出。
下劃線表示屬性是否爲靜態屬性或類屬性,
可以用可見性級別、帶名字和類型的參數以及返回類型來表示每個操作。
在類圖中,名字設成斜體表示抽象的類或方法。例如,圖A1-2 中的Horse 類就是抽 象類。
通過在名字的上方添加短語“interface”(稱爲構造型)來指定接口,如圖A1-2 中的 OwnedObject 接口。也可以用空心圓來表示接口。
值得一提的是,表示類的圖符可以有其他可選的部分。例如,處於類方框底層的第四部分可以列出類的責任。
在產生屬性和操作之前,CRC 卡片上列出的責任如能添加在 UML 圖 中類方框的第四部分,則這一部分在CRC 卡片(第 9 章)向類圖轉換時特別有用。本文中的所有圖均未顯示第四部分。
表示類之間的關係
泛化
類和它的子類之間用實線加上空心的三角箭頭連接。箭頭的方向是從子類指向父類。
在UML 中,這樣的關係稱爲泛化。
比如,在圖A1-2 中,類Thoroughbred 和類QuarterHorse 顯示爲Horse 抽象類的子類
實現
帶虛線的箭頭表示接口的實 現。在 UML 中,這樣的關係稱爲實現。
例如,圖A1-2 中,Horse 類實現了OwnedObject 接口。
關聯
兩個類之間的關聯是指它們之間存在着結構上的關係。
關聯用實線表示,有很多可選部分。
可以在它的每一端都加上標籤,指定關聯中每個類的角色。
例如,在圖A1-2 中,OwnedObject 和 Person 之間存在關聯,Person 在此關聯中扮演所有者(owner)的角色
關聯也可以通過循環連接它本身,這樣的關聯表明同 一類所創建的不同對象之間可以相互連接。
導航性
關聯線一端或兩端的箭頭表示可導航性。
一端帶箭頭的關聯表明這是一個單向導航。箭頭表明從第一個類可以很容易訪問關聯方 向所指的第二個類,但是從第二個類卻不能很容易地訪問第一個類。
關於這種現象的另外 一種解釋是,第一個類可以察覺到第二個類,但是第二個類的對象將不能直接察覺到第一個類。
沒有箭頭的關聯通常表明它是一個雙向的關聯,這就是圖A1-2 中所指的。也有可能是僅僅意味着可導航性並不重要,所以省略了。
應當注意到,一個類的某個屬性和類(其屬性所屬的類型是類)的關聯是一樣的。
就是說,想表達類中有叫作“name”的String 類型的特性,那就直接在類中寫(如圖 A1-2 Horse類中name屬性的寫法)。或者,也可以構建一個從Horse 類到 String 類的單向關聯,在此關聯中,String 類的角色是“name”。
對於原始數據類型,用屬性的辦法會更好些,而當特性類在設計中起重要作用時,用關聯的方法通常比較好一些,在那種情況下,有那種類型的類方框更有價值。
依賴關係
依賴關係表示類之間的另一種連接,由一條虛線(可選的段末箭頭和可選的標籤)表示。
一個類依賴於另一個類,則改變另一個類也需要改變這個類。從一個類到另一個類的關聯就自動錶明瞭一種依賴性。如果類之間已存在關聯則不需要虛線。
然而,對於短暫的關係(即 一個類不需要同另一個類維持長時間的連接,但確實偶爾會用到另一個類),我們應該從第 一個類畫一條虛線到第二個類。
例如,在圖A1-2 中,當 Thoroughbred 類的getCurrentAge() 方法被調用時,它需要使用 Date 類,所以依賴性被標識爲“uses”。
多重性
關聯一端的多重性是指類關聯於其他類的對象的數量。多重性由非負整數或整數範圍描述。
- 通過“0…1”描述的多重性是指在關聯的一端存在 0 或 1 個對象。
例如,世界上的每個人要麼有社會保險號,要麼沒有,因此,多重性0…1 就可以在類圖中的Person 類 和 SocialSecurityNumber 類之間的關聯中使用。 - 由“1…*”描述的多重性是指一個或更多
- 由“0…*”或者只是一個“星”描述的多重性指的是 0 個或更多。 在圖A1-2 中,與 Person 類關聯的 OwnedObject 端的多重性使用了一個”星“,因爲 Person 可以擁有 0 個或更多的對象。
如果關聯的一端有比 1 大的多重性,那麼該端涉及的對象將可能被存儲於收集中,如集合或有序列表。在UML 圖中,也可以包括收集類本身,但是,由於關聯的多重性,這樣的類通常被省略並假定存在那裏。
聚合和組合
聚合是一種特殊的關聯,通過圖符一端的空心鑽石表示。它表明一種“整體/ 部分”關 系,箭頭所指的類是關聯的菱形端的一“部分”。
組合表明聚合對部分的強所有權。在組合 中,部分隨着所有者而生存或消亡,因爲它們在獨立於所有者的軟件系統中沒有作用。
參見 圖 A1-3 中關於聚合和組合的例子。
College 有一個包含Building 對象的聚合,這表示建築構成了學院。學院也有一個包含課程的集合。
如果學院倒閉了,建築仍將存在(假定該學院不是物理上消失)並可用於其他 事情,但是Course 對象在學院之外則毫無用 處,它是由學院提供的。
註釋
類圖中另一個共同元素是註釋,由具有 狗耳角的方框表示,通過虛線連至其他圖符。 它可包含任意內容(文字和圖形),類似於編程語言中的註釋。(如圖A1-3Course)
它可能包括有關類的作用的解釋信息或是該類的所有對象應遵守的約束。 如果內容是約束,內容外面將括着大括號
部署圖
UML 部署圖關注軟件系統的結構,用於顯示軟件系統在硬件平臺和運行環境中的物理分佈。
例如,設想你正在開發一個基於Web 的圖形顯示包,包的用戶將使用他們的Web 瀏 覽器訪問你的網站,得到渲染信息。你的網站應根據用戶的描述渲染圖像並將其返回給用戶。
因爲圖像渲染需要大量的計算,所以你決定將渲染從Web 服務器中分離出來,放在一 個單獨的平臺上。這樣,系統涉及三個硬件設備:Web 客戶端(運行瀏覽器的用戶計算機), Web 服務器所在的計算機和渲染引擎所在的計算機。
圖 A1-4 顯示了此包的部署圖。在此圖中,硬件部件放在標有“device”的方框中,硬 件部件之間的通信路徑用帶有可選標籤的線表示。在圖A1-4 中,路徑是用連接設備的通信協議和網絡類型標記的。
部署圖中的每個節點也用設備的細節註釋。例如,在圖A1-4 中,瀏覽器客戶端被描述 爲由Web 瀏覽器軟件構成的人造製品。
人造製品:品是指包含在設備上所運行軟件的文件
你也可以描述標記值,就像圖A1-4 中的Web 服務器節點一樣。這些值定義了服務器所採用的 Web 服務器廠家和服務器所使用的操作系統。
部署圖也可以顯示運行環境節點,將運行環境節點繪製爲包含標籤“execution environment”的方框。這些節點表示可以運行其他軟件,如操作系統。
用例圖
用例和 UML 用例圖可幫助你從用戶的角度決定軟件的功能和特點。
爲了讓讀者瞭解用例和用例圖是如何工作的,以下爲在線數字音樂商店管理軟件創建一些用例和用例圖。軟件可能要做的一些事情包括:
- 下載 MP3 音樂文件,並將其存儲於應用的存儲庫中。
- 捕捉流媒體音樂,並將其存儲於應用的存儲庫中。
- 管理應用存儲庫(例如,刪除歌曲或將其添加到播放列表中)。
- 將存儲庫中的歌曲清單刻錄到 CD 上。
- 將存儲庫中的歌曲清單加載到 iPod 或 MP3 播放器。
- 將一首歌曲從 MP3 格式轉換爲 AAC 格式,反之亦然。
這並不是一個全面的列表,但它已足夠使你理解用例和用例圖的作用。
用例通過定義實現明確目標所需的步驟描述了用戶和系統之間的交互(例如,將歌曲清 單刻錄到CD 上)。一系列步驟的變動描述了各種不同的場景(例如,如果歌曲清單中的所 有歌曲不適合放在一張 CD 上該怎麼辦)。
表示
UML 用例圖是所有用例和用例之間關係的視圖。它提供了系統功能的整體圖示。數碼音樂應用的用例圖如圖 A1-5 所示。
在這個圖中,木棍小人表示和其他類型的用戶(或其他交互元素)相關聯的參與者。
複雜的系統通常不止一個參與者。例如,自動售貨機應用系統可有三個參與者,表示客戶、維修人員和裝貨人員。
在用例圖中,用例用橢圓形顯示。角色通過線連接到所執行的用例上。注意,圖中並不 包括用例的細節,用例的詳細信息需要單獨存儲。
另外,還需要注意,可將用例放在矩形框 中,而不能將角色放在矩形框中。矩形框表示的是系統的邊界,而角色在系統之外。
包含關係
系統的一些用例會互相關聯,例如,將歌曲清單刻錄到CD 和將歌曲清單存儲到iPod 或智能手機具有相似的步驟。爲避免用例中的重複,需建立新用例來表示重複活動,然後讓其他用例 包含這個新用例,作爲其他用例的一個步驟。
在用例圖中,如圖A1-6 所示,這種包含關係用標有 include 的虛線箭頭來連接用例和被包含的用例。
由於用例圖顯示了所有的用例,因此,用例圖有助於確保覆蓋系統的所有功能。
在我們 的數碼音樂系統中,確實需要更多的用例,如播放庫中歌曲的用例。但是請記住,用例在軟件開發過程中最有價值的地方是對每個用例的文字說明,而不是總體用例圖[Fow04]。通過用例的說明,才能對所開發系統的目標形成清晰的理解。
順序圖
類圖和部署圖顯示系統構件的靜態結構,而順序圖顯示任務執行過程中對象之間的動態通信。它顯示了完成任務的對象之間消息發出的先後順序。順序圖可以顯示某個用例或軟件系統的某個場景中存在的交互
表示
在圖 A1-7 中,可以看到一個畫圖程序的順序圖。
該圖顯示了在一幅圖中點擊一個圖形時高亮度顯示所涉及的步驟。圖頂端行中的每個方框通常對應一個對象,雖然方框也有可
能模擬其他東西,比如類。
- 如果方框表示對象(如我們所有例子中的情況),那麼在方框內,我們可以有選擇地規定冒號前的對象名。也可在冒號之後寫上類名,如圖 A1-7 中第三個方框所示。
- 在每個方框下面都有一條被稱爲對象生命線的虛線。順序圖中的垂直軸代表着時間,隨着時間逐漸增加,線條逐漸向下移動。
-
順序圖使用從調用者到被調用者的水平箭頭來表示方法調用,箭頭上標有方法名稱,可選部分包括參數、參數的類型和返回類型。
如圖 A1-7 所示,MouseListener 調用 Drawing 的 getFigureAt() 方法。
-
當對象在執行方法時(即在堆棧裏有活動幀時),在對象的生命線下面可選擇性地顯示一條空白的條,稱爲活動條。
在圖 A1-7 中,對於所有方法的調用都繪製了活動條。
-
圖也可以通過虛線箭頭和可選標記選擇性地顯示方法調用的返回結果。
在圖 A1-7 中,getFigureAt() 方法的返回結果由返回對象的名字標記。普遍的做法如圖 A1-7 所示,當一個無返回結果的方法被調用時,將不會有返回箭頭,因爲這樣將會使圖變得雜亂,而且不會起任何重要作用。
-
有箭頭的黑圓圈表明一條來源未知或無關的發現消息。
你現在應該能夠理解圖 A1-7 顯示的任務了。
- 未知源調用 MouseListener 中的 mouseClicked() 方法, 將點擊的點作爲參數傳入。
- MouseListener 然後調用 Drawing 的 getFigureAt() 方 法, 並得到返回的一個Figure對象。
- 接着 MouseListener 調用 Figure 的 highlight() 方法,傳遞一個 Graphics 對象作爲參數作爲響應
- Figure 調用 Graphics 對象的三個方法用紅色畫出圖形。
邏輯控制-交互框
圖 A1-7 比較簡單,不包括附加條件和循環。若需邏輯控制結構,則最好爲每種情況都繪製一張單獨的順序圖。即當消息根據條件可有兩條不同的路徑時,則需要繪製兩張分開的順序圖,爲每種可能性繪製一張。
若想要在一張順序圖上包括循環、條件和其他控制結構,則可以使用交互框。交互框是矩形,包圍圖的一部分,並用其所表示的控制結構的類型做標記。
圖 A1-8 描述了這種情況,高亮顯示給定矩形中所有圖形所涉及的過程。
- 將消息 rectDragged 發送給 MouseListener
- MouseListener 通知繪圖部分高亮顯示矩形中的所有圖形,具體做法是調用 Drawing 對象的 highlightFiguresIn() 方法,並傳遞矩形作爲參數
- 此方法要對 Drawing 對象中的所有 Figure 對象進行循環,如果 Figure 和矩形相交,則需要 Figure 高亮顯示自身。
在方括號內的短語稱爲守衛,守衛是布爾條件,如果交互框中的動作要繼續,則守衛必須爲真。
loop是循環,opt是滿足條件執行
其他特點
順序圖還有很多其他特點。例如:
- 可清楚地分辨出同步和異步消息。同步消息用實體箭頭表示,而異步消息用棒形箭頭(stick arrowhead)顯示。
- 可用箭頭表示對象向它本身發送消息。所用的箭頭需從該對象發出,然後折向下,再指回對象本身。
- 通過繪製指向對象方框的帶有適當標記(例如帶有 create 標籤)的箭頭來表示對象的創建。這種情況下,方框將出現在比行動開始時已存在對象對應的方框低一些的位置。
- 也可通過對象生命線末端的大寫 X 顯示對象的銷燬。其他對象可以銷燬一個對象,在這種情況下,一個箭頭從其他對象指向 X。X 通常表示該對象已不再有用,因此可以準備進行垃圾回收。
最後三個特點都顯示在圖 A1-9 所示的順序圖中。
通信圖
UML 通信圖(在 UML 1.x 中稱爲“協作圖”)提供了通信時間順序的另一種表達形式,但是強調對象和類之間的關係,而不是時間順序。
正在更新……