UML類別圖是軟體設計中不可或缺的工具,用於描述系統的靜態結構。理解類別圖中的元素和關係,對於設計穩固且易於維護的系統至關重要。本文從類別可見性開始,逐步探討屬性的定義、操作的規範,最後詳細闡述類別之間的各種關係,並佐以程式碼範例和UML圖表,幫助讀者建立完整的UML類別圖知識體系。釐清私有、受保護和套件可見性在程式碼中的作用,並學習如何利用getter/setter方法實作資料的封裝和驗證。瞭解屬性的完整定義,包含可見性、名稱、資料型別、多重性和初始值,並學習如何使用屬性字串描述衍生屬性。掌握操作的定義,包含引數傳遞機制和傳回值型別,並學習如何在UML圖中準確表示。最後,理解類別之間的關聯、聚合、組合和依賴關係,並學習如何根據實際情況選擇合適的關係型別來描述系統設計。

類別可見性與屬性詳解

在物件導向程式設計中,類別的可見性(Visibility)是控制類別成員(屬性與操作)存取許可權的重要機制。本章節將探討UML類別圖中不同可見性型別的定義、應用場景及其在實際程式設計中的考量。

私有可見性:封裝的核心

私有(Private)可見性是封裝的具體實作,代表類別成員僅能在該類別內部存取,外部程式碼無法直接存取。UML類別圖中使用減號(-)標記私有成員。

內容解密:

  1. saltPPMchlorinePPMpH 為私有屬性,確保資料封裝。
  2. 提供公開的getter方法(如getCurSalinity())供外部存取私有屬性。
  3. 私有操作方法(如readphSensor())封裝感測器讀取邏輯。

使用私有可見性的好處包括:

  • 提高資料安全性,避免直接存取帶來的潛在風險。
  • 可透過setter方法進行資料驗證,確保資料一致性。
  • 便於維護,當內部實作變更時,不影響外部介面。

受保護可見性:繼承架構的支援

受保護(Protected)可見性介於公開與私有之間,允許子類別存取父類別的受保護成員,但在類別外部仍不可見。UML中使用井號(#)表示。

內容解密:

  1. 受保護屬性(如salinityCalibration)允許子類別存取。
  2. 受保護方法(如testphSensor())提供給子類別進行感測器測試。

受保護可見性在繼承架構中至關重要,它允許子類別在不破壞封裝的前提下,存取或覆寫父類別的特定成員。

套件可見性:特定語言的實作

套件(Package)可見性主要與Java語言相關,表示類別成員對同一套件內的類別可見。UML使用波浪號(~)標記。

內容解密:

  1. powerSupplyVoltage_c 為套件可見屬性。
  2. readCurPwrSupplyV() 為套件可見方法。

套件可見性有助於組織相關類別,並控制它們之間的存取許可權。

可見性的光譜特性與實務應用

UML定義的可見性型別並非所有程式語言都完全支援,但大多數語言提供了近似的機制。例如:

  • C++的friend宣告可模擬套件可見性。
  • Swift中同一原始檔內的私有屬性對所有類別可見。

當語言不支援特定可見性時,可透過命名慣例(如使用prot_字首表示受保護成員)來彌補。

類別屬性詳解

UML類別屬性(Attributes)代表物件的資料儲存,其完整定義包含:

  1. 可見性(Visibility)
  2. 名稱(Name)
  3. 資料型別(Data Type)
  4. 初始值(Initial Value)

內容解密:

  1. maxItems_c 為公開整數屬性,預設值為100。
  2. listName 為私有字串屬性,用於儲存清單名稱。

適當地使用不同可見性的屬性,並配合公開的存取方法,是實作良好封裝的關鍵。開發者應養成以下習慣:

  • 將屬性預設為私有。
  • 使用公開的getter/setter方法控制存取。
  • 在setter方法中加入必要的驗證邏輯。

綜上所述,正確理解和運用UML類別圖中的可見性和屬性定義,有助於設計出結構清晰、易於維護的軟體系統。

UML 類別圖屬性規範詳解

在 UML 類別圖中,屬性的定義與實作息息相關。本章節將探討屬性的可見性、衍生值、命名規則、資料型別、多重性以及預設值等重要概念。

屬性可見性

屬性的可見性決定了其在類別外部的可存取性。在 UML 中,使用 +-#~ 符號來表示 public、private、protected 和 package 可見性。

內容解密:

  • - 表示 private,確保 minNaClLevelmaxNaClLevel 只能在類別內部存取。
  • + 表示 public,允許外部透過 getNaClLevel() 方法存取相關資訊。

屬性衍生值

某些屬性值並非直接儲存,而是透過計算得出。在 UML 中,使用 / 符號來標示衍生屬性。

內容解密:

  • -/NaClRange 表示 NaClRange 是衍生屬性,其值由 maxNaClLevel - minNaClLevel 計算而得。
  • 衍生屬性需要明確定義其計算邏輯,通常使用註解或屬性字串來說明。

屬性命名規則

良好的命名規則有助於提高程式碼的可讀性和可維護性。以下是一些建議:

  1. 名稱應以字母開頭。
  2. 名稱中只能包含字母、數字和底線。
  3. 在前 6-8 個字元內應保持唯一性。
  4. 名稱長度應小於 32 個字元。
  5. 名稱應具有大小寫中立性。

屬性資料型別

UML 允許為屬性指定資料型別,但並非強制要求。常見的資料型別包括 intfloatcharstring 等。

內容解密:

  • 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}

內容解密:

  1. numTempSensors 屬性被初始化為整數 2,表示溫度感測器的數量。
  2. tempSensorOffset 是一個包含兩個雙精確度浮點數的陣列,初始值為 {32.0, 32.0},表示溫度感測器的偏移量。
  3. tempSensorSpan 是一個雙精確度浮點數陣列,初始值為 {100.0, 100.0},表示溫度感測器的測量範圍。

屬性字串

UML 提供屬性字串來處理特殊的屬性情況。屬性字串使用大括號 {} 包裹,用於描述屬性的附加資訊,如圖 6-15 所示。

poolMonitor
-minNaClLevel : double
-maxNaClLevel : double
-/NaClRange : double {maxNaClLevel - minNaClLevel}

內容解密:

  1. minNaClLevelmaxNaClLevel 分別表示 NaCl 含量的最小和最大值。
  2. NaClRange 是透過 maxNaClLevelminNaClLevel 計算得出的屬性,其值為兩者之差。
  3. / 符號表示 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 )

內容解密:

  1. sumItems 方法接收兩個引數:count(整數)和 items(整數陣列),傳回整數值。
  2. aveTemp 方法計算平均溫度,引數包括 includeSpa(布林值)、startDate(日期)和 numDays(整數),傳回雙精確度浮點數。
  3. displayTemp 方法顯示溫度,引數為 temp(雙精確度浮點數)和 inFahrenheit(布林值),無傳回值。

引數傳遞機制

UML 中的操作引數預設為輸入引數(in),此外還支援輸出引數(out)和輸入/輸出引數(inout)。如圖 6-17 所示。

poolMonitor
-sortItems( count:int, inout items[*]:int )

內容解密:

  1. sortItems 方法接收兩個引數:count(整數)和 items(整數陣列,inout)。
  2. items 為輸入/輸出引數,表示在方法執行過程中既被讀取又被修改。

類別關係

UML 中類別之間的關係包括依賴(Dependency)、關聯(Association)、聚合(Aggregation)、組合(Composition)和繼承(Inheritance)。這些關係的強度從弱到強,如圖 6-18 所示。

Dependency Composition InheritanceAssociation Aggregation
Weaker 
Relationship 
Stronger

內容解密:

  1. 依賴關係:當一個類別的方法需要使用另一個類別的物件時,兩者之間存在依賴關係,如圖 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,這表示 PoolMonitorPhClass 之間存在關聯關係。

關聯連結表示法

關聯連結使用一條連線來表示兩個類別之間的關聯,並可附上關聯名稱和導航箭頭。例如:

此圖示表示 PoolMonitor 類別與 PhClass 類別之間存在「has」(擁有)的關聯關係。箭頭的方向指示了關聯的方向,即 PoolMonitor 擁有 PhClass

導航性(Navigability)

導航性用於指示關聯的方向。在 UML 圖中,開放式箭頭指向被包含的類別。例如:

這表示 PoolMonitor 控制 PhClass,並且導航性指示 PoolMonitor 可以存取 PhClass

#### 內容解密:

  1. 導航性箭頭:開放式箭頭表示導航的方向,即哪個類別可以存取另一個類別。
  2. 關聯名稱:描述兩個類別之間的關係,通常使用動詞片語,如「has」或「controls」。
  3. 類別關係:關聯關係表明一個類別包含或使用另一個類別,但兩者可以獨立存在。

類別聚合關係(Class Aggregation Relationships)

聚合是一種特殊的關聯關係,表示一個類別(整體)控制或包含一組其他類別(部分)。聚合關係使用空心菱形符號來表示。

在這個範例中,PoolMonitor 是整體,而 PhSensorSalinitySensor 是其部分。聚合關係表示 PoolMonitor 控制這兩個感測器,但它們也可以獨立存在。

內容解密:

  1. 空心菱形符號:表示聚合關係,表明整體與部分之間的控制關係。
  2. 整體與部分:聚合關係中的整體負責管理其部分,但部分可以獨立於整體存在。
  3. 存活週期:整體和部分的存活週期不一定相同,部分可以在整體被銷毀後繼續存在。

類別組合關係(Class Composition Relationships)

組合是一種更強的聚合關係,表示部分類別完全依賴於整體類別的存在。組合關係使用實心菱形符號來表示。

@startuml
note
  無法自動轉換的 Plantuml 圖表
  請手動檢查和調整
@enduml

在這個範例中,PoolMonitor 是整體,而 TempHistorySalinityHistoryPHHistory 是其部分。這些歷史記錄類別完全依賴於 PoolMonitor 的存在。

內容解密:

  1. 實心菱形符號:表示組合關係,表明部分類別完全依賴於整體類別。
  2. 存活週期繫結:在組合關係中,部分的存活週期與整體繫結,當整體被銷毀時,部分也會被銷毀。
  3. 資源管理:整體負責分配和釋放與部分相關的資源。

關係特性(Relationship Features)

UML 支援多種關係特性,包括屬性名稱、角色等。這些特性有助於更精確地描述類別之間的關係。

內容解密:

  1. 屬性名稱:用於描述關聯中的屬性,例如在 PoolMonitorPhClass 的關聯中,屬性名稱可以是「has」。
  2. 角色:描述類別在關聯中的角色,例如在聚合關係中,PoolMonitor 是控制者,而 PhSensor 是被控制者。