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

Module Design · 模組設計

把服務內部切成模組、各模組責任單一、依賴方向不成環

Module Design · 模組設計 · 卡片插圖
CHOOSE YOUR MODE

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

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

SDLC 實作課 · 交付物練習

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

把服務內部切成模組、各模組責任單一、依賴方向不成環

服務一開始小,大家「順手」把功能塞進最近的檔案,依賴隨手 import,三個月後 order 模組 import payment、payment 又回頭 import order,環就成形了。

一旦依賴成環,改一個模組會牽動一整圈、編譯與測試無法獨立、新人看不懂邊界、兩個工程師同時動同一坨程式碼天天衝突。

Module Design 強迫在寫 code 前先把模組切分(單一責任)、各模組擁有的資料、對外介面、依賴方向畫清楚,核心紀律是依賴方向單向、不成環 (acyclic)。

切分對了,多個 dev 才能照模組並行開工、QA 才能設計模組級測試邊界。

OWNER & HANDOFF

誰負責、交給誰

主責: SD(System Designer)

協作: Architect(確認不越服務邊界)、Dev Lead(驗證可實作)、QA(對應測試邊界)

下游收件: Dev 照模組開工、QA 設計模組級測試

WHEN TO USE

何時值得做

REQUIRED

必要時機: 單一服務內部 ≥ 5 個模組、多人要並行開發、要明確控制依賴方向、要切出可獨立測試的邊界

SKIP

不需要時: 單檔 script、PoC、純 CRUD 薄服務(模組少到一眼看完)

CAUTION

常見誤用: 切出一個 god module(common / utils 什麼都塞),或讓依賴雙向互指形成環;模組切分的價值就在單一責任 + 無環依賴,切完還是一坨互相 import = 沒切

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

Anatomy · 文件解剖

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

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

  1. 01

    Executive Summary

    範本必要章節

    3-5 行說明本服務切成幾個模組、切分原則(單一責任)、依賴方向、最高風險

  2. 02

    Module Map

    範本必要章節

    畫 graph LR / flowchart,箭頭代表「依賴」方向(A

  3. 03

    Responsibility Table

    範本必要章節

    每個模組單一責任。owns-data 寫該模組獨占的資料;public-interface 寫對外暴露的函式/介面

  4. 09

    Risks

    範本必要章節

    至少 3 個。必含 god module / cyclic dependency / leaky abstraction 三類各至少一

  5. 12

    Confidence & Sources & TODO

    範本必要章節

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

Study · 對照學習

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

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

SmartTrip 實例待補

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

LIGHT TEMPLATE

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

---
doc_type: "module-design"
variant: "light"
status: "draft"
owner: "<your-name>"
last_updated: "YYYY-MM-DD"
upstream:
  required: ["c4-diagram", "adr"]
  optional: ["use-case", "non-functional-reqs"]
---

# Module Design: <service-name>

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

> [!IMPORTANT]
> **AI 填寫規則:** 本範本 5 段(編號 1, 2, 3, 9, 12),全部必填——刻意沿用完整版的章節編號讓兩版可對照。每結論行內加 `(依據:c4-diagram §XXX / ADR-NNN)`;每欄位帶 `[H]/[M]/[L]` confidence badge;缺資料寫 `_TODO: 需要 XXX_` 不編造模組;**核心紀律:依賴方向單向、不成環 (acyclic)** — 模組圖的箭頭只能往一個方向流,任何雙向互指或回指上游的環必須在 Risks 段標為 violation 並提出拆解。

---

## 1. Executive Summary

<!-- ai-fill: 3-5 行說明本服務切成幾個模組、切分原則(單一責任)、依賴方向、最高風險 -->

<3-5 行說明:本服務拆幾個模組、為何這樣切、依賴方向、有無環>

> **TL;DR:** <一句話:N 個模組、依賴單向 acyclic、最該擔心的是 X 模組責任過載>

---

## 2. Module Map

<!-- ai-rule: 畫 graph LR / flowchart,箭頭代表「依賴」方向(A-->B 表示 A 依賴 B)。不能有環 -->

```mermaid
graph LR
    api[Order API\nroute + validation]
    domain[Order Domain\nstate machine]
    inventory[Inventory\nstock reservation]
    repo[Order Repository\nPostgres adapter]
    api --> domain
    domain --> inventory
    domain --> repo
    inventory --> repo
```

> 箭頭方向 = 依賴方向。上圖無回指(`repo` 不 import `domain`),確認 acyclic。(依據:c4-diagram §Order Service Components)

---

## 3. Responsibility Table

<!-- ai-rule: 每個模組單一責任。owns-data 寫該模組獨占的資料;public-interface 寫對外暴露的函式/介面 -->

| Module | Responsibility | Owns Data | Public Interface | Confidence |
|---|---|---|---|---|
| Order API | route handler + 入參驗證 | 無(無狀態) | `POST /orders`, `GET /orders/{id}` | **[H]** |
| Order Domain | order 狀態機 + 業務規則 | order aggregate(記憶體中) | `createOrder()`, `transition()` | **[H]** |
| Inventory | 庫存預留 / 釋放 | `inventory` 表 | `reserve(sku, qty)`, `release()` | **[H]** |
| Order Repository | Postgres 持久化 | `orders` 表 | `save()`, `findById()` | **[M]** |

---

## 9. Risks

<!-- ai-rule: 至少 3 個。必含 god module / cyclic dependency / leaky abstraction 三類各至少一 -->

> **R1(cyclic dependency):** <e.g. 若 Inventory 為了發通知而 import Order Domain,會與既有 domain-->inventory 形成環> — **Severity:** H — **Mitigation:** 通知改由 Domain 透過 event 觸發,Inventory 不回指 — **Owner:** <SD>
>
> **R2(god module):** <e.g. Order Domain 同時管狀態機 + 折扣 + 稅務,責任過載> — **Severity:** M — **Mitigation:** 折扣/稅務拆為獨立 Pricing 模組 — **Owner:** <SD>
>
> **R3(leaky abstraction):** <e.g. Order API 直接吃 Repository 回傳的 ORM entity,繞過 Domain> — **Severity:** M — **Mitigation:** Repository 只回 domain object,不外洩 ORM 型別 — **Owner:** <Dev Lead>

---

## 12. Confidence & Sources & TODO

- **整份文件最低 confidence 欄位:** <列出所有 [L] 與 [M]>
- **Fabricated assumptions(推測但 input 未明說):**
  - <假設 1:例:假設 Inventory 與 Order 同庫,可同交易內預留>
- **Highest-value next input:** <下一份最該補的:class-diagram / 既有 codebase import graph>

### TODO(缺資料)

- _TODO: 需要 Dev Lead 確認 Inventory 是否與 Order 共用同一 DB 交易_

---

> [!CAUTION]
> **輸出前 AI 自檢:**
> - [ ] 5 段 H2 章節齊全(編號 1, 2, 3, 9, 12,刻意不連號)
> - [ ] Module Map 含 mermaid graph LR / flowchart
> - [ ] 依賴圖 acyclic(無回指、無雙向箭頭)
> - [ ] 每個模組單一責任(無 god module / 無 `common` 雜物袋)
> - [ ] Responsibility Table 每模組含 owns-data + public-interface
> - [ ] 每結論有 source(c4-diagram / ADR ref)
> - [ ] Risks ≥ 3(含 god module / cyclic / leaky abstraction)
> - [ ] 無 YAML / JSON schema 輸出(用 mermaid + 表格表達)

Practice · 換你試做

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

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

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

AI Practice · 手動三步

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

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

STEP 01

只找阻擋文件成立的未知

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

我要製作「Module Design · 模組設計」。先不要產出文件。

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

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

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

本文件的核心章節:Executive Summary、Module Map、Responsibility Table、Risks、Confidence & Sources & TODO

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

Review · 自己驗收

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

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

CHECKED0 / 6
NEXT HANDOFF

帶著這份文件,繼續到「Component Design · 元件設計」

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

前往下一張卡