UML類別圖是軟體設計中不可或缺的工具,用於描述系統的靜態結構。理解類別圖中的元素和關係,對於設計穩固且易於維護的系統至關重要。本文從類別可見性開始,逐步探討屬性的定義、操作的規範,最後詳細闡述類別之間的各種關係,並佐以程式碼範例和UML圖表,幫助讀者建立完整的UML類別圖知識體系。釐清私有、受保護和套件可見性在程式碼中的作用,並學習如何利用getter/setter方法實作資料的封裝和驗證。瞭解屬性的完整定義,包含可見性、名稱、資料型別、多重性和初始值,並學習如何使用屬性字串描述衍生屬性。掌握操作的定義,包含引數傳遞機制和傳回值型別,並學習如何在UML圖中準確表示。最後,理解類別之間的關聯、聚合、組合和依賴關係,並學習如何根據實際情況選擇合適的關係型別來描述系統設計。
類別可見性與屬性詳解
在物件導向程式設計中,類別的可見性(Visibility)是控制類別成員(屬性與操作)存取許可權的重要機制。本章節將探討UML類別圖中不同可見性型別的定義、應用場景及其在實際程式設計中的考量。
私有可見性:封裝的核心
私有(Private)可見性是封裝的具體實作,代表類別成員僅能在該類別內部存取,外部程式碼無法直接存取。UML類別圖中使用減號(-)標記私有成員。
內容解密:
saltPPM、chlorinePPM、pH為私有屬性,確保資料封裝。- 提供公開的getter方法(如
getCurSalinity())供外部存取私有屬性。 - 私有操作方法(如
readphSensor())封裝感測器讀取邏輯。
使用私有可見性的好處包括:
- 提高資料安全性,避免直接存取帶來的潛在風險。
- 可透過setter方法進行資料驗證,確保資料一致性。
- 便於維護,當內部實作變更時,不影響外部介面。
受保護可見性:繼承架構的支援
受保護(Protected)可見性介於公開與私有之間,允許子類別存取父類別的受保護成員,但在類別外部仍不可見。UML中使用井號(#)表示。
內容解密:
- 受保護屬性(如
salinityCalibration)允許子類別存取。 - 受保護方法(如
testphSensor())提供給子類別進行感測器測試。
受保護可見性在繼承架構中至關重要,它允許子類別在不破壞封裝的前提下,存取或覆寫父類別的特定成員。
套件可見性:特定語言的實作
套件(Package)可見性主要與Java語言相關,表示類別成員對同一套件內的類別可見。UML使用波浪號(~)標記。
內容解密:
powerSupplyVoltage_c為套件可見屬性。readCurPwrSupplyV()為套件可見方法。
套件可見性有助於組織相關類別,並控制它們之間的存取許可權。
可見性的光譜特性與實務應用
UML定義的可見性型別並非所有程式語言都完全支援,但大多數語言提供了近似的機制。例如:
- C++的
friend宣告可模擬套件可見性。 - Swift中同一原始檔內的私有屬性對所有類別可見。
當語言不支援特定可見性時,可透過命名慣例(如使用prot_字首表示受保護成員)來彌補。
類別屬性詳解
UML類別屬性(Attributes)代表物件的資料儲存,其完整定義包含:
- 可見性(Visibility)
- 名稱(Name)
- 資料型別(Data Type)
- 初始值(Initial Value)
內容解密:
maxItems_c為公開整數屬性,預設值為100。listName為私有字串屬性,用於儲存清單名稱。
適當地使用不同可見性的屬性,並配合公開的存取方法,是實作良好封裝的關鍵。開發者應養成以下習慣:
- 將屬性預設為私有。
- 使用公開的getter/setter方法控制存取。
- 在setter方法中加入必要的驗證邏輯。
綜上所述,正確理解和運用UML類別圖中的可見性和屬性定義,有助於設計出結構清晰、易於維護的軟體系統。
UML 類別圖屬性規範詳解
在 UML 類別圖中,屬性的定義與實作息息相關。本章節將探討屬性的可見性、衍生值、命名規則、資料型別、多重性以及預設值等重要概念。
屬性可見性
屬性的可見性決定了其在類別外部的可存取性。在 UML 中,使用 +、-、# 或 ~ 符號來表示 public、private、protected 和 package 可見性。
內容解密:
-表示 private,確保minNaClLevel和maxNaClLevel只能在類別內部存取。+表示 public,允許外部透過getNaClLevel()方法存取相關資訊。
屬性衍生值
某些屬性值並非直接儲存,而是透過計算得出。在 UML 中,使用 / 符號來標示衍生屬性。
內容解密:
-/NaClRange表示NaClRange是衍生屬性,其值由maxNaClLevel - minNaClLevel計算而得。- 衍生屬性需要明確定義其計算邏輯,通常使用註解或屬性字串來說明。
屬性命名規則
良好的命名規則有助於提高程式碼的可讀性和可維護性。以下是一些建議:
- 名稱應以字母開頭。
- 名稱中只能包含字母、數字和底線。
- 在前 6-8 個字元內應保持唯一性。
- 名稱長度應小於 32 個字元。
- 名稱應具有大小寫中立性。
屬性資料型別
UML 允許為屬性指定資料型別,但並非強制要求。常見的資料型別包括 int、float、char 和 string 等。
內容解密:
sumItems()方法傳回一個int型別的值,表示總和結果。
操作資料型別(傳回值)
操作(方法)也可以指定傳回值的資料型別。在 UML 中,使用冒號 : 後跟資料型別來表示。
屬性多重性
某些屬性可能包含多個值的集合。在 UML 中,使用方括號 [] 來表示多重性。
內容解密:
-tempSensors[1..2]表示tempSensors是一個包含 1 到 2 個元素的整數陣列。- 多重性的表示方法包括固定數值、範圍(如
1..5)、星號*(表示任意數量)或以星號結尾的範圍(如0..*)。
預設屬性值
可以為屬性指定初始值。在 UML 中,使用等號 = 後跟表示式來指定初始值。
內容解密:
-tempSensors[2] : int = {20, 25}表示tempSensors陣列的初始值為{20, 25}。- 當多重性大於 1 時,初始值應以逗號分隔,並置於大括號
{}內。
UML 類別類別關係與屬性操作詳解
UML(統一建模語言)是一種用於軟體開發的標準化建模語言,廣泛應用於系統設計和分析。類別圖表(Class Diagrams)是 UML 的重要組成部分,用於描述系統中的類別、屬性、操作以及類別之間的關係。
屬性語法與初始值
在 UML 類別圖表中,屬性的定義包含可見性、名稱、型別、多重性、初始值和屬性字串等元素。屬性的初始值用於指定其預設值,如圖 6-14 所示。
poolMonitor
-numTempSensors = 2
-tempSensorOffset[2] : double = {32.0, 32.0}
-tempSensorSpan = {100.0, 100.0}
內容解密:
numTempSensors屬性被初始化為整數 2,表示溫度感測器的數量。tempSensorOffset是一個包含兩個雙精確度浮點數的陣列,初始值為{32.0, 32.0},表示溫度感測器的偏移量。tempSensorSpan是一個雙精確度浮點數陣列,初始值為{100.0, 100.0},表示溫度感測器的測量範圍。
屬性字串
UML 提供屬性字串來處理特殊的屬性情況。屬性字串使用大括號 {} 包裹,用於描述屬性的附加資訊,如圖 6-15 所示。
poolMonitor
-minNaClLevel : double
-maxNaClLevel : double
-/NaClRange : double {maxNaClLevel - minNaClLevel}
內容解密:
minNaClLevel和maxNaClLevel分別表示 NaCl 含量的最小和最大值。NaClRange是透過maxNaClLevel和minNaClLevel計算得出的屬性,其值為兩者之差。/符號表示NaClRange是派生屬性,即其值可以從其他屬性計算得出。
類別操作
類別操作(Class Operations)是類別中執行特定動作的方法。操作通常代表類別中的程式碼,用於實作特定的功能,如圖 6-16 所示。
poolMonitor
-sumItems( count:int, items[*]:int ):int
+aveTemp( includeSpa:boolean, startDate:date, numDays:int ):double
+displayTemp( temp:double, inFahrenheit:boolean )
內容解密:
sumItems方法接收兩個引數:count(整數)和items(整數陣列),傳回整數值。aveTemp方法計算平均溫度,引數包括includeSpa(布林值)、startDate(日期)和numDays(整數),傳回雙精確度浮點數。displayTemp方法顯示溫度,引數為temp(雙精確度浮點數)和inFahrenheit(布林值),無傳回值。
引數傳遞機制
UML 中的操作引數預設為輸入引數(in),此外還支援輸出引數(out)和輸入/輸出引數(inout)。如圖 6-17 所示。
poolMonitor
-sortItems( count:int, inout items[*]:int )
內容解密:
sortItems方法接收兩個引數:count(整數)和items(整數陣列,inout)。items為輸入/輸出引數,表示在方法執行過程中既被讀取又被修改。
類別關係
UML 中類別之間的關係包括依賴(Dependency)、關聯(Association)、聚合(Aggregation)、組合(Composition)和繼承(Inheritance)。這些關係的強度從弱到強,如圖 6-18 所示。
Dependency Composition InheritanceAssociation Aggregation
Weaker
Relationship
Stronger
內容解密:
依賴關係:當一個類別的方法需要使用另一個類別的物件時,兩者之間存在依賴關係,如圖 6-19 所示。
userInterface poolMonitor
#### 圖示說明:
- 虛線箭頭表示 `userInterface` 類別依賴於 `poolMonitor` 類別。
2. **關聯、聚合、組合和繼承**:這些關係在 UML 中用於描述類別之間的互動和結構依賴,具有不同的語義和應用場景。
## UML 類別圖:類別關係詳解
在軟體開發中,UML(統一建模語言)類別圖是一種重要的視覺化工具,用於描述系統中的類別及其相互關係。本文將探討 UML 類別圖中的四種主要關係:關聯(Association)、聚合(Aggregation)、組合(Composition)及依賴(Dependency),並詳細分析它們的特點及應用場景。
### 類別關聯關係(Class Association Relationships)
類別關聯關係發生在一個類別包含另一個類別作為其屬性時。這種關係可以透過兩種方式來表示:內嵌屬性(inline attributes)和關聯連結(association links)。
#### 內嵌屬性表示法
內嵌屬性是直接在類別定義中宣告另一個類別作為其屬性。這種方式簡單直接,例如:
```java
public class PoolMonitor {
private PhClass phClass;
// 其他屬性和方法
}
在上述範例中,PoolMonitor 類別包含了一個 PhClass 型別的屬性 phClass,這表示 PoolMonitor 與 PhClass 之間存在關聯關係。
關聯連結表示法
關聯連結使用一條連線來表示兩個類別之間的關聯,並可附上關聯名稱和導航箭頭。例如:
此圖示表示 PoolMonitor 類別與 PhClass 類別之間存在「has」(擁有)的關聯關係。箭頭的方向指示了關聯的方向,即 PoolMonitor 擁有 PhClass。
導航性(Navigability)
導航性用於指示關聯的方向。在 UML 圖中,開放式箭頭指向被包含的類別。例如:
這表示 PoolMonitor 控制 PhClass,並且導航性指示 PoolMonitor 可以存取 PhClass。
#### 內容解密:
- 導航性箭頭:開放式箭頭表示導航的方向,即哪個類別可以存取另一個類別。
- 關聯名稱:描述兩個類別之間的關係,通常使用動詞片語,如「has」或「controls」。
- 類別關係:關聯關係表明一個類別包含或使用另一個類別,但兩者可以獨立存在。
類別聚合關係(Class Aggregation Relationships)
聚合是一種特殊的關聯關係,表示一個類別(整體)控制或包含一組其他類別(部分)。聚合關係使用空心菱形符號來表示。
在這個範例中,PoolMonitor 是整體,而 PhSensor 和 SalinitySensor 是其部分。聚合關係表示 PoolMonitor 控制這兩個感測器,但它們也可以獨立存在。
內容解密:
- 空心菱形符號:表示聚合關係,表明整體與部分之間的控制關係。
- 整體與部分:聚合關係中的整體負責管理其部分,但部分可以獨立於整體存在。
- 存活週期:整體和部分的存活週期不一定相同,部分可以在整體被銷毀後繼續存在。
類別組合關係(Class Composition Relationships)
組合是一種更強的聚合關係,表示部分類別完全依賴於整體類別的存在。組合關係使用實心菱形符號來表示。
@startuml
note
無法自動轉換的 Plantuml 圖表
請手動檢查和調整
@enduml在這個範例中,PoolMonitor 是整體,而 TempHistory、SalinityHistory 和 PHHistory 是其部分。這些歷史記錄類別完全依賴於 PoolMonitor 的存在。
內容解密:
- 實心菱形符號:表示組合關係,表明部分類別完全依賴於整體類別。
- 存活週期繫結:在組合關係中,部分的存活週期與整體繫結,當整體被銷毀時,部分也會被銷毀。
- 資源管理:整體負責分配和釋放與部分相關的資源。
關係特性(Relationship Features)
UML 支援多種關係特性,包括屬性名稱、角色等。這些特性有助於更精確地描述類別之間的關係。
內容解密:
- 屬性名稱:用於描述關聯中的屬性,例如在
PoolMonitor與PhClass的關聯中,屬性名稱可以是「has」。 - 角色:描述類別在關聯中的角色,例如在聚合關係中,
PoolMonitor是控制者,而PhSensor是被控制者。