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

Component Design · 元件設計

定義元件的介面契約與依賴方向,讓元件可獨立替換與測試

Component Design · 元件設計 · 卡片插圖
CHOOSE YOUR MODE

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

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

SDLC 實作課 · 交付物練習

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

定義元件的介面契約與依賴方向,讓元件可獨立替換與測試

模組內部「誰呼叫誰」用一句話描述「Service 用 Repository」很模糊:沒定義介面契約,元件就被具體實作綁死——換掉 Postgres 要改 domain、寫單元測試只能起真資料庫。

Component Design 強迫把介面契約(provided / required interface)、依賴方向、port 與 adapter 的對應釘出來,是讓元件能獨立替換、獨立測試的最便宜工具。

核心紀律是 依賴指向內層 (domain),adapter 可替換:domain 定義 port、infra 提供 adapter、依賴箭頭只准朝內。

不釘,整合測試才發現 domain import 了 Postgres driver、mock 不掉外部依賴、換金流要動到業務邏輯。

OWNER & HANDOFF

誰負責、交給誰

主責: SD(System Designer)

協作: Dev Lead(驗證介面契約可實作)、Architect(確認元件邊界不越界)、QA(設計 test double / 替身)

下游收件: Dev 依介面實作元件、QA 依 test seam 寫單元測試

WHEN TO USE

何時值得做

REQUIRED

必要時機: 模組需定義 port/adapter、跨團隊共用元件、要寫單元測試替身、外部依賴需可替換(DB / 金流 / 通知)

SKIP

不需要時: 純 CRUD 薄層、一次性腳本、無外部依賴的工具函式

CAUTION

常見誤用: 介面契約只寫方法名沒寫錯誤行為與邊界、依賴方向朝外(domain import infra)、port 與 adapter 一對一硬綁(失去替換意義);業界實踐強調抽象會洩漏(leaky abstraction)——介面若回傳 infra 專屬型別(如 sql.Rows),等於沒抽象

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

Anatomy · 文件解剖

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

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

  1. 01

    Executive Summary

    範本必要章節

    3-5 行說明本模組含哪些元件、哪些是 domain port、哪些是 infra adapter、最高風險

  2. 02

    Component Diagram

    範本必要章節

    Mermaid 無原生 UML component 型別,用 flowchart 配 «interface» 標籤表達 provided/required interface;依賴箭頭只准朝內 (domain)。標出哪些是 port (interface)、哪些是 adapter (impl)

  3. 03

    Interface Contracts

    範本必要章節

    每個元件列 provided interface(對外提供)+ required interface(向內依賴的 port)。只寫方法名不寫回傳/錯誤行為不接受

  4. 09

    Risks

    範本必要章節

    至少 3 個(leaky abstraction / hidden temporal coupling / circular DI),每條含失效模式 + Mitigation + Owner

  5. 12

    Confidence & Sources & TODO

    範本必要章節

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

Study · 對照學習

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

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

SmartTrip 實例待補

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

LIGHT TEMPLATE

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

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

# Component Design: <module-name>

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

> [!IMPORTANT]
> **AI 填寫規則:** 本範本 5 段(編號 1, 2, 3, 9, 12),全部必填——刻意沿用完整版的章節編號讓兩版可對照。每結論行內加 `(依據:module-design §XXX / api-spec §YYY)`;每欄位帶 `[H]/[M]/[L]` confidence badge;缺資料寫 `_TODO: 需要 XXX_` 不編造元件或介面。**核心紀律:依賴指向內層 (domain),adapter 可替換**——元件圖的依賴箭頭只准朝內,任何 domain → infra 的箭頭即不合格。介面契約須含 provided + required interface,只寫方法名不寫錯誤行為不接受。

---

## 1. Executive Summary

<!-- ai-fill: 3-5 行說明本模組含哪些元件、哪些是 domain port、哪些是 infra adapter、最高風險 -->

<3-5 行說明>

> **TL;DR:** <一句話:元件數 + 哪些 port 可替換 + 依賴方向>

---

## 2. Component Diagram

<!-- ai-rule: Mermaid 無原生 UML component 型別,用 flowchart 配 «interface» 標籤表達 provided/required interface;依賴箭頭只准朝內 (domain)。標出哪些是 port (interface)、哪些是 adapter (impl) -->

```mermaid
flowchart LR
    subgraph domain["Domain(內層)"]
        SVC["OrderService<br/>«component»"]
        PORT["«interface»<br/>OrderRepository<br/>(port)"]
    end
    subgraph infra["Infra(外層 · adapter 可替換)"]
        ADP["PgOrderRepository<br/>«adapter»"]
    end
    API["Order API<br/>«component»"] -->|requires| SVC
    SVC -->|requires| PORT
    ADP -.implements.-> PORT
    ADP -->|uses| DB[("Postgres")]
```

> 依賴方向:`API → Service → «OrderRepository» port`,adapter `PgOrderRepository` 由外層 implements port(箭頭朝內),換 DB 只換 adapter。

---

## 3. Interface Contracts

<!-- ai-rule: 每個元件列 provided interface(對外提供)+ required interface(向內依賴的 port)。只寫方法名不寫回傳/錯誤行為不接受 -->

| Component | Provided interface | Required interface (port) | Confidence |
|---|---|---|---|
| Order API | `POST createOrder(dto) → 201 \| 409` | `OrderService` | **[H]** |
| OrderService | `place(cmd) → Order \| DomainError` | `OrderRepository` | **[H]** |
| PgOrderRepository | implements `OrderRepository` | `Postgres pool` | **[M]** |

- `OrderRepository.save(order) → void \| ConflictError`:唯一鍵衝突回 `ConflictError`,不洩漏 `sql.Error`(依據:module-design §repo)

---

## 9. Risks

<!-- ai-rule: 至少 3 個(leaky abstraction / hidden temporal coupling / circular DI),每條含失效模式 + Mitigation + Owner -->

> **R1:** <e.g. `OrderRepository.find` 回傳 `sql.Rows`(leaky abstraction),domain 被 driver 綁死> — **Mitigation:** port 只回 domain 型別 — **Owner:** <SD>
>
> **R2:** <e.g. Service 假設 Repository 已先呼叫 `init()`(hidden temporal coupling)> — **Mitigation:** 建構子注入完成即可用 — **Owner:** <Dev Lead>
>
> **R3:** ...

---

## 12. Confidence & Sources & TODO

- **整份文件最低 confidence 欄位:** <列出所有 [L] 與 [M]>
- **Fabricated assumptions(推測但 input 未明說):**
  - <假設 1:例:假設 OrderRepository 用 Postgres adapter(module-design 未指定)>
- **Highest-value next input:** <下一份最該補的:class-diagram(元件內部結構)/ ADR(持久化選型)>

### TODO(缺資料)

- _TODO: 需要 Dev Lead 確認 OrderRepository port 是否需支援 batch save_

---

> [!CAUTION]
> **輸出前 AI 自檢:**
> - [ ] 5 段 H2 章節齊全(編號 1, 2, 3, 9, 12,刻意不連號)
> - [ ] Component Diagram 含 mermaid,標出 port (interface) vs adapter (impl)
> - [ ] 依賴箭頭只朝內(無 domain → infra 箭頭)
> - [ ] 每個元件有 provided + required interface(非只方法名,含錯誤行為)
> - [ ] Risks ≥ 3(含 leaky abstraction / temporal coupling / circular DI)
> - [ ] 無 YAML / JSON schema 輸出(用 mermaid + 表格表達)

Practice · 換你試做

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

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

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

AI Practice · 手動三步

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

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

STEP 01

只找阻擋文件成立的未知

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

我要製作「Component Design · 元件設計」。先不要產出文件。

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

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

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

本文件的核心章節:Executive Summary、Component Diagram、Interface Contracts、Risks、Confidence & Sources & TODO

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

Review · 自己驗收

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

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

CHECKED0 / 6
NEXT HANDOFF

帶著這份文件,繼續到「Class Diagram · 類別圖」

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

前往下一張卡