DDD → SDD
設計 80% │ 實作 20%
使用 Claude Code + OpenSpec 打造高品質軟體
點擊任意章節快速跳轉,簡報中隨時按左下角 ⌂ 回到此頁
從傳統開發到 AI 驅動開發的轉變
DDD → SDD 雙引擎驅動
以業務領域為核心,建立共通的語言和模型
AI 不是你的同事 — 它沒有「默契」,只有「上下文」
你:幫我寫一個計算保費的 API
AI:(猜測)好的,我假設保費 =
金額 × 費率...
(缺少年齡、性別、險種等
業務邏輯,產出不完整)
你:根據我們的領域模型,
被保人(Insured) 有年齡/性別,
險種(InsuranceType) 對應費率表,
請實作 PremiumCalculator...
AI:(精準理解)根據領域模型,
我會查詢 RateTable,
考慮年齡區間和性別係數...
實際操作只需要 3 個步驟
不需要改 Package 結構 — DDD 是概念上的邊界劃分
com.insuranceExpert/
├── model/ ← 所有 Model
│ ├── ai/
│ ├── customer/
│ ├── insuranceMaster/
│ └── ocr/
├── dao/ ← 所有 DAO
├── service/ ← 所有 Service
│ └── ai/
├── web/api/ ← Controller
├── config/
└── util/
Policy(保單管理)
Policy, PolicyStatus, PolicyService
Product(產品保障)
Product, Plan, Benefits, SubBenefits
AI Chat(AI 對話)
ChatSession, ChatMessage, service/ai/*
Customer(客戶管理)
Customer, CustomerTags, ProspectiveCustomer
Member(會員系統)
Member, MemberAccount, MemberLogin
bounded-context-map.md 對照表,
記錄哪些類別屬於哪個 Context。AI 和團隊成員都用這份文件理解領域邊界。
用結構化規格文件驅動開發,取代模糊的口頭需求
了解每個工具的角色與它們之間的關係
/commit — 智慧提交/review — 代碼審查/help — 取得幫助CLAUDE.md 是 Claude Code 進入專案時第一個讀取的檔案
PRPs/
├── feature-name-1/
│ ├── requirements.md ← 需求定義(What & Why)
│ ├── design.md ← 技術設計(How)
│ └── tasks.md ← 任務拆解(Steps)
├── feature-name-2/
│ ├── requirements.md
│ ├── design.md
│ └── tasks.md
└── ...
Step-by-step 工具安裝與環境設定
Claude Code 基於 Node.js 運行,需要 v18 以上
nodejs.org 下載 LTS 版本# Windows (winget)
winget install OpenJS.NodeJS.LTS
# macOS (Homebrew)
brew install node@20
# 驗證安裝
node --version # 應顯示 v18.x 或更高
npm --version # 應顯示 9.x 或更高
# 全域安裝 Claude Code
npm install -g @anthropic-ai/claude-code
# 驗證安裝
claude --version
claude,
會引導你完成帳號認證。需要 Anthropic API Key 或 Claude Max 訂閱。
console.anthropic.com 取得 API Key# 設定環境變數
# Windows (PowerShell)
$env:ANTHROPIC_API_KEY = "sk-ant-xxxxx"
# 或永久設定(推薦)
# Windows: 系統設定 → 環境變數 → 新增 ANTHROPIC_API_KEY
# macOS/Linux: 加到 ~/.bashrc 或 ~/.zshrc
echo 'export ANTHROPIC_API_KEY="sk-ant-xxxxx"' >> ~/.zshrc
.env 已加入 .gitignore
# 進入專案目錄
cd /path/to/your/project
# 啟動 Claude Code
claude
# Claude 會自動讀取 CLAUDE.md(如果存在)
# 如果不存在,可以請 Claude 幫你建立:
# > 請幫我建立 CLAUDE.md,這是一個 Spring MVC 專案...
# 建立 PRPs 資料夾結構
mkdir -p PRPs/your-first-feature
# 每個功能包含三個文件:
# PRPs/your-first-feature/
# ├── requirements.md ← 需求(和 Claude 討論後產出)
# ├── design.md ← 設計(Claude 根據需求產出)
# └── tasks.md ← 任務(Claude 根據設計拆解)
/generate-prp skill
來自動產生 PRP 範本,省去手動建立的麻煩。
MCP (Model Context Protocol) 讓 Claude Code 擁有更多能力
// ~/.claude/settings.json 中配置
{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp@latest"]
},
"serena": {
"command": "uvx",
"args": ["serena-mcp"]
}
}
}
| MCP Server | 用途 |
|---|---|
context7 | 即時查詢最新框架文檔 |
serena | 語義化代碼分析與編輯 |
notion | 與 Notion 工作區整合 |
從需求到部署的完整工作流
PRPs/feature-name/ 資料夾
與 Claude Code 進行深度討論,分析源代碼並制定計畫
# 啟動討論(在 Claude Code 中)
你:我要實作「保費試算功能」,Ticket 編號 IE-123。
請先分析現有的保險計算相關代碼,
然後我們一起討論最佳實作方式。
Claude:好的,讓我先分析...
[讀取相關 Service、Model、Controller]
我發現目前有 PolicyService 和 PremiumCalculator,
建議我們在這個基礎上擴展...
你:同意,但需要考慮多險種的情況...
由 AI 產生完整的規格文件三件套
# 請 Claude 產生規格
你:討論得差不多了,請根據我們的討論,
幫我產生 PRPs/premium-calculator/ 底下的
requirements.md、design.md 和 tasks.md。
Claude:好的,我根據討論內容產出以下規格:
[產生三個文件]
| 文件 | 內容重點 | 篇幅 |
|---|---|---|
requirements.md | 用戶故事、驗收條件、非功能需求 | 1-2 頁 |
design.md | 架構圖、API 設計、資料模型、錯誤處理 | 3-5 頁 |
tasks.md | 任務清單、優先順序、預估工時、相依性 | 1-2 頁 |
AI 進行自我檢查與交叉驗證
AI 根據審查通過的規格編寫代碼,同步建立測試
檢查實作是否符合 spec.md
# 使用 Claude Code 的
# code-review skill
/code-review
# 或手動請求
你:請對照 design.md
審查我剛寫的代碼
# 執行測試
ant test # 執行所有測試
ant test -Dtest=PremiumCalcTest # 執行特定測試
測試通過後建立 Pull Request / Merge Request
# 使用 Claude Code 的 commit-push-pr skill
/commit-push-pr
# 或手動操作
git checkout -b feat/IE-123-premium-calculator
git add .
git commit -m "feat(premium): 新增保費試算功能"
git push -u origin feat/IE-123-premium-calculator
# 使用 gh CLI 建立 PR
gh pr create --title "feat: 新增保費試算功能 (IE-123)" \
--body "## Summary ..."
以「保費試算 API」為例,走完 DDD → SDD → 實作的完整流程
Ubiquitous Language(共通語言):
- 被保人 (Insured) → 年齡、性別、健康狀態
- 險種 (InsuranceType) → 壽險、醫療險、意外險
- 保費 (Premium) → 年繳保費、月繳保費
- 費率表 (RateTable) → 按年齡/性別查表
Bounded Context:
- 報價上下文 (Quotation Context) ← 本次開發
- 保單管理上下文 (Policy Context) ← 已存在
# 與 Claude Code 對話
你:Ticket IE-456 的討論結果已經確認,
請產生 PRPs/premium-calculator/ 的三個規格文件。
Claude:好的,我根據討論內容產生以下規格:
=== design.md (節錄) ===
## API 設計
POST /api/v1/premium/calculate
Request: { age, gender, insuranceType, coverageAmount }
Response: { annualPremium, monthlyPremium, rateApplied }
## 資料模型
PremiumRequest → 驗證 → RateTableLookup → PremiumResult
// PremiumCalculatorTest.java
@Test // ✅ 預期成功
public void testCalculate_validInput_returnsCorrectPremium() {
PremiumRequest req = new PremiumRequest(30, "M", "LIFE", 1000000);
PremiumResult result = calculator.calculate(req);
assertEquals(BigDecimal.valueOf(12500), result.getAnnualPremium());
}
@Test // ⚠️ 邊界案例
public void testCalculate_maxAge_returnsHigherPremium() {
PremiumRequest req = new PremiumRequest(70, "F", "MEDICAL", 500000);
PremiumResult result = calculator.calculate(req);
assertTrue(result.getAnnualPremium()
.compareTo(BigDecimal.valueOf(50000)) > 0);
}
@Test(expected = InvalidAgeException.class) // ❌ 預期失敗
public void testCalculate_negativeAge_throwsException() {
new PremiumRequest(-1, "M", "LIFE", 1000000);
}
讓流程運作更順暢的心法
| ⚠️ 踩坑 | ✅ 對策 |
|---|---|
| 跳過設計直接寫 Code | 強制要求先建立 PRP 再開工 |
| AI 幻覺不存在的 API 或類別 | CLAUDE.md 中設定「不可假設」規則 |
| AI 產生重複實作 | 「Single Source of Truth」原則 |
| 測試只寫 happy path | 每個功能至少 3 種測試(成功/邊界/失敗) |
| CLAUDE.md 過時 | 定期用 /revise-claude-md 更新 |
| 上下文視窗不夠 | 善用 Subagents 分擔工作 |
# 啟動 Claude Code
claude
# 常用 Slash Commands
/commit # 智慧提交
/code-review # 代碼審查
/generate-prp # 產生規格
/help # 取得幫助
# Plan 模式
# Claude 自動進入或
# 你可以手動要求:
你:請先進入 Plan 模式分析
設計 80% • 實作 20% • 品質 100%
💬 有問題?有想法?讓我們一起討論!