Launch Atlas logoLaunch.Atlas
#33Design系統設計

Class Diagram · 類別圖

把物件結構、屬性、方法、關聯畫清楚,Dev 照圖建型別

Class Diagram · 類別圖 · 卡片插圖
CHOOSE YOUR MODE

先決定你現在是要學,還是要在專案裡做

網站負責解釋與分發工作包;真正的 Repository 掃描、缺口判斷與文件產出交給 Coding Agent。

SDLC 實作課 · 交付物練習

先理解這份文件替你消除什麼不確定

把物件結構、屬性、方法、關聯畫清楚,Dev 照圖建型別

用文字描述「Order 有很多 LineItem、Customer 可以下很多單」很容易遺漏關聯方向、多重度(multiplicity)、誰擁有誰(ownership)。

Class Diagram 強迫把物件結構、屬性型別、方法簽章、類別間關聯與多重度畫出來,讓 Dev 照圖直接建 entity / 型別,是最早抓出 anemic domain model(只有 getter/setter 沒有行為)與 god class(一個類別塞所有邏輯)的最便宜工具。

不畫,整合到一半才發現 Order 與 LineItem 的 1:* 關係被實作成雙向可變參考,刪一筆 order 留下孤兒 line item。

OWNER & HANDOFF

誰負責、交給誰

主責: SD

協作: Dev Lead(驗證型別與實作可行)、Architect(對齊 BC 邊界、不跨 aggregate 亂引用)、DBA(對齊 ORM mapping 與 entity ↔ table)

下游收件: Dev 建 entity / 型別 / 領域服務、DBA 對應 schema 與 FK、QA 依 invariant 設計測試

WHEN TO USE

何時值得做

REQUIRED

必要時機: OO 領域模型複雜、有繼承 / 組合 / 多型、需要 DDD aggregate 邊界、ORM entity 設計

SKIP

不需要時: 純 CRUD DTO / 純資料搬運、無行為的 config 物件、函數式 / 純 procedural 服務

CAUTION

常見誤用: 把每個 getter/setter 都逆向畫出來——模型領域,不模型 boilerplate;類別圖的價值在表達關聯、多重度、ownership 與 invariant,不是把 IDE outline 抄一遍。簡單 CRUD DTO 不需要類別圖,畫了只是噪音。

看懂5 段骨架知道每段要留下哪一種判斷
看會雙版本範本先用輕量版練習,再讀完整版
做出自己的草稿手動貼到 Claude Code、Codex 或其他 Agent
  1. 01讀大綱
  2. 02比範本
  3. 03填素材
  4. 04貼提示詞
  5. 05對照驗收

Anatomy · 文件解剖

輕量版先回答 5 個核心章節

章節名稱可以因團隊調整,但每一段要求的判斷不能被省略。先讀問題,再看格式。

  1. 01

    Executive Summary

    範本必要章節

    3-5 行說明本圖涵蓋的 domain、含幾個類別、aggregate root 是誰、最關鍵的 invariant

  2. 02

    Class Diagram

    範本必要章節

    把已確認的內容、判斷依據與仍待補充的資訊清楚分開。

  3. 03

    Class Responsibilities

    範本必要章節

    把已確認的內容、判斷依據與仍待補充的資訊清楚分開。

  4. 09

    Design Risks

    範本必要章節

    至少列 3 個(anemic domain model / god class / inheritance-over-composition)

  5. 12

    Confidence & Sources & TODO

    範本必要章節

    把已確認的內容、判斷依據與仍待補充的資訊清楚分開。

Study · 對照學習

同一份交付物,先練核心,再看完整深度

輕量範本適合第一次練習與 MVP;完整範本保留跨職能交棒需要的細節。兩者都要求未知事項保持可見。

SmartTrip 實例待補

這張卡目前提供已審定的輕量與完整範本;不以 AI 臨時生成的內容冒充實際案例。

LIGHT TEMPLATE

30 分鐘內先完成核心章節。

---
doc_type: "class-diagram"
variant: "light"
status: "draft"
owner: "<your-name>"
last_updated: "YYYY-MM-DD"
upstream:
  required: ["data-model", "use-case"]
  optional: ["module-design", "api-spec"]
---

# Class Diagram: <domain-name>

**Status:** Draft · **Owner:** <SD> · **Last updated:** YYYY-MM-DD

> [!IMPORTANT]
> **AI 填寫規則:** 本範本 5 段(編號 1, 2, 3, 9, 12),全部必填——刻意沿用完整版的章節編號讓兩版可對照。每結論行內加 `(依據:data-model §XXX / use-case §YYY)`;每欄位帶 `[H]/[M]/[L]` confidence badge;缺資料寫 `_TODO: 需要 XXX_` 不編造類別或關聯;**核心紀律:模型領域,不模型 boilerplate;組合優先於繼承**;**每條 relationship 必標多重度(如 "1" / "*")**;類別不可只有 getter/setter(anemic model 不接受),至少帶 1 個有行為的方法。

---

## 1. Executive Summary

<!-- ai-fill: 3-5 行說明本圖涵蓋的 domain、含幾個類別、aggregate root 是誰、最關鍵的 invariant -->

<3-5 行說明:本圖建哪個領域模型、aggregate root、最關鍵 invariant>

> **TL;DR:** <一句話:Order aggregate root + LineItem composition + Customer association,核心 invariant 是 total = Σ line items>

---

## 2. Class Diagram

```mermaid
classDiagram
    class Customer {
        +CustomerId id
        +string name
        +Email email
        +placeOrder(cart) Order
    }
    class Order {
        +OrderId id
        +OrderStatus status
        +Money total
        +addLineItem(product, qty) void
        +confirm() void
        +recalcTotal() Money
    }
    class LineItem {
        +ProductId productId
        +int quantity
        +Money unitPrice
        +subtotal() Money
    }
    Customer "1" --> "*" Order : places
    Order "1" *-- "1..*" LineItem : contains
```

---

## 3. Class Responsibilities

| Class | Responsibility | Key invariants | Confidence |
|---|---|---|---|
| Customer | 帳戶身分 + 下單入口 | email 唯一且已驗證 | **[H]** |
| Order | aggregate root;訂單狀態與金額一致性 | total = Σ lineItem.subtotal;至少 1 個 LineItem | **[H]** |
| LineItem | 單一商品行;數量 × 單價 | quantity ≥ 1;unitPrice ≥ 0 | **[H]** |

---

## 9. Design Risks

<!-- ai-rule: 至少列 3 個(anemic domain model / god class / inheritance-over-composition) -->

> **R1:** <e.g. Order 若只剩 getter/setter,金額一致性散到 service = anemic domain model> — **Mitigation:** invariant 收進 Order.recalcTotal()
>
> **R2:** <e.g. Order 同時管狀態機 + 金額 + 出貨 = god class> — **Mitigation:** 拆出 ShippingPolicy 值物件
>
> **R3:** <e.g. 用繼承表達 OrderType 變體導致深繼承樹> — **Mitigation:** 組合優先於繼承,用 strategy

---

## 12. Confidence & Sources & TODO

- **整份文件最低 confidence 欄位:** <列出所有 [L] 與 [M]>
- **Fabricated assumptions(推測但 input 未明說):**
  - <假設 1:例:假設 Order 為 aggregate root(data-model 未明示邊界)>
- **Highest-value next input:** <下一份最該補的:完整 use case 例外流程 / DBA ORM mapping 確認>

### TODO(缺資料)

- _TODO: 需要 Architect 確認 Order / Customer 是否屬同一 aggregate_

---

> [!CAUTION]
> **輸出前 AI 自檢:**
> - [ ] 5 段 H2 章節齊全(編號 1, 2, 3, 9, 12,刻意不連號)
> - [ ] Class Diagram 含 mermaid classDiagram(屬性帶型別、方法帶行為)
> - [ ] 每條 relationship 標多重度("1" / "*" / "1..*")
> - [ ] 無 anemic-model-only 類別(每類別至少 1 個有行為方法)
> - [ ] aggregate root 已標明
> - [ ] 無 YAML / JSON schema 輸出(schema 屬 data-model 卡)

Practice · 換你試做

先用自己的話交代素材,不需要先學會工程術語

確定的就寫,不確定的留白。下一步要做的是請 Agent 找缺口,不是讓它替你猜一套合理答案。

可以先留白;複製提示詞後再到 Coding Agent 裡補充。

AI Practice · 手動三步

先問、再寫、最後審,不把整條流程鎖死

每一步都是獨立工作包。你可以停下補資料、修改限制或重做某一步,不需要服從固定的 Agent 接力流程。

STEP 01

只找阻擋文件成立的未知

先補會改變範圍、判斷或驗收結果的資訊,不急著寫文件。

我要製作「Class Diagram · 類別圖」。先不要產出文件。

請根據我的素材,找出會影響這份文件正確性或可執行性的未知事項,一次最多問 5 題。

每題請包含:
1. 問題
2. 為什麼現在必須知道
3. 它會影響哪個章節或決定

已經回答的事不要重問;可以延後的事標成「待決策」;不要替我猜答案。

本文件的核心章節:Executive Summary、Class Diagram、Class Responsibilities、Design Risks、Confidence & Sources & TODO

複製後,請在標示位置貼上自己的素材。

Review · 自己驗收

文件存在,不代表下一個角色真的能使用

逐條檢查 Agent 的輸出。人類負責需求、限制與驗收,也必須能說明重要結論從哪裡來。

CHECKED0 / 6
NEXT HANDOFF

帶著這份文件,繼續到「Error Handling · 錯誤處理設計」

下一張卡會接住新的決策問題;不用一次把整條 SDLC 全做完。

前往下一張卡