# 認識 UML

# 統一建模語言

UML (Unified Modeling Language) 是建構模式 (model) 的專用語言。
在編寫程式碼前,開發人員會先經過分析設計的思考,並繪製一些圖形,再搭配一些文字,作為分析設計的產出,這份產出可稱之為軟體模式模型。

# UML 圖

UML 推出了十多款圖,不過並非每款圖都實用,在開發商用資訊系統時,最常用到的 UML 圖,包含有:類別圖、循序圖、使用案例圖、狀態圖 (state machine diagram) 和活動圖 (activity diagram)。

# 簡易的開發程序

實務上, 使用案例圖及敘述類別圖循序圖 三者之搭配,幾乎是 UML 專案的基本型,所以在分工或外包的設計文檔中,通常少不了這三款 UML 圖。

最常見的開發程序是,並行建構使用案例圖文與類別圖,接著才建構循序圖以及按圖編碼。

一個系統只有一個內部結構,而且系統對外提供的所有服務,都僅依賴這個系統穩定的內部結構所支撐。
然而,每一項服務的運作方式皆不同,所以雖然系統僅有一個靜態結構,卻可以有很多個動態行為

因此,透過 UML 圖來呈現系統的狀況時,一個系統僅有一張呈現系統內部結構的類別圖,而且無論使用案例圖中有多少個使用案例。
但是,每一個使用案例至少對應一張循序圖,呈現出系統執行使用案例期間,其內部的一群物件互動的運作情況。

再者,類別圖通常不是一次就能夠設計完全,而是透過一個又一個的使用案例,以及一張又一張的循序圖,三者經過多次循環更新的歷程後,類別圖才能逐步形成且穩定下來。

# 類別圖

類別圖 (class diagram) 是最重要的 UML 圖。

主要功能:

用來呈現系統內部的靜態結構,而這樣的靜態結構通常可以用直接對應程式碼,因此,從程式設計師的角度來看,類別圖是最被關注的 UML 圖。

類別圖描述了系統的類別集合,類別的屬性和類別之間的關係。

  • 矩形代表類別 (class)、類別內部記載屬性 (attribute) 與操作 (operation)。

  • 類別之間有代表結合關係 (association relationship) 的實線、組合關係 (composition relationship) 的實心菱形實線、一般化關係 (generalization relationship) 的三角形實線。

  • 類別圖符號分成兩種:

    • 物件本身
    • 物件與物件的關係
  • 物件本身

    + : public
    - : private
    # : protected
    
  • 物件間的關係

    • association relationship 結合關係
      # 使一個類別知道另一個類別屬性和方法。 // 通常含有「知道」、「了解」的含義。

      (A knows B)

    • dependency relationship 依賴關係
      # 指在參數或回傳時有用到

      (A uses B)

    • Implementation relationship 實作關係
      # 指的是一個 class 類別實現 interface 介面

      (A implements B)

    • generalization relationship 一般化關係
      # 指的是父類別擁有子類別的共用功能,子類別可以視作父類別的特例。
      # 描述 is-a 關係。

      (A is a type of B)

    • aggregation relationship 聚合關係
      # 整體與部分的「弱」包含關係,部分類別可以單獨存在,也可以屬於多個整體物件。
      # 描述 has-a 關係。

      (A owns B)

    • composition relationship 組合關係
      # 整體與部分的「強」包含關係,部分類別無法單獨存在,其生命週期與整體相同。
      # 描述 contains-a 關係。

      (B is part of A)

    多重性 (Multiplicity)

      | 指示符  | 意思    |
      | ------ | ------- |
      | 0...1  | 0 or 1  |
      | 1      | 1       |
      | 0...*  | 0 or 多 |
      | 1...*  | 1 or 多 |
      | *      | 多      |
    

image class diagram

image class diagram

# 循序圖

循序圖 (sequence diagram) 將類別圖部分更細節。

主要功能:

呈現類別圖操作之實作方法。
在類別圖中,未能提出操作之實作方法,這部分的細節設計,可藉由循序圖來呈現。雖然,我們可以從類別圖對應到程式中的類別、屬性、關係及操作之宣告,但也僅止於此,對於操作的實作方法,還要搭配循序圖才能獲得。

除了表達實作方法外,更重要的是,循序圖還能夠表達執行期間的一群物件,為了合力完成某一個目的,呼叫操作之互動情況

![image sequence diagram][reference link]

# 使用案例圖

使用案例圖 (use case diagram) 是最與眾不同的 UML 圖。

主要功能:

獨特之處在於它適合用來表達系統的「外部」行為,其餘的 UML 圖都適用於呈現系統內部結構或行為。其餘的 UML 圖都是用於呈現系統的「內部」結構或行為。

橢圓形的使用案例圖示位於系統內部,代表系統將提供且支援這些使用案例,而參與者位於系統外部,代表使用案例的啟動者或支援者。

![image use case diagram][reference link]

# 狀態圖

狀態圖 (state machine diagram)

主要功能:

狀態圖可以讓我們聚焦在單一種類的物件本身,表達物件一生中可以出現的狀態 (state) 變化。

相較之下,狀態圖的觀點與循序圖的觀點全然不同,循序圖表達某一種物件與其他種物件之間的互動情況。
簡而言之,循序圖用以表達物件外部互動行為,而狀態圖表達物件內部的狀態變化。

![image use case diagram][reference link]

# 活動圖

活動圖 (activity diagram)

主要功能:

活動圖非常適合用來表達一連串的行動。

活動圖相當容易理解與使用,它跟我們隨手繪製的流程圖沒什麼不同,唯一需要講究的只有它特定的圖示。

在企業組織領域裡,我們經常用它來表達工作流程、企業流程或聯合服務等的活動流程。
至於資訊系統的應用上,遇到較為複雜的系統流程、整合流程及操作時,我們也會配合使用活動圖協助思考及設計。
其他時候,為了節省開發成本與縮短開發時程,可能僅採用循序圖來表達系統內部物件的互動情況。

![image use case diagram][reference link]

# UML 工具

  • StarUML
  • IBM RSA
  • Case Complete