Uniform Modeling Language
「統一塑模語言、Uniform Modeling Language」,簡稱「UML」。它是一種使用圖型化的表示方式,用來表示軟體系統的圖型。「UML」不是一種程式語言,經由一組相關的圖型來規範與架構軟體系統,它是目前分析與設計物件導向軟體系統常用的一種工具。
UML的規格在90年代早期由Grady Booch,James Rumbaugh和Ivar Jacobson制定,目前由Object Management Group、OMG負責規格的維護,UML相關的規格,都可以在OMG的網站中取得:「http://www.omg.org/uml」
UML規格中制定了九種主要的圖型(Diagram):
- 使用案例圖型、Use Case Diagrams
- 類別圖型、Class Diagrams
- 物件圖型、Object Diagrams
- 元件圖型、Component Diagrams
- 佈署圖型、Deployment Diagrams
- 循序圖型、Sequence Diagrams
- 合作圖型、Collaboration Diagrams
- 狀態圖型、Statechart Diagrams
- 活動圖型、Activity Diagrams
以層次來看UML圖型,是以UML圖型的內容為觀察角度;以軟體系統架構的角度來看UML圖型,可以把它們分為「行為圖型」、「架構圖型」和「動態圖型」。本書的章節以這樣的分類來討論這些圖型。
行為圖型
行為圖型用來表示軟體系統組成的基本單位和彼此之間的關聯,是屬於概念層次的圖型,在這個角度下只有一個「使用案例圖型」:
使用案例圖型
「使用案例圖型、Use Case Diagrams」是概念層次的產物,它使用簡單的圖型來表示軟體系統的基本單位,例如使用者、裝置和系統的功能;圖型中也會標示出基本單位之間的關聯,例如使用者操作的系統功能,和系統功能之間的關係。
使用案例圖型使用一個人型來表示軟體系統的使用者,稱為「行為者節點、Actor Node」,並且在圖型下方標示行為者節點的類別。行為者節點之間也存在著類似繼承的關係,如果使用口語來說的話,可以把它們當成分類的觀點來看:
在確定使用者節點之後,接下來就要加入系統的定義,還有標示系統與使用者節點之間的關聯:
使用者圖型還有許多在細節上的表現,並不在本書的討論範圍,如果需要關於使用者圖型詳細的資訊,請參考「UML Specification、3.6 Use Case Diagrams」的說明。
架構圖型
架構圖型用來表示軟體系統中「不變」的結構,以及元素之間的關聯,它們是屬於規格層刺的圖型:
類別圖型
下列是一個使用「java.util.List」來模擬「Map」資料結構的類別「MyMap」。接下來以這個簡單的模擬程式來討論「類別圖型、Class Diagrams」:
package test;
import java.util.List;
import java.util.ArrayList;
public class MyMap {
private List keyList = new ArrayList();
private List valueList = new ArrayList();
public void add(Object key, Object value) {
if (keyList.size() == 0 || !keyList.contains(key)) {
keyList.add(key);
valueList.add(value);
}
}
public Object get(Object key) {
Object result;
int index = 0;
if ((index = keyList.indexOf(key)) != -1) {
result = valueList.get(index);
} else {
result = null;
}
return result;
}
public Object remove(Object key) {
Object result;
int index = 0;
if ((index = keyList.indexOf(key)) != -1) {
keyList.remove(index);
result = valueList.remove(index);
} else {
result = null;
}
return result;
}
}
上列的程式碼使用兩個「ArrayList」物件來儲存鍵值(keyList)和元素值(valueList),鍵值和元素值的型態都宣告為「Object」。以類別圖型來表示這個程式的話,看起來會像這樣:
從類別圖型中,你可以清楚的看出一個軟體系統中全部或局部的類別架構,和類別之間的關聯。
物件圖型
同樣以在討論類別圖型時的「MyMap」類別來說明物件圖型。在類別圖型中,你只能知道類別還有類別彼此之間關聯的架構,「物件圖型、Object Diagrams」用來補充類別圖型,它可以呈現軟體系統「某一個時間點」的物件和物件彼此之間關聯的架構。一般會把它稱為「記憶體的快照、memory snapshot」:
在上列的敘述中,使用「MyMap」類別加入了三個對照資料元素,這個時候可以使用物件圖型來表示目前的物件狀態:
元件圖型
在「元件圖型、Component Diagrams」中,一個包裝過後的Java可執行檔、Java原始程式碼,或是一個套件的包裝檔,都可以當成元件。元件圖型可以隱藏部份細節,更容易表現出軟體系統的架構:
佈署圖型
「佈署圖型、Deployment Diagrams」用來規劃軟體系統開發完成後,提供系統管理人員將元件安裝在實體裝置的圖型。佈署圖型中也可以包含所有軟體系統需要的實體裝置和裝置裡需要的元件,還有使用的通訊協定:
動態圖型
動態圖型用來表示軟體系統中元素之間的互動與合作方式,它們是屬於實作層次的圖型:
循序圖型
「循序圖型、Sequence Diagrams」是互動圖型的一種,它以「時間順序」和「合作物件」為主要的概念,以時間的先後順序來呈現物件之間的合作關係。循序圖型與「合作圖型、Collaboration Diagrams」所顯示的內容同樣都是一組合作物件之間的互動,也都具有順序性,但是循序圖型應該以呈現軟體系統中的「任務」為考量:
合作圖型
「合作圖型、Collaboration Diagrams」與上列討論的循序圖型同樣是互動圖型,所顯示的資訊也很類似,同樣是一組合作物件之間,具有順序性的互動,不過合作圖型的角度是以「關鍵物件」為考量:
狀態圖型
「狀態圖型、Statechart Diagrams」顯示的資訊以「生命週期」為主要的概念,它呈現在軟體系統中的關鍵物件或一組物件,從開始到結束的所有狀態和轉換狀態的條件,顯示這個生命周期的所有資訊:
活動圖型
「活動圖型、Activity Diagrams」顯示以任務為主的活動流程,在活動圖型裡,並不會加入架構圖型的元素,例如「類別節點、Class Node」,它會以類似傳統的流程圖方式來呈現軟體系統的流程;不過在有些時候,為了表現流程之間的物件輸出與輸入,也可以加入「物件節點、Object Node」: