重構助手
語言: English | 繁體中文
版本: 2.0.0
最後更新: 2026-01-21
適用範圍: Claude Code Skills
目的
本技能提供重構與重寫的決策框架、大規模重構模式,以及技術債管理。策略分為三個層級:戰術性(日常)、戰略性(架構)、安全防護(遺留程式碼)。
快速參考(YAML 壓縮格式)
# === 決策:重構 vs 重寫 ===
decision_tree:
- q: "程式碼在生產環境運行?"
n: "→ 考慮重寫(風險較低)"
y: next
- q: "了解程式碼的功能?"
n: "→ 先寫特徵測試"
y: next
- q: "測試覆蓋率 >60%?"
n: "→ 先補測試"
y: next
- q: "核心架構可修復?"
n: "→ Strangler Fig 模式"
y: "→ 增量重構 ✓"
comparison_matrix:
favor_refactor: [大型程式庫, 良好測試, 業務關鍵, 團隊熟悉, 架構健全, 時間緊迫, 低風險]
favor_rewrite: [小型獨立, 無測試, 可容忍停機, 無人熟悉, 架構有缺陷, 時間充裕, 較高風險]
# === 警告:第二系統效應 ===
rewrite_antipatterns:
- "加入原本沒有的功能"
- "為未來彈性過度抽象"
- "忽略現有系統的經驗教訓"
quote: "第二個系統是一個人設計過最危險的系統。— Fred Brooks"
# === 戰術性策略:日常重構 ===
tactical:
preparatory_refactoring:
definition: "在新增功能前調整結構,讓改變更容易"
quote: "先把改變變容易(這可能很難),然後再做那個容易的改變。— Kent Beck"
when: [功能被阻擋, 降低阻力, 即將變更]
workflow:
1: "識別要做的改變"
2: "識別是什麼讓改變困難"
3: "重構以讓改變變容易"
4: "做那個(現在變容易的)改變"
principles:
- "預備性重構與功能分開提交"
- "每一步都維持測試通過"
- "不要混合重構與功能工作"
boy_scout_rule:
definition: "離開時讓程式碼比來時更乾淨(機會主義重構)"
quote: "離開營地時,讓它比你來的時候更乾淨。— Robert C. Martin"
when: [任何維護, Bug修復, 功能新增, 對抗熵]
guidelines:
- "只做小改進(分鐘,不是小時)"
- "不改變行為"
- "不破壞現有測試"
- "保持範圍在當前任務內"
examples:
- "重新命名令人困惑的變數"
- "將幾行程式碼提取為命名良好的方法"
- "移除死程式碼"
- "加入澄清註解"
antipatterns:
- "把 Bug 修復變成大重構"
- "重構不相關的程式碼"
- "沒有測試覆蓋就修改"
- "範圍蔓延超出原始任務"
red_green_refactor:
definition: "TDD 重構階段"
duration: "每循環 5-15 分鐘"
scope: "單一方法/類別"
techniques: [提取方法, 重新命名, 內聯變數, 替換魔術數字]
reference: "→ 見 TDD 標準"
# === 戰略性策略:架構重構 ===
strategic:
strangler_fig:
definition: "逐步將功能路由到新系統,漸進替換舊系統"
origin: "命名自絞殺榕樹"
phases:
1_攔截: "請求 → 門面 → 舊系統(100%)"
2_遷移: "請求 → 門面 → [新系統(功能), 舊系統(其餘)]"
3_完成: "請求 → 新系統(100%) [舊系統下線]"
checklist:
- "識別攔截點"
- "建立事件捕獲層"
- "在新系統實作第一個功能"
- "漸進式路由流量"
- "監控並比較"
- "下線舊系統"
anti_corruption_layer:
definition: "防止遺留模型污染新系統的翻譯層"
origin: "Eric Evans, 領域驅動設計 (2003)"
when:
- "新舊系統必須共存並互動"
- "遺留系統有混亂的領域模型"
- "保護新系統的限界上下文"
components:
facade: "簡化複雜的遺留介面"
adapter: "將遺留資料轉換為新領域模型"
translator: "映射遺留術語到通用語言"
checklist:
- "定義清晰的 ACL 介面"
- "映射遺留實體到新模型"
- "處理資料格式轉換"
- "實作錯誤翻譯"
- "加入日誌以便除錯"
- "徹底測試 ACL 隔離性"
vs_strangler:
strangler: "目標是取代遺留"
acl: "目標是與遺留共存"
branch_by_abstraction:
steps:
1: "客戶端 → 抽象(介面) → 舊實作"
2: "客戶端 → 抽象 → [舊實作, 新實作(切換)]"
3: "客戶端 → 新實作 [舊實作已移除]"
principles: [所有變更在主幹, 功能開關, 過渡期共存]
parallel_change:
aka: "Expand-Migrate-Contract"
phases:
expand: "新增新的在舊的旁邊,新程式碼用新的,舊的仍運作"
migrate: "更新所有客戶端用新的,驗證,資料遷移"
contract: "移除舊的,清理,更新文件"
# === 安全策略:遺留程式碼 ===
safety:
legacy:
definition: "沒有測試的程式碼(不論年齡)"
dilemma: "安全修改需要測試 → 加測試需要修改程式碼"
solution: "使用安全技術先加測試"
characterization_tests:
purpose: "捕捉現有行為(非驗證正確性)"
process:
1: "呼叫要理解的程式碼"
2: "寫預期會失敗的斷言"
3: "執行,觀察實際結果"
4: "更新斷言以匹配實際行為"
5: "重複直到涵蓋需要修改的行為"
principle: "記錄程式碼做什麼,而非應該做什麼"
scratch_refactoring:
definition: "為了理解而重構,捨棄所有變更"
workflow:
1: "建立探針分支(或 git stash)"
2: "大膽重構以理解"
3: "記錄學到的內容"
4: "捨棄變更(git reset --hard)"
5: "應用學習撰寫特徵測試"
when: [程式碼太複雜, 無文件, 需要快速建立心智模型]
principle: "目標是理解,不是整潔程式碼"
seams:
definition: "可以在不編輯程式碼的情況下改變行為的地方"
object: "透過多型覆寫(注入測試替身)"
preprocessing: "編譯時替換(巨集)"
link: "連結時替換(DI,模組替換)"
sprout_wrap:
sprout_method: "新邏輯 → 建立新方法,從舊的呼叫"
sprout_class: "新邏輯獨立演進 → 新類別"
wrap_method: "加入前後行為 → 重命名原方法,建立包裝器"
wrap_class: "裝飾現有 → 裝飾者模式"
principle: "新程式碼用 TDD;遺留程式碼在測試前保持不動"
# === 資料庫:重構 ===
db_expand_contract:
expand: "新增新欄位/表,應用程式同時寫入,可安全回滾"
migrate: "複製資料,驗證一致性,應用程式從新的讀取"
contract: "確認舊的未使用,移除舊的,清理雙寫"
db_scenarios:
rename_column: {strategy: "新增→遷移→刪除", risk: 中}
split_table: {strategy: "新表+外鍵→遷移→調整", risk: 高}
merge_tables: {strategy: "新表→合併→切換", risk: 高}
change_datatype: {strategy: "新欄位→轉換→切換", risk: 中}
add_not_null: {strategy: "填預設→加約束", risk: 低}
# === 工作流程:安全重構 ===
before: [定義成功標準, "覆蓋率>80%", 乾淨工作目錄, 建立分支, 與團隊溝通]
during: [一次一個小變更, 每次變更後測試, 失敗就復原, 頻繁提交, 不加新功能]
after: [所有測試通過, 可衡量地更好, 文件已更新, 團隊已審查, 沒有新功能]
# === 指標 ===
code_quality:
cyclomatic_complexity: "每函式<10"
cognitive_complexity: "越低越好"
coupling: "降低"
cohesion: "提高"
duplication: "<3%"
test_quality:
coverage: "≥80%,不降低"
speed: "重構後更快"
flaky_count: "降低"
# === 技術債管理 ===
quadrant: # Martin Fowler
prudent_deliberate: "我們知道這是債務"
reckless_deliberate: "沒時間做設計"
prudent_inadvertent: "現在知道應該怎麼做了"
reckless_inadvertent: "什麼是分層?"
priority:
high: {criteria: "阻塞開發,頻繁出錯", action: "立即處理"}
medium: {criteria: "拖慢開發,增加複雜度", action: "規劃到下個迭代"}
low: {criteria: "小麻煩,影響局部", action: "有機會就處理"}
tracking:
fields: [描述, 影響, 估計工作量, 忽視風險, 相關程式碼]
# === 決策矩陣摘要 ===
decision_matrix:
- {strategy: "預備性重構", scale: "小", risk: "低", use: "降低功能開發阻力"}
- {strategy: "童子軍規則", scale: "極小", risk: "低", use: "持續償債"}
- {strategy: "紅-綠-重構", scale: "小", risk: "低", use: "TDD 開發循環"}
- {strategy: "絞殺榕", scale: "大", risk: "中", use: "系統汰換"}
- {strategy: "防腐層", scale: "中", risk: "低", use: "新舊共存"}
- {strategy: "抽象分支", scale: "大", risk: "中", use: "主幹重構"}
- {strategy: "平行變更", scale: "中", risk: "低", use: "介面/Schema 遷移"}
- {strategy: "特徵測試", scale: "—", risk: "—", use: "遺留重構的前置條件"}
- {strategy: "探針式重構", scale: "小", risk: "低", use: "理解黑盒程式碼"}
# === 策略選擇 ===
selection_guide:
功能被混亂程式碼阻擋: "預備性重構"
在Bug修復中接觸程式碼: "童子軍規則"
用TDD寫新程式碼: "紅-綠-重構"
取代整個遺留系統: "絞殺榕"
整合遺留不被污染: "防腐層"
在主幹重構共享程式碼: "抽象分支"
變更廣泛使用的介面: "平行變更"
處理未測試的遺留: "特徵測試 + 探針式重構 先做"
配置偵測
偵測順序
- 檢查
CONTRIBUTING.md 中的「停用技能」區段
- 檢查
CONTRIBUTING.md 中的「重構標準」區段
- 如果未找到,預設使用標準重構實踐
詳細指南
完整標準請參閱:
相關標準
版本歷史
| 版本 |
日期 |
變更 |
| 2.0.0 |
2026-01-21 |
新增戰術性策略(預備性重構、童子軍規則)、防腐層、決策矩陣摘要。重組為戰術性/戰略性/安全防護三層。 |
| 1.0.0 |
2026-01-12 |
初始發布 |
授權
本技能以 CC BY 4.0 授權發布。
來源: universal-dev-standards
1---2name: refactor-253description: 引導重構決策和大規模程式碼改進。 使用時機:重構程式碼、遺留系統現代化、技術債、重寫決策。 關鍵字:refactor, rewrite, legacy, strangler, technical debt, 重構, 重寫, 技術債.4---5
6# 重構助手
7
8> **語言**: [English](../../../../skills/refactoring-assistant/SKILL.md) | 繁體中文
9
10**版本**: 2.0.0
11**最後更新**: 2026-01-21
12**適用範圍**: Claude Code Skills
13
14---
15
16## 目的
17
18本技能提供重構與重寫的決策框架、大規模重構模式,以及技術債管理。策略分為三個層級:戰術性(日常)、戰略性(架構)、安全防護(遺留程式碼)。
19
20---
21
22## 快速參考(YAML 壓縮格式)
23
24```yaml
25# === 決策:重構 vs 重寫 ===
26decision_tree:
27 - q: "程式碼在生產環境運行?"
28 n: "→ 考慮重寫(風險較低)"
29 y: next
30 - q: "了解程式碼的功能?"
31 n: "→ 先寫特徵測試"
32 y: next
33 - q: "測試覆蓋率 >60%?"
34 n: "→ 先補測試"
35 y: next
36 - q: "核心架構可修復?"
37 n: "→ Strangler Fig 模式"
38 y: "→ 增量重構 ✓"
39
40comparison_matrix:
41 favor_refactor: [大型程式庫, 良好測試, 業務關鍵, 團隊熟悉, 架構健全, 時間緊迫, 低風險]
42 favor_rewrite: [小型獨立, 無測試, 可容忍停機, 無人熟悉, 架構有缺陷, 時間充裕, 較高風險]
43
44# === 警告:第二系統效應 ===
45rewrite_antipatterns:
46 - "加入原本沒有的功能"
47 - "為未來彈性過度抽象"
48 - "忽略現有系統的經驗教訓"
49quote: "第二個系統是一個人設計過最危險的系統。— Fred Brooks"
50
51# === 戰術性策略:日常重構 ===
52tactical:
53 preparatory_refactoring:
54 definition: "在新增功能前調整結構,讓改變更容易"
55 quote: "先把改變變容易(這可能很難),然後再做那個容易的改變。— Kent Beck"
56 when: [功能被阻擋, 降低阻力, 即將變更]
57 workflow:
58 1: "識別要做的改變"
59 2: "識別是什麼讓改變困難"
60 3: "重構以讓改變變容易"
61 4: "做那個(現在變容易的)改變"
62 principles:
63 - "預備性重構與功能分開提交"
64 - "每一步都維持測試通過"
65 - "不要混合重構與功能工作"
66
67 boy_scout_rule:
68 definition: "離開時讓程式碼比來時更乾淨(機會主義重構)"
69 quote: "離開營地時,讓它比你來的時候更乾淨。— Robert C. Martin"
70 when: [任何維護, Bug修復, 功能新增, 對抗熵]
71 guidelines:
72 - "只做小改進(分鐘,不是小時)"
73 - "不改變行為"
74 - "不破壞現有測試"
75 - "保持範圍在當前任務內"
76 examples:
77 - "重新命名令人困惑的變數"
78 - "將幾行程式碼提取為命名良好的方法"
79 - "移除死程式碼"
80 - "加入澄清註解"
81 antipatterns:
82 - "把 Bug 修復變成大重構"
83 - "重構不相關的程式碼"
84 - "沒有測試覆蓋就修改"
85 - "範圍蔓延超出原始任務"
86
87 red_green_refactor:
88 definition: "TDD 重構階段"
89 duration: "每循環 5-15 分鐘"
90 scope: "單一方法/類別"
91 techniques: [提取方法, 重新命名, 內聯變數, 替換魔術數字]
92 reference: "→ 見 TDD 標準"
93
94# === 戰略性策略:架構重構 ===
95strategic:
96 strangler_fig:
97 definition: "逐步將功能路由到新系統,漸進替換舊系統"
98 origin: "命名自絞殺榕樹"
99 phases:
100 1_攔截: "請求 → 門面 → 舊系統(100%)"
101 2_遷移: "請求 → 門面 → [新系統(功能), 舊系統(其餘)]"
102 3_完成: "請求 → 新系統(100%) [舊系統下線]"
103 checklist:
104 - "識別攔截點"
105 - "建立事件捕獲層"
106 - "在新系統實作第一個功能"
107 - "漸進式路由流量"
108 - "監控並比較"
109 - "下線舊系統"
110
111 anti_corruption_layer:
112 definition: "防止遺留模型污染新系統的翻譯層"
113 origin: "Eric Evans, 領域驅動設計 (2003)"
114 when:
115 - "新舊系統必須共存並互動"
116 - "遺留系統有混亂的領域模型"
117 - "保護新系統的限界上下文"
118 components:
119 facade: "簡化複雜的遺留介面"
120 adapter: "將遺留資料轉換為新領域模型"
121 translator: "映射遺留術語到通用語言"
122 checklist:
123 - "定義清晰的 ACL 介面"
124 - "映射遺留實體到新模型"
125 - "處理資料格式轉換"
126 - "實作錯誤翻譯"
127 - "加入日誌以便除錯"
128 - "徹底測試 ACL 隔離性"
129 vs_strangler:
130 strangler: "目標是取代遺留"
131 acl: "目標是與遺留共存"
132
133 branch_by_abstraction:
134 steps:
135 1: "客戶端 → 抽象(介面) → 舊實作"
136 2: "客戶端 → 抽象 → [舊實作, 新實作(切換)]"
137 3: "客戶端 → 新實作 [舊實作已移除]"
138 principles: [所有變更在主幹, 功能開關, 過渡期共存]
139
140 parallel_change:
141 aka: "Expand-Migrate-Contract"
142 phases:
143 expand: "新增新的在舊的旁邊,新程式碼用新的,舊的仍運作"
144 migrate: "更新所有客戶端用新的,驗證,資料遷移"
145 contract: "移除舊的,清理,更新文件"
146
147# === 安全策略:遺留程式碼 ===
148safety:
149 legacy:
150 definition: "沒有測試的程式碼(不論年齡)"
151 dilemma: "安全修改需要測試 → 加測試需要修改程式碼"
152 solution: "使用安全技術先加測試"
153
154 characterization_tests:
155 purpose: "捕捉現有行為(非驗證正確性)"
156 process:
157 1: "呼叫要理解的程式碼"
158 2: "寫預期會失敗的斷言"
159 3: "執行,觀察實際結果"
160 4: "更新斷言以匹配實際行為"
161 5: "重複直到涵蓋需要修改的行為"
162 principle: "記錄程式碼做什麼,而非應該做什麼"
163
164 scratch_refactoring:
165 definition: "為了理解而重構,捨棄所有變更"
166 workflow:
167 1: "建立探針分支(或 git stash)"
168 2: "大膽重構以理解"
169 3: "記錄學到的內容"
170 4: "捨棄變更(git reset --hard)"
171 5: "應用學習撰寫特徵測試"
172 when: [程式碼太複雜, 無文件, 需要快速建立心智模型]
173 principle: "目標是理解,不是整潔程式碼"
174
175 seams:
176 definition: "可以在不編輯程式碼的情況下改變行為的地方"
177 object: "透過多型覆寫(注入測試替身)"
178 preprocessing: "編譯時替換(巨集)"
179 link: "連結時替換(DI,模組替換)"
180
181 sprout_wrap:
182 sprout_method: "新邏輯 → 建立新方法,從舊的呼叫"
183 sprout_class: "新邏輯獨立演進 → 新類別"
184 wrap_method: "加入前後行為 → 重命名原方法,建立包裝器"
185 wrap_class: "裝飾現有 → 裝飾者模式"
186 principle: "新程式碼用 TDD;遺留程式碼在測試前保持不動"
187
188# === 資料庫:重構 ===
189db_expand_contract:
190 expand: "新增新欄位/表,應用程式同時寫入,可安全回滾"
191 migrate: "複製資料,驗證一致性,應用程式從新的讀取"
192 contract: "確認舊的未使用,移除舊的,清理雙寫"
193
194db_scenarios:
195 rename_column: {strategy: "新增→遷移→刪除", risk: 中}
196 split_table: {strategy: "新表+外鍵→遷移→調整", risk: 高}
197 merge_tables: {strategy: "新表→合併→切換", risk: 高}
198 change_datatype: {strategy: "新欄位→轉換→切換", risk: 中}
199 add_not_null: {strategy: "填預設→加約束", risk: 低}
200
201# === 工作流程:安全重構 ===
202before: [定義成功標準, "覆蓋率>80%", 乾淨工作目錄, 建立分支, 與團隊溝通]
203during: [一次一個小變更, 每次變更後測試, 失敗就復原, 頻繁提交, 不加新功能]
204after: [所有測試通過, 可衡量地更好, 文件已更新, 團隊已審查, 沒有新功能]
205
206# === 指標 ===
207code_quality:
208 cyclomatic_complexity: "每函式<10"
209 cognitive_complexity: "越低越好"
210 coupling: "降低"
211 cohesion: "提高"
212 duplication: "<3%"
213
214test_quality:
215 coverage: "≥80%,不降低"
216 speed: "重構後更快"
217 flaky_count: "降低"
218
219# === 技術債管理 ===
220quadrant: # Martin Fowler
221 prudent_deliberate: "我們知道這是債務"
222 reckless_deliberate: "沒時間做設計"
223 prudent_inadvertent: "現在知道應該怎麼做了"
224 reckless_inadvertent: "什麼是分層?"
225
226priority:
227 high: {criteria: "阻塞開發,頻繁出錯", action: "立即處理"}
228 medium: {criteria: "拖慢開發,增加複雜度", action: "規劃到下個迭代"}
229 low: {criteria: "小麻煩,影響局部", action: "有機會就處理"}
230
231tracking:
232 fields: [描述, 影響, 估計工作量, 忽視風險, 相關程式碼]
233
234# === 決策矩陣摘要 ===
235decision_matrix:
236 - {strategy: "預備性重構", scale: "小", risk: "低", use: "降低功能開發阻力"}
237 - {strategy: "童子軍規則", scale: "極小", risk: "低", use: "持續償債"}
238 - {strategy: "紅-綠-重構", scale: "小", risk: "低", use: "TDD 開發循環"}
239 - {strategy: "絞殺榕", scale: "大", risk: "中", use: "系統汰換"}
240 - {strategy: "防腐層", scale: "中", risk: "低", use: "新舊共存"}
241 - {strategy: "抽象分支", scale: "大", risk: "中", use: "主幹重構"}
242 - {strategy: "平行變更", scale: "中", risk: "低", use: "介面/Schema 遷移"}
243 - {strategy: "特徵測試", scale: "—", risk: "—", use: "遺留重構的前置條件"}
244 - {strategy: "探針式重構", scale: "小", risk: "低", use: "理解黑盒程式碼"}
245
246# === 策略選擇 ===
247selection_guide:
248 功能被混亂程式碼阻擋: "預備性重構"
249 在Bug修復中接觸程式碼: "童子軍規則"
250 用TDD寫新程式碼: "紅-綠-重構"
251 取代整個遺留系統: "絞殺榕"
252 整合遺留不被污染: "防腐層"
253 在主幹重構共享程式碼: "抽象分支"
254 變更廣泛使用的介面: "平行變更"
255 處理未測試的遺留: "特徵測試 + 探針式重構 先做"
256```
257
258---
259
260## 配置偵測
261
262### 偵測順序
263
2641. 檢查 `CONTRIBUTING.md` 中的「停用技能」區段
2652. 檢查 `CONTRIBUTING.md` 中的「重構標準」區段
2663. 如果未找到,**預設使用標準重構實踐**
267
268---
269
270## 詳細指南
271
272完整標準請參閱:
273- [重構標準](../../core/refactoring-standards.md)
274
275---
276
277## 相關標準
278
279- [重構標準](../../core/refactoring-standards.md) - 核心標準
280- [測試驅動開發](../../core/test-driven-development.md) - TDD 重構階段
281- [程式碼審查檢查清單](../../core/code-review-checklist.md) - 重構 PR 審查
282- [簽入標準](../../core/checkin-standards.md) - 提交前要求
283- [TDD 助手](../tdd-assistant/SKILL.md) - TDD 工作流程
284
285---
286
287## 版本歷史
288
289| 版本 | 日期 | 變更 |
290|------|------|------|
291| 2.0.0 | 2026-01-21 | 新增戰術性策略(預備性重構、童子軍規則)、防腐層、決策矩陣摘要。重組為戰術性/戰略性/安全防護三層。 |
292| 1.0.0 | 2026-01-12 | 初始發布 |
293
294---
295
296## 授權
297
298本技能以 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) 授權發布。
299
300**來源**: [universal-dev-standards](https://github.com/AsiaOstrich/universal-dev-standards)