「類別圖型、Class Diagrams」使用圖型的表示法來顯示軟體系統中類別的內容,還有類別和類別之間的關聯,它呈現的是一個靜態的類別架構。
「類別節點、Class Node」是用來表示一個Java類別的基本單位,它可以用來表示Java程式語言中三種基本單位:類別(class)、抽象類別(abstract class)和介面(interface)。
樣式
使用類別節點表示類別的時候,可以根據你想要表現的詳細程度,以不同的樣式來呈現這個類別,以下列的類別節點來說,它顯示類別節點的三個區格:
一個詳細表現的類別節點分成上、中、下三個區格(compartments),分別代表「類別名稱」、「屬性宣告」和「方法宣告」,有了這個詳細的類別節點以候,就可以宣告出下列的類別:
public class Calculator {
private static final char NO_OP = '\0';
private static final char PLUS = '+';
private static final char SUBTRACT = '-';
private static final char MULTIPLY = '*';
private static final char DIVIDE = '/';
private float number1 = 0.0F;
private char operator = NO_OP;
public String opEquals(String number) {…}
public String opAdd(String number) {…}
public String opSubtract(String number) {…}
public String opMultiply(String number) {…}
public String opDivide(String number) {…}
private float performOperation(float number2) {…}
protected static float parseNumber(String number) {…}
}
但是如果你要顯示比較多的類別,又不想讓整個類別圖型太複雜時,可以省略「屬性宣告」和「方法宣告」區格,這樣的表示方式並不代表這個類別沒有屬性和方法的宣告:
上列的圖型呈現了三個類別的宣告:
public class Calculator {…}
public class CalculatorScreen extends SwingScreen {…}
public class CalculatorGUI {…}
類別名稱區格除了類別名稱外,還可以填入附加的資訊,用來表示類別的特性或是額外的說明。例如抽象類別:
上列用來表示抽象類別的類別節點是目前比較建議的作法,舊有的方式是將類別名稱使用「斜體字」來表示抽象類別,不過因為斜體字與一般字體比較不容易分辨,建議使用上一種作法:
有時候可能會希望在類別節點上顯示一些額外的資訊,例如作者或原始檔名,你可以使用下列的方式來表示:
以上列圖中的訊息來說,真正對程式設計師有用的並不多,除了最後一個「public」,與表示抽象類別時一樣,你如果省略值的指定,表示值為預設的「true」,所以「public=true」告訴你這個類別的存取範圍要宣告為「public」外,其它的部份大概也只能放到註解裡而已。
如果要表示某一個類別節點是一個介面的話,就會使用到「Stereotypes」:
UML制定了許多「Stereotypes」,它指的是在「<<」和「>>」裡填入特定的標示,來表示特殊的意義。想要單純的以圖型和線條來呈現一個軟體系統是不夠的,所以就產生了「Stereotypes」,包含「物件限制語言、Object Constraint Language」,一般會簡稱為「OCL」,也是另外一種用來加強圖型資訊的規格。
上列用來表示介面的「\<\>」是Stereotypes的一種。另外也可以使用Stereotypes來表示某個類別特殊的角色,下列的圖型是一般常見的「MVC Design Pattern」,是一種關於使用者操作介面的設計模式:
不論是類別、抽象類別或是介面,都可以省略「屬性宣告」和「方法宣告」區格,讓你把軟體系統中比較多的類別節點顯示出來,更完整的呈現出軟體系統架構。下列的圖形是一個模擬計算機的類別架構,不過都省略了「屬性宣告」和「方法宣告」區格:
在各種樣式當中,「介面」有一種比較特殊的表示方式,這是為了讓比較大型的類別圖型,可以增加可讀性的一種作法:
屬性區格
在屬性區格中可以完整的告訴你關於屬性宣告的資訊,在區格裡使用下列的語法來宣告屬性:
- 存取範圍:
- 屬性名稱:使用Java程式語言中合法的識別字。
數量和順序性:
- 數字:確定的數量
- *:零到多個
- 0..*:零到多個
- 0..1:零到一個
- 1..*:一到多個
n..m:最少n個,最多m個
當屬性的數量是一個以上的時候,你可以使用順序性的宣告來表示這個屬性的值是否需要排序,使用下列兩個關鍵字:
Unordered:不需要排序
- Ordered:需要排序
- 型態:屬性的資料型態,使用八種基本資料型態或類別名稱。
- 初始值:可選擇性的宣告,為屬性宣告一個合法的初始值。
以下列的類別節點來說明關於屬性宣告的資訊:
屬性區格在屬性的定義,把屬性的名稱放在型態之前,中間使用冒號「:」隔開,這樣的前後順序與Java的語法是相反的。下列是Java宣告屬性敘述與屬性區格中屬性定義的對照:
下列是屬性數量和順序性宣告的範例:
除了屬性的定義外,你可能也想表示某些屬性的特性,例如某些屬性是主要的鍵值。想要表示這些額外的特性,同樣是使用「Stereotypes」:
UML中並沒有關於「final」屬性的表示方法,你可以依照Java的命名慣例來判斷是否要加上「final」的宣告,它們的屬性名稱應該都是大寫,字與字之間使用底線連接。
方法區格
在方法區格中可以完整的告訴你關於方法宣告的資訊,在區格裡使用下列的語法來宣告方法:
在宣告方法的語法中:
- 存取範圍:
- 方法名稱:使用Java程式語言中合法的識別字。
- 參數:可選擇性的宣告,是一個使用逗號分隔的清單,使用下列的語法來宣告方法的參數:
- 種類:可選擇性的宣告,在Java實作上通常會省略,但是如果特別加上「in」的宣告,就要把這個參數宣告為「final」。
- 參數名稱:使用Java程式語言中合法的識別字。
- 參數型態:參數的資料型態,使用八種基本資料型態或類別名稱。
- 回傳型態:方法回傳值的資料型態,使用八種基本資料型態或類別名稱。
以下列的類別節點來說明關於方法宣告的資訊:
方法區格在參數的定義,把名稱放在型態之前,中間使用冒號「:」隔開,這樣的前後順序與Java的語法是相反的。下列是Java宣告方法敘述與方法區格中方法定義的對照:
與屬性區格一樣,你也可以使用「Stereotypes」來標示某些方法的特性:
在上面兩個範例中都沒有提到「抽象方法、Abstract methods」,一個只有宣告沒有實作的方法。在方法區格中使用斜體字來表示抽象方法: