返回文章列表

UML 類別圖與互動圖表詳解

本文探討 UML 類別圖和互動圖表的關鍵概念,包括關聯、多重性、排序、約束、導航性、繼承、訊息傳遞機制、順序圖、協作圖等。透過泳池監控系統的示例,闡述瞭如何使用 UML 圖表有效地建模軟體系統的靜態結構和動態行為。

軟體設計 UML

UML 類別圖是軟體設計中重要的工具,用於描述系統的靜態結構。本文詳細介紹了類別圖中的關聯、多重性、排序、約束和導航性等核心概念,並以泳池監控系統為例,說明如何應用這些概念來建立清晰的類別圖模型。此外,文章還探討了 UML 互動圖表,特別是順序圖,深入剖析了訊息型別、訊息標籤、守衛條件、迭代和時間約束等重要機制,並結合程式碼範例,展示瞭如何使用順序圖來描述和分析系統中物件之間的互動行為。理解和掌握這些 UML 圖表和相關概念,對於軟體開發者來說至關重要,有助於提升系統設計的效率和品質。

UML 類別圖關聯特性詳解

在 UML 類別圖中,關聯(Association)、相依(Dependency)、聚合(Aggregation)及組合(Composition)等關係均具備多種特性。這些特性包括介面規範(Interface Specifiers)、可見性(Visibility)、重數(Multiplicity)、排序(Ordering)、約束(Constraints)、限定詞(Qualifiers)、導航性(Navigability)及可變性(Changeability)。本文將逐一探討這些特性。

關聯名稱與屬性名稱

關聯名稱描述了兩個類別之間的關係,但並未說明它們如何相互參照。類別之間透過屬性或運算欄位來參照對方。圖 6-25 展示了兩種等效的表示方法:簡寫與詳細表示。

在簡寫表示法中,缺少屬性名稱及可見性符號(- 表示私有)。可透過在關聯鏈結上新增屬性名稱來補充這些資訊,如圖 6-26 所示。

屬性名稱由屬性或運算名稱字首可見性符號(-、~、# 或 +)組成。可見性符號的存在使屬性名稱與角色名稱有所區別。

角色

角色名稱通常出現在關聯鏈結的兩端,用於描述類別之間的互動行為。例如,在圖 6-28 中,poolMonitor 類別透過 pHSensor 屬性讀取 pHClass 的值,而 pHClass 則提供 pH 讀數。角色名稱「讀取 pH」和「提供 pH」明確描述了這兩者的互動關係。

介面規範

介面是一組由特定類別預期實作的操作集合,類別似於只包含抽象成員函式的抽象基底類別。實作介面的類別必須提供介面中定義的所有操作。UML 1.x 支援介面規範,但已在 UML 2.0 中棄用。

介面可用原型(Stereotype)或球形符號表示,如圖 6-29 所示。若要表示類別實作某介面,可從類別繪製一條帶有空心箭頭的虛線至介面圖示,如圖 6-30 所示。

可見性

關聯鏈結中的屬性名稱必須以可見性符號(-、~、# 或 +)為字首,以指定其可見性。這與內嵌屬性宣告中的可見性規範一致。

重數

重數可用於關聯圖中,指定參與關聯的物件數量,如圖 6-31 所示。將重數值置於鏈結旁邊,靠近相關的類別。若未提供重數,則預設為 1。

重數範例與其解說

classDiagram
    class poolMonitor {
        -pHSensor: pHClass
    }
    class pHClass {
        +readSensor(): double
    }
    poolMonitor "1" --> "1" pHClass : has

重數內容解密:

此 Plantuml 圖表展示了一個 poolMonitor 類別與 pHClass 之間的關聯。poolMonitor 具有一個私有屬性 pHSensor,型別為 pHClass。關聯的重數表明,一個 poolMonitor 對應一個 pHClass。此結構表示 poolMonitor 透過 pHSensorpHClass 互動。

其他特性簡介

除了上述特性外,UML 關聯還支援排序、約束、限定詞、導航性及可變性等特性。這些特性進一步豐富了類別之間關係的描述,使 UML 圖能夠更精確地表達複雜系統的設計。

UML 特性概覽圖表

此圖表內容解密:

此圖表展示了 UML 關聯的各種特性。每個特性都對應著不同的模型元素或關係屬性,有助於全面描述系統的靜態結構。

綜上所述,UML 類別圖提供了豐富的機制來描述類別之間的複雜關係。掌握這些特性有助於開發者更準確地建模軟體系統,促進團隊溝通與設計最佳化。

UML 類別圖深入解析:關聯與多重性

在軟體開發與系統設計中,UML(統一建模語言)類別圖扮演著至關重要的角色,尤其是在描述系統中類別之間的靜態結構關係時。本文將探討 UML 類別圖中的關聯(Association)概念,特別是多重性(Multiplicity)、排序(Ordering)、約束(Constraints)及導航性(Navigability)等進階主題。

多重性:描述類別間的數量關係

多重性是指一個類別的例項與另一個類別的例項之間可以存在多少個關聯。在 UML 類別圖中,多重性透過數字或數字範圍表示,常見的表示法包括 10..11..**

一對多關係

考慮一個泳池監控系統的例子,其中 poolMonitor 類別與 pHSensor 類別之間存在一對多的關係。這意味著一個 poolMonitor 物件可以關聯到多個 pHSensor 物件,分別監測不同泳池或區域的 pH 值。

此圖示表明,一個 poolMonitor 可以有多個 pHSensor,反映了實際應用中的需求。

多對多關係

在某些情況下,兩個類別之間可能存在多對多的關係。例如,在一個擁有多個泳池的水上樂園中,每個 poolMonitor 可能需要監控多個 pHClass(代表不同泳池的 pH 狀態),而每個 pHClass 也可能被多個 poolMonitor 監控。

排序與約束:精確控制關聯行為

UML 提供了 {ordered} 約束,允許開發者指定關聯中的物件是否具有特定的順序。此外,還可以定義自定義約束來進一步控制關聯行為。

有序關聯

在某些應用中,保持物件的順序是非常重要的。例如,在記錄溫度歷史資料時,可能需要根據時間順序來儲存和檢索資料。

此例中,tempHistoryClass 物件根據日期和時間排序,確保了資料的時序正確性。

資格符(Qualifiers):最佳化資料存取

資格符是一種特殊的建構,用於最佳化對關聯物件的存取。它類別似於資料函式庫中的索引或鍵,可以快速定位到特定的物件。

使用資格符最佳化查詢

假設需要在大量的溫度歷史記錄中查詢特定日期或時間的資料,可以使用資格符來提高查詢效率。

透過使用 date_time 作為資格符,可以直接存取特定日期和時間的溫度記錄,而無需遍歷整個資料集。

導航性:定義資訊流動方向

導航性是指在 UML 類別圖中定義類別之間資訊流動的方向。預設情況下,關聯是雙向導航的,但可以透過新增箭頭來指定單向導航。

指定導航方向

在某些情況下,需要明確指定資訊的流動方向,以避免混淆和提高系統的可維護性。

此例中,資訊從 poolMonitor 流向 tempHistoryClass,明確了資料記錄的方向。

UML 互動圖表

互動圖表(Interaction Diagrams)主要用於建模系統中不同物件(參與者)之間的互動操作。UML 中主要有三種互動順序圖(Sequence Diagrams)、協作圖(Collaboration/Communication Diagrams)及計時圖(Timing Diagrams)。本章節將著重介紹順序圖,並簡要討論協作圖。

順序圖

順序圖用於展示參與者(角色、物件)之間的互動順序。與活動圖(Activity Diagrams)不同的是,活動圖描述單一物件的操作細節,而順序圖則將多個活動圖結合起來,展示多個操作的執行順序。從設計角度來看,順序圖比活動圖更具資訊量,能夠展示系統的整體架構。

生命線

在順序圖的頂部,會繪製參與者集合,使用矩形或人物圖示表示。然後從每個參與者向下繪製一條虛線,代表該物件的生命線(Lifelines)。生命線表示時間的流逝,從最早(最頂端)的執行點到最晚(最底端)的執行點。

此圖示展示了一個基本的順序圖,其中生命線表示參與者隨時間的互動。

內容解密:

  1. 參與者表示:使用矩形或人物圖示來代表不同的參與者,如 UserpMon:poolMonitorpump:pumpCtrlr
  2. 生命線:虛線表示參與者的生命週期,展示時間的流逝。
  3. 互動順序:箭頭表示參與者之間的訊息傳遞,展示操作的執行順序。

協作圖

協作圖主要用於展示物件之間的互動關係,強調參與者之間的合作。雖然本章節主要聚焦於順序圖,但瞭解協作圖的基本概念同樣重要。

UML 中的類別關係詳解

在 UML 中,各種類別之間的關係對於軟體設計至關重要。本章節將探討類別關係中的導航性、變更性和繼承關係。

導航性

導航性表示類別之間關聯的方向性,指示訊息流動的方向。在 UML 圖中,可以使用箭頭來表示導航性。

內容解密:

  1. 導航性箭頭:箭頭表示從 poolMonitorpHClass 的單向導航。
  2. 屬性成員poolMonitor 包含 pHSensor 屬性,表示其對 pHClass 的參考。
  3. 無反向參考pHClass 沒有屬性可以直接參考 poolMonitor

變更性

變更性約束(如 {frozen})用於指定資料集在建立後是否可以被修改。例如,在歷史記錄範例中,可以使用 {frozen} 約束來確保溫度記錄不可修改。

內容解密:

  1. {frozen} 約束:確保歷史記錄一旦建立便不可修改。
  2. orderedsorted by date/time:表示記錄按照日期和時間排序。
  3. 不可變性:透過 {frozen} 保證資料的一致性和完整性。

繼承關係

繼承是類別之間最強的一種關係,表示子類別繼承父類別的所有屬性和操作。使用空心箭頭來表示繼承關係。

內容解密:

  1. 繼承箭頭:空心箭頭指向父類別 poolMonitor
  2. 子類別mainPoolMonitorspaMonitor 繼承了 poolMonitor 的屬性和操作。
  3. 擴充套件功能:子類別可以在繼承的基礎上新增或修改功能。

UML 互動圖表詳解:順序圖中的訊息傳遞機制

在軟體設計中,UML(統一建模語言)的互動圖表扮演著至關重要的角色,特別是在描述系統中物件之間的互動行為時。其中,順序圖(Sequence Diagram)是一種特別有用的互動圖表,用於展示物件間訊息傳遞的時間順序和邏輯流程。本文將探討順序圖中的訊息型別、訊息標籤、訊息編號、守衛條件、迭代以及時間約束等關鍵概念,並透過具體例項進行詳細解析。

訊息型別

在順序圖中,物件之間的通訊以訊息的形式呈現。訊息由一個箭頭表示,箭頭的方向指示了訊息的流向。UML 2.0 中定義了四種主要的訊息型別:

  1. 同步訊息(Synchronous Message):這是最常見的訊息型別,代表著一個典型的呼叫/傳回操作。傳送者暫停執行,直到接收者傳回控制權。

  2. 傳回訊息(Return Message):用於表示從同步訊息傳回到訊息傳送者的控制流程。雖然傳回訊息是可選的,但在某些情況下,它們可以幫助闡明控制流程。

  3. 非同步訊息(Asynchronous Message):非同步訊息觸發接收者執行某些程式碼,但傳送者無需等待傳回訊息即可繼續執行。

  4. 扁平訊息(Flat Message):用於當訊息的型別(同步或非同步)對於設計並不重要時,可以使用扁平訊息。需要注意的是,扁平訊息是 UML 1.x 的概念,在 UML 2.0 中已被非同步訊息所取代。

內容解密:

  • 此圖示展示了一個簡單的順序圖,描述了使用者、泳池監控器(pMon)和泵控制器(pump)之間的互動。
  • 使用者傳送一個「選擇立即清潔」的同步訊息給 pMon
  • pMon 接著傳送一個「開啟泵」的同步訊息給 pump
  • pump 執行後傳回一個布林值給 pMon,表示操作成功與否。
  • 最後,pMon 傳回控制權給使用者。

訊息標籤與編號

為了清晰地表達訊息的含義和執行順序,順序圖中的每個訊息都需要附上標籤。這些標籤可以用來描述訊息的操作名稱、引數和傳回值。此外,為了進一步闡明執行順序,可以為每個訊息新增編號。

內容解密:

  • 此順序圖展示了帶有編號的訊息標籤,清晰地指出了操作的執行順序。
  • 使用者首先呼叫 pMon立即清潔() 方法。
  • pMon 接著呼叫 pump泵(100) 方法,並期望傳回一個布林值。
  • pump 傳回 truepMon,表示泵已成功開啟。
  • 最後,pMon 傳回控制權給使用者。

守衛條件與迭代

在順序圖中,可以使用守衛條件來控制訊息的傳送。守衛條件是一種布林表示式,只有當其評估為真時,相關的訊息才會被傳送。此外,還可以使用迭代來指定訊息的重複執行次數。

內容解密:

  • 在此例中,pMon 傳送 泵(100) 訊息給 pump 的前提是 泵電源 狀態為開啟。
  • 如果 泵電源 為關閉狀態,則不會傳送 泵(100) 訊息,相應的傳回操作也不會執行。

內容解密:

  • 此圖示展示了一個迭代操作,pMon 重複呼叫 pump泵功率和延遲(i) 方法,共計100次。
  • 這種迭代機制可用於逐步調整泵的功率,從而在一定時間內達到滿功率運轉。

時間約束與長延遲

在某些情況下,設計者可能需要強調某個操作的執行時間較長,或者對操作的執行時間有所限制。順序圖允許透過特定的標記來表示這些時間約束。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title UML 類別圖與互動圖表詳解

package "資料視覺化流程" {
    package "資料準備" {
        component [資料載入] as load
        component [資料清洗] as clean
        component [資料轉換] as transform
    }

    package "圖表類型" {
        component [折線圖 Line] as line
        component [長條圖 Bar] as bar
        component [散佈圖 Scatter] as scatter
        component [熱力圖 Heatmap] as heatmap
    }

    package "美化輸出" {
        component [樣式設定] as style
        component [標籤註解] as label
        component [匯出儲存] as export
    }
}

load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export

note right of scatter
  探索變數關係
  發現異常值
end note

@enduml

內容解密:

  • 圖中展示了一個帶有時間約束的操作:排程清潔()
  • 從計時器模組到 pMon 的訊息箭頭稍微向下傾斜,表示這是一個耗時操作。
  • {時間不超過12小時} 的註解進一步強調了對該操作執行時間的限制。

綜上所述,UML 的順序圖提供了一種強大的工具,用於描述和分析系統中物件之間的互動行為。透過對不同型別的訊息、標籤、編號、守衛條件、迭代以及時間約束的靈活運用,可以建立出既清晰又具有表達力的互動模型。這對於軟體設計者和開發人員來說,是理解和最佳化系統架構的重要基礎。