設計建模 2 大概念- UML 分類、使用

設計建模 2 大概念- UML 分類、使用

UML 文章前導

在本文中,我們將深入介紹 UML(Unified Modeling Language)的各個方面,為您提供全面的了解和實用的知識。 從 UML 的基礎概念開始,我們將逐一探討使用案例圖、類別圖、序列圖、協作圖、狀況轉換圖、元件圖、部署圖等主題。 透過簡單的範例程式和圖示,我們將以清晰易懂的方式解釋UML 的關鍵概念,並深入研究UML 類別之間的各種關係,如類的可見性、Association(Field 關係)、Dependency(返回 、呼叫、創建)、泛化(Generalization)、實現(Realization)和聚集(Aggregation)等。

最後,我們還將涉及一些其他延伸概念,例如類別的多重性(Multiplicity),以幫助您更全面地理解和應用 UML

無論您是初學者還是有一定經驗的軟體開發人員,本文都將為您提供有價值的信息,使您能夠更好地理解和運用 UML,從而提高軟體設計的品質和效率


UML 分類簡介

UML (Unified Modeling Language) 是一種定義良好、不分語言、功能強大的 視覺化建模語言,其目標是為開發團隊提供標準通用的物件導向設計通用語

而 UML 並不只有一種圖示,我們可以 依照不同角色、狀況選用不同圖示(框圖) ,主要 UML 分類包含如下

UML 分類說明
用例圖(Use Case Diagram從 使用者角度 描述系統功能
類別圖(Class Diagram描述物件模型中,類與類之間的關係
序列圖(Sequence Diagram)、協作圖(Cooperation Diagram描述物件之間的 互動關係,並強調 時間順序
狀態轉換圖(State Transition Diagram描述一個物件在某些條件下的狀態切換
組件圖(Component Diagram以較上層的角度描述軟體元件之間的關係,也可以描述軟體程式的 結構圖
佈署圖(Deployment Diagram描述軟體 與硬體的物理結構

用例圖 Use Case Diagram

● 用例圖(Use Case Diagram)包含以下內容用例圖包含以下內容

內容說明補充
角色角色乃是 系統邊界,就是使用系統的使用者用 人形符號 表示
用例角色使用系統的某個功能用 橢圓符號 標示

● 角色使用功能時(用例),或是功能呼叫另一個功能時,使用 實線的箭頭符號表示

  • 在軟體分析功能(用例)的細節、處理流程,每個用例可以用 例檔 來描述,主要可以分為以下幾種:
    1. 前置條件
    2. 主流事件
    3. 其他事件流:以當前分析的角度來看,除了主流程的都是其他事件流
    4. 後置條件(不一定會有)

類別圖 Class Diagram

● 類別圖(Class Diagram)是我們最常見的圖,它代表類與類之間的 靜態結構;它的內容如下● 角色使用功能時(用例),或是功能呼叫令一個功能時,使用 實線的箭頭符號表示

內容說明補充
類別類別圖的主要元素使用矩形表示,如果是抽象類則使用 斜體字 表示(抽象方法也一樣)
類之間的關係類的關係有很多種(下面說明)依照不同關係使用不同的線條

序列圖、協作圖

  • 序列圖」描述了一次會描述出「兩個維度」重點
    1. 水平維度: 表示物件之間的呼叫過程(發送訊息的過程)
    2. 垂直維度: 表示呼叫方法的順序

● 「協作圖」重點在描述 角色之間的互動

序列圖 vs. 協作圖

序列圖展示了物件與角色之間的是透過時間推移進行互動,而協作圖則不能參照時間

狀態轉換圖

● 有時候物件會因為某行行為切換自身的狀態,而如果那 狀態切換較為複雜,就可以使用狀態圖描述;而該圖的內容如下

重點是什麼「行為」,導致「狀態的改變

內容代表圖示
初始點用實心圓表示
狀態轉換用箭頭表示
狀態用元腳矩形表示
中止點用內部包含實心圓的圓表示

組件圖

● 組件圖,主要是顯示 軟體系統中元件(或是子系統)之間的關係(用較高層級的角度分析軟體),常用在顯示與其他第三方元件(SDK, Library)的關係

佈署圖

● 佈署圖表示的是,軟體系統如何佈署到硬體環境中,能夠展示 軟體系統中的元件在硬體環境中的物理布局,如下圖

內容代表圖示
節點三維立方體

UML 類別之間的關係

這個符號可以用在 ClassMethodField,它可以描述用來描述該類 (模型),可以描述對象目標的透明度 (使用類的 Scope、Visibility)

類關係概述
關聯兩個類之間存在一定的關係
依賴為某類提供服務
聚集相當於組合
泛化繼承
實做實做界面

類別:可見性的代表符號

● 這個符號可以用在 ClassMethodField,它可以描述用來描述該類 (模型),可以描述對象目標的透明度 (使用類的 Scope、Visibility)

權限符號
public+
protected#
private-
package~
// 符號範例

class StudentInfo {
    public String name;

    protected String nickName;

    private int age;

    int number;
}

類別 Association Field 關係

Association 聯合 (單、雙向):就像 Class 中的 member(也就是 Field);關聯更多時候是指「參照語意

A. 雙向 Association

public class Teacher { 
    private Student student = new Student();
}

public class Student {
    private Teacher teacher = new Teacher();
}

B. 單向 Association:有方向性

private class Info { }

public class Teacher { 
    private Info info = new Info();
}

public class Student {
    private Teacher teacher = new Teacher();
}

C. 自身 Association:無箭頭

public class Student {
    private Student next = new Student();
}

D. 多維關聯 Association:無箭頭

private class Info { 
    private Teacher t = new Teacher();
    private Student s = new Student();
}

public class Teacher { 
    private Info info = new Info();
    private Student s = new Student();
}

public class Student {
    private Info info = new Info();
    private Teacher t = new Teacher();
}

類別 Dependency 返回、呼叫、創建

Dependency 依賴 (使用關係):依賴關係有兩個大方向(它很容易跟關聯搞混,簡單記的話,只要記住關聯是 Class 內的 Field,其餘都是依賴)

Dependency 的含義,在類別設計中使用「依賴」更有程式語法中的「參照類型」之意(Reference)

A. 實體化某個類型(返回某個類型)

public class Engine { }

public class Car {

    // Car 依賴 Engine(創建)
    public Engine getEngine() {
        return Engine();
    }

}

B. 返回類型 & 呼叫某個類型的方法

public class Engine { 
    public int getPower() {
        return 300;        // 返回 int 類型
    }
}

public class Car {

    // Car 依賴 Engine(使用)
    public String getEngineInfo(Engine e) {
        return "Car power: " + e.getPower();  // 使用 Engine 類型 
    }

} 

依賴者指向,依賴對象,使用虛線實體箭頭

泛化 Generalization

繼承類:使用帶實線的 空三角形箭頭 表示繼承

abstract class Engine {
    protected abstract int calPower();
}

class SmallEngine extends Engine {
    protected int calPower() {
        return 10;
    }
}

實現 Realization

實作介面:使用 線實體箭頭 代表實做

interface IBook {
    void addBook(Book book);
    Book getBook(int index);
}

class ImplBook implement IBook {
    public void addBook(Book book) {
        // TODO:
    }

    public Book getBook(int index) {
        // TODO:
    }
}

聚集 Aggregation

Aggreation 聚合 (ByRefByValue)

A. ByRef 空菱形:稱為 聚合,用來表示 集體 & 個體 之間的關係;有「參照語意」之意… 類拆開後仍各有存在意義,類與類之間 有獨立的生命週期,但是又會互相制衡

eg. 檯燈、燈泡

public class Student { }

public class MyClass { 
    private Student[] students = new Student()[];
}

B. ByValue 實菱形:又稱為 複合 (又稱為組合、強聚集),用來表示 個體 與部分部件的關係 (該部件不可輕易分離,關係較緊密);有「值語意」之意
類拆卸後其存在意義不大(以商業邏輯的角度去看)、有 生命週期的牽連(共存亡),概念範例如下…

  1. 電路板、電阻、電容
  2. 人類、心臟、頭、眼睛
public class Student {
    private Heart heart;
    private Head head;
    private Eyes eyes;
}

何時該用 ByRef 或是 ByValue

這可以須根據 場景、語意、商業邏輯 的角度去分析


其他延伸概念 Other

類 - 多重性 Multiplicity

多重性 (Multiplicity)

權限符號
00 個
11 個
*多個
0…*0 ~ 多個
1…*1 ~ 多個

A. 聚合的多重性表達:在 UML 中,聚合表示整體對象可以包含部分對象,但它們不是強耦合的。以下是在 Java 中使用聚合關係表示多重性的範例程式碼

import java.util.List;

class WholeObject {
    // 其他成員

    // 聚合關係
    private List<PartObject> parts;

    public List<PartObject> getParts() {
        return parts;
    }

    public void setParts(List<PartObject> parts) {
        this.parts = parts;
    }
}

class PartObject {
    // 其他成員
}

public class AggregationExample {
    public static void main(String[] args) {
        WholeObject whole = new WholeObject();
        
        // 創建部分對象
        PartObject part1 = new PartObject();
        PartObject part2 = new PartObject();

        // 設定聚合關係
        whole.setParts(List.of(part1, part2));

        // 其他操作...
    }
}

B. 鏈結關係:在 UML 中,鏈結關係表示類別之間的鏈接(可以是連接其他類、或是連接自身)。以下是在 Java 中使用鏈結關係表示多重性的範例程式碼

class Information {
    private Information privateInformation;
}

更多的物件導向設計

物件導向的設計基礎如下,如果是初學者或是不熟悉的各位,建議可以從這些基礎開始認識,打好基底才能走個更穩(在學習的時候也需要不斷回頭看)!

設計建模 2 大概念- UML 分類、使用

物件導向設計原則 – 6 大原則(一)

物件導向設計原則 – 6 大原則(二)

創建、行為、結構型設計 8 個比較 | 包裝模式 | 最佳實踐

創建模式 Creation Patterns

創建模式 PK

創建模式 - Creation Patterns

結構模式 Structural Patterns

結構模式 PK

結構模式 - Structural Patterns

結構模式專注於「物件之間的組成」,以形成更大的結構。這些模式可以幫助你確保當系統進行擴展或修改時,不會破壞其整體結構。例如,外觀模式、代理模式… 等等,詳細解說請點擊以下連結

Bridge 橋接模式 | 解說實現 | 物件導向設計

Decorate 裝飾模式 | 解說實現 | 物件導向設計

Proxy 代理模式 | 解說實現 | 分析動態代理

Iterator 迭代設計 | 解說實現 | 物件導向設計

Facade 外觀、門面模式 | 解說實現 | 物件導向設計

Adapter 設計模式 | 解說實現 | 物件導向設計

Show 2 Comments

2 Comments

  1. 隔壁桌的

    感謝大師賜教

    以下有些錯別字給大師優化

    其目標是為開發團隊題標準通用的物件導向設計通用語 => 其目標是為開發團隊『提供』標準通用的物件導向設計通用語
    呼叫令一個功能時 => 呼叫『另』一個功能時
    為度 => 『維』度
    它很容易跟關聯稿混 => 它很容易跟關聯『搞』混

發表迴響