refactor
コードのリファクタリング、品質向上、既存実装の再構築を支援し、テストを重視した体系的な改善や影響範囲の分析、開発ドキュメントとの連携を行い、技術的負債の解消に貢献するSkill。
📜 元の英語説明(参考)
Systematic refactoring skill with test coverage requirements. Supports scope analysis, test-first refactoring, and integration with DevDocs workflow. Use when users need to refactor code, improve code quality, or restructure existing implementations. Triggers on keywords like "refactor", "重构", "优化代码", "代码改造", "tech debt", "技术债".
🇯🇵 日本人クリエイター向け解説
コードのリファクタリング、品質向上、既存実装の再構築を支援し、テストを重視した体系的な改善や影響範囲の分析、開発ドキュメントとの連携を行い、技術的負債の解消に貢献するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o refactor.zip https://jpskill.com/download/8780.zip && unzip -o refactor.zip && rm refactor.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/8780.zip -OutFile "$d\refactor.zip"; Expand-Archive "$d\refactor.zip" -DestinationPath $d -Force; ri "$d\refactor.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
refactor.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
refactorフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
リファクタリング
システム化されたリファクタリング skill で、リファクタリングプロセスが安全で、追跡可能で、品質基準に準拠していることを保証します。
言語
- 中国語と英語の両方での質問を受け付けます
- 常に中国語で応答します
- すべてのドキュメントを中国語で生成します
トリガー条件
- ユーザーが既存のコードをリファクタリングする必要がある
- ユーザーがコード品質を最適化することを要求する
- ユーザーが技術的負債、コードの改造について言及する
- ユーザーが既存の実装をレビューし、改善することを要求する
核心原則
リファクタリング安全原則
┌─────────────────────────────────────────────────────────┐
│ リファクタリング前に満たすべきこと │
├─────────────────────────────────────────────────────────┤
│ 1. 明確なリファクタリング範囲があること │
│ 2. 十分なテストカバレッジがあること(≥80%) │
│ 3. すべてのテストがパスすること │
├─────────────────────────────────────────────────────────┤
│ リファクタリングプロセス中 │
├─────────────────────────────────────────────────────────┤
│ 1. 小さなステップでリファクタリングし、各ステップで検証可能であること │
│ 2. 各ステップ後にテストを実行すること │
│ 3. 新しい機能を追加しないこと │
├─────────────────────────────────────────────────────────┤
│ リファクタリング後に満たすべきこと │
├─────────────────────────────────────────────────────────┤
│ 1. すべてのテストがパスすること │
│ 2. カバレッジが低下しないこと │
│ 3. リファクタリングレポートを生成すること │
└─────────────────────────────────────────────────────────┘
他の Skills との連携
| シーン | 連携 Skill | 説明 |
|---|---|---|
| コードがテストできない | /devdocs-retrofit |
リバースエンジニアリング後に書き換える |
| UI リファクタリング | /ui-skills |
UI 制約仕様を適用する |
| コード品質チェック | /code-quality |
MTE 原則を適用する |
| ドキュメント化が必要 | DevDocs 流程 | 規範ドキュメントを生成する |
| テストの作成/補完 | /testing-guide |
テスト品質制約(アサーション、Mock、変異テスト) |
Workflow
1. リファクタリング範囲を決定する
│
├── ユーザーが範囲を指定 → Step 2
└── 範囲が指定されていない → システムレビュー → 問題を発見 → ユーザーが範囲を確認
│
▼
2. テスト状態を評価する
│
├── テストがあり、カバレッジ ≥80% → Step 4
├── テストがあるが、カバレッジ <80% → Step 3(テストの補完)
└── テストがない → Step 3(新規テスト)
│
▼
3. テストの補完/新規作成
│
├── テスト可能 → テストを作成 → カバレッジ ≥80% を確保 → Step 4
└── テスト不可能 → "書き換えが必要"とマーク → Step 5
│
▼
4. リファクタリングを実行する
│
├── 普通のコード → /code-quality を適用
└── UI コード → /ui-skills を適用
│
▼
5. 書き換えプロセス(必要な場合)
│
└── /devdocs-retrofit を呼び出してリバースエンジニアリング → ドキュメントを生成 → 再実装
│
▼
6. 検証とレポート
│
├── すべてのテストを実行
├── カバレッジをチェック
└── リファクタリングレポートを生成
Step 1: リファクタリング範囲を決定する
1.1 ユーザーが範囲を指定
ユーザーがリファクタリング範囲を明確に指定している場合は、それを直接使用します。
ユーザーが範囲を指定する例:
- "src/services/user.ts をリファクタリングする"
- "ユーザー認証モジュールをリファクタリングする"
- "UserService クラスを最適化する"
1.2 システムレビュー(範囲が指定されていない場合)
以下のチェックリストを使用してコードをレビューします。
Code Smells チェックリスト
| 問題タイプ | 検出方法 | 優先度ルール |
|---|---|---|
| 長すぎる関数 | 行数 > 50 | P0 (もし > 100 なら)、P1 (もし > 50 なら) |
| 多すぎるパラメータ | パラメータ > 5 | P1 |
| 深すぎるネスト | ネスト > 3 層 | P1 |
| 重複コード | 類似コードブロック ≥ 3 箇所 | P0 |
| ゴッドクラス | 行数 > 500 または責務 > 3 | P0 |
| データの偏執性 | 他のクラスのデータに頻繁にアクセスする | P2 |
| データクラスター | 複数のパラメータが常に一緒に現れる | P2 |
レビューレポートテンプレート
# コードレビューレポート
## レビュー範囲
- **ディレクトリ**: <path>
- **ファイル数**: <count>
- **コード行数**: <lines>
## 発見された問題
### P0 - 必須修正
| # | ファイル | 問題 | 説明 |
|---|------|------|------|
| 1 | `src/services/user.ts` | ゴッドクラス | UserService が 800 行を超え、5 種類の責務を含む |
| 2 | `src/utils/helper.ts` | 重複コード | processData 関数が 4 箇所で類似した実装を持つ |
### P1 - 推奨修正
| # | ファイル | 問題 | 説明 |
|---|------|------|------|
| 1 | `src/api/handler.ts:45` | 長すぎる関数 | handleRequest 関数が 78 行 |
| 2 | `src/models/order.ts:120` | 深すぎるネスト | validateOrder が 4 層ネストしている |
### P2 - 任意修正
| # | ファイル | 問題 | 説明 |
|---|------|------|------|
| 1 | `src/services/payment.ts` | データの偏執性 | Order オブジェクトの属性に頻繁にアクセスする |
## 推奨されるリファクタリング順序
1. [ ] UserService の分割(P0、影響範囲が大きい)
2. [ ] processData の重複を解消(P0、複数箇所で参照)
3. [ ] handleRequest の分割(P1)
4. [ ] validateOrder の簡略化(P1)
## 予想される影響
- 関連ファイル: 12
- 影響を受ける可能性のあるテスト: 45
- リスク評価: 中
1.3 ユーザー確認
AskUserQuestion を使用して、ユーザーにリファクタリング範囲を確認させます。
以下の問題が見つかりました。リファクタリングする範囲を選択してください。
1. **すべてリファクタリング** - 優先度に従ってすべての問題を順番に処理します
2. **P0 のみ** - 必須修正の問題のみを処理します
3. **範囲を指定** - リファクタリングする項目を手動で選択します
4. **今はリファクタリングしない** - レビューレポートのみを保存します
Step 2: テスト状態を評価する
2.1 テストカバレッジを検出する
# テストフレームワークを検出する
# Jest / Vitest / Mocha / pytest など
# カバレッジレポートを実行する
npm run test:coverage # または対応するコマンド
# ターゲットファイルのカバレッジをチェックする
2.2 テスト状態の分類
| 状態 | 条件 | 次のステップ |
|---|---|---|
| 充分 | 行カバレッジ ≥80%、分岐カバレッジ ≥80% | → Step 4 リファクタリングを実行 |
| 不足 | テストがあるが、カバレッジ <80% | → Step 3 テストを補完 |
| テストなし | ターゲット範囲にテストファイルがない | → Step 3 新規テストを作成 |
| テスト不可能 | コード構造が原因で有効なテストを作成できない | → Step 5 書き換えプロセス |
2.3 テスト可能性の評価
コードが "テスト不可能" と判定される条件:
テスト不可能なコードの特徴:
- [ ] 外部依存関係のハードコーディング(データベース、API、ファイルシステム)
- [ ] 依存関係を注入できない(コンストラクタで具体的なクラスを new する)
- [ ] ビジネスロジックと IO が混在し、分離できない
- [ ] グローバル状態への依存
- [ ] Mock できないサードパーティライブラリとの深い結合
2 つ以上の条件を満たす場合、"テスト不可能" とマークする
Step 3: テストの補完/新規作成
重要: テストを作成する際は、
/testing-guideの品質制約に従う必要があります。
3.1 テスト戦略
/testing-guide のテスト品質ピラミッドを参照してください。
テスト品質要件(基礎から高度):
Level 1: カバレッジ - 行/分岐 ≥ 80%
Level 2: アサーション品質 - 弱いアサーションを禁止し、具体的な値を検証する
Level 3: テスト有効性 - 変異スコア ≥ 80%(推奨)
3.2 テスト作成規範
/testing-guide の制約に従ってください。
- テストの根拠は要件からであり、コードからではない
- 各テストには具体的なアサーションが必要(toBeDefined, toBeTruthy などの弱いアサーションを禁止)
- テスト名は予想される動作を記述する:
[メソッド] は [条件] の場合 [動作] するはず - Mock は外部依存関係にのみ使用し、内部実装は Mock しない
3.3 カバレッジ検証
# テストを実行し、カバレッジをチェックする
npm run test:coverage -- --collectCoverageFrom='<target-path>'
# 以下を確実に満たす:
# - 行カバレッジ ≥ 80%
# - 分岐カバレッジ ≥ 80%
3.4 変異テスト検証(推奨)
# テストの有効性を検証する
npx stryker run --mutate '<target-path>'
# 目標:変異スコア ≥ 80%
詳細なテスト作成指導、Mock 戦略、変異テスト設定については、
/testing-guideを参照してください。
Step 4: リファクタリングを実行する
4.1 リファクタリング前のチェック
- [ ] すべてのテストがパスしている
- [ ] カバレッジが要件を満たしている(≥80%)
- [ ] Git ブランチが作成されているか、ロールバック可能である
4.2 リファクタリング戦略
普通のコードのリファクタリング
/code-quality MTE 原則を適用します。
| 問題 | リファクタリング手法 | 検証 |
|---|---|---|
| 長すぎる関数 | 関数の抽出 | 各関数 ≤50 行 |
| 多すぎるパラメータ | パラメータオブジェクト | パラメータ ≤5 個 |
| 深すぎるネスト | 早めのリターン、関数の抽出 | ネスト ≤3 層 |
| 重複コード | 共通関数の抽出 | 重複ブロックなし |
| ゴッドクラス | 責務の分割 | 各クラス単一責務 |
UI コードのリファクタリング
/ui-skills 制約を呼び出します。
UI リファクタリングチェックポイント:
- [ ] Tailwind CSS のデフォルト値を使用する
- [ ] アクセシブルなコンポーネントプリミティブを使用する(Base UI/Radix/React Aria)
- [ ] アニメーションは transform/opacity のみを使用する
- [ ] prefers-reduced-motion に従う
- [ ] 空の状態には明確な次のステップがある
4.3 小さなステップでのリファクタリング原則
各リファクタリングステップ:
1. 1 つのリファクタリング操作を実行する
2. テストを実行する
3. テストがパス → 次のステップに進む
4. テストが失敗 → ロールバックし、再分析する
5. コミットする(任意、頻繁なコミットを推奨)
4.4 リファクタリング進捗の追跡
TodoWrite を使用してリファクタリング進捗を追跡します。
リファクタリングタスクの例:
1. [x] validateUser 関数を抽出する
2. [x] UserService を UserQueryService に分割する
3. [ ] UserService を UserCommandService に分割する
4. [ ] processData の重複を解消する
Step 5: 書き換えプロセス
コードが "テスト不可能" と判定された場合、書き換えプロセスに入ります。
5.1 トリガー条件
書き換えプロセスに入る条件:
- コードが "テスト不可能" と評価された
- リファクタリング後もテストが 80% のカバレッジに達しない
- ユーザーが明確に書き換えを要求する
5.2 書き換えプロセス
1. /devdocs-retrofit を呼び出す
│
├── モード:コードのリバースエンジニアリングによる推論
├── 出力:要件ドキュメント、システム設計
│
▼
2. DevDocs ドキュメントに基づいて再実装する
│
├── /code-quality MTE 原則に従う
├──
(原文はここで切り詰められています) 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Refactor
系统化重构 skill,确保重构过程安全、可追溯、符合质量标准。
Language
- Accept questions in both Chinese and English
- Always respond in Chinese
- Generate all documents in Chinese
Trigger Conditions
- 用户需要重构现有代码
- 用户要求优化代码质量
- 用户提到技术债、代码改造
- 用户要求审查并改进现有实现
核心原则
重构安全原则
┌─────────────────────────────────────────────────────────┐
│ 重构前必须满足 │
├─────────────────────────────────────────────────────────┤
│ 1. 有明确的重构范围 │
│ 2. 有足够的测试覆盖(≥80%) │
│ 3. 所有测试通过 │
├─────────────────────────────────────────────────────────┤
│ 重构过程中 │
├─────────────────────────────────────────────────────────┤
│ 1. 小步重构,每步可验证 │
│ 2. 每步后运行测试 │
│ 3. 不添加新功能 │
├─────────────────────────────────────────────────────────┤
│ 重构后必须满足 │
├─────────────────────────────────────────────────────────┤
│ 1. 所有测试通过 │
│ 2. 覆盖率不降低 │
│ 3. 生成重构报告 │
└─────────────────────────────────────────────────────────┘
与其他 Skills 的协作
| 场景 | 协作 Skill | 说明 |
|---|---|---|
| 代码无法测试 | /devdocs-retrofit |
逆向分析后重写 |
| UI 重构 | /ui-skills |
应用 UI 约束规范 |
| 代码质量检查 | /code-quality |
应用 MTE 原则 |
| 需要文档化 | DevDocs 流程 | 生成规范文档 |
| 编写/补充测试 | /testing-guide |
测试质量约束(断言、Mock、变异测试) |
Workflow
1. 确定重构范围
│
├── 用户指定范围 → Step 2
└── 未指定范围 → 系统审查 → 发现问题 → 用户确认范围
│
▼
2. 评估测试状态
│
├── 有测试且覆盖 ≥80% → Step 4
├── 有测试但覆盖 <80% → Step 3(补充测试)
└── 无测试 → Step 3(新建测试)
│
▼
3. 补充/新建测试
│
├── 可测试 → 编写测试 → 确保覆盖率 ≥80% → Step 4
└── 不可测试 → 标记为"需要重写" → Step 5
│
▼
4. 执行重构
│
├── 普通代码 → 应用 /code-quality
└── UI 代码 → 应用 /ui-skills
│
▼
5. 重写流程(如需要)
│
└── 调用 /devdocs-retrofit 逆向 → 生成文档 → 重新实现
│
▼
6. 验证与报告
│
├── 运行所有测试
├── 检查覆盖率
└── 生成重构报告
Step 1: 确定重构范围
1.1 用户指定范围
如果用户明确指定了重构范围,直接使用。
用户指定范围示例:
- "重构 src/services/user.ts"
- "重构用户认证模块"
- "优化 UserService 类"
1.2 系统审查(未指定范围时)
使用以下检查清单审查代码:
Code Smells 检查清单
| 问题类型 | 检测方法 | 优先级规则 |
|---|---|---|
| 过长函数 | 行数 > 50 | P0 如果 > 100,P1 如果 > 50 |
| 过多参数 | 参数 > 5 | P1 |
| 过深嵌套 | 嵌套 > 3 层 | P1 |
| 重复代码 | 相似代码块 ≥ 3 处 | P0 |
| 上帝类 | 行数 > 500 或职责 > 3 | P0 |
| 特性依恋 | 频繁访问其他类数据 | P2 |
| 数据泥团 | 多参数总是一起出现 | P2 |
审查报告模板
# 代码审查报告
## 审查范围
- **目录**: <path>
- **文件数**: <count>
- **代码行数**: <lines>
## 发现的问题
### P0 - 必须修复
| # | 文件 | 问题 | 描述 |
|---|------|------|------|
| 1 | `src/services/user.ts` | 上帝类 | UserService 超过 800 行,包含 5 种职责 |
| 2 | `src/utils/helper.ts` | 重复代码 | processData 函数在 4 处有相似实现 |
### P1 - 建议修复
| # | 文件 | 问题 | 描述 |
|---|------|------|------|
| 1 | `src/api/handler.ts:45` | 过长函数 | handleRequest 函数 78 行 |
| 2 | `src/models/order.ts:120` | 过深嵌套 | validateOrder 嵌套 4 层 |
### P2 - 可选修复
| # | 文件 | 问题 | 描述 |
|---|------|------|------|
| 1 | `src/services/payment.ts` | 特性依恋 | 频繁访问 Order 对象属性 |
## 建议重构顺序
1. [ ] UserService 拆分(P0,影响范围大)
2. [ ] 消除 processData 重复(P0,多处引用)
3. [ ] handleRequest 拆分(P1)
4. [ ] validateOrder 简化(P1)
## 预计影响
- 涉及文件: 12
- 可能影响的测试: 45
- 风险评估: 中
1.3 用户确认
使用 AskUserQuestion 让用户确认重构范围:
发现以下问题,请选择要重构的范围:
1. **全部重构** - 按优先级依次处理所有问题
2. **仅 P0** - 只处理必须修复的问题
3. **指定范围** - 手动选择要重构的项目
4. **暂不重构** - 仅保存审查报告
Step 2: 评估测试状态
2.1 检测测试覆盖率
# 检测测试框架
# Jest / Vitest / Mocha / pytest 等
# 运行覆盖率报告
npm run test:coverage # 或对应命令
# 检查目标文件覆盖率
2.2 测试状态分类
| 状态 | 条件 | 下一步 |
|---|---|---|
| 充分 | 行覆盖 ≥80%,分支覆盖 ≥80% | → Step 4 执行重构 |
| 不足 | 有测试但覆盖率 <80% | → Step 3 补充测试 |
| 无测试 | 目标范围无测试文件 | → Step 3 新建测试 |
| 不可测试 | 代码结构导致无法编写有效测试 | → Step 5 重写流程 |
2.3 可测试性评估
代码被判定为"不可测试"的条件:
不可测试的代码特征:
- [ ] 硬编码外部依赖(数据库、API、文件系统)
- [ ] 无法注入依赖(构造函数中 new 具体类)
- [ ] 业务逻辑与 IO 混合,无法分离
- [ ] 全局状态依赖
- [ ] 无法 Mock 的第三方库深度耦合
如果满足 2 个以上条件,标记为"不可测试"
Step 3: 补充/新建测试
重要: 编写测试时必须遵循
/testing-guide的质量约束
3.1 测试策略
参考 /testing-guide 测试质量金字塔:
测试质量要求(从基础到高级):
Level 1: 覆盖率 - 行/分支 ≥ 80%
Level 2: 断言质量 - 禁止弱断言,验证具体值
Level 3: 测试有效性 - 变异得分 ≥ 80%(推荐)
3.2 测试编写规范
遵循 /testing-guide 的约束:
- 测试依据来自需求,不是代码
- 每个测试必须有具体断言(禁止 toBeDefined, toBeTruthy 等弱断言)
- 测试名称描述预期行为:
[方法] 应该 [行为] 当 [条件] - Mock 只用于外部依赖,不 Mock 内部实现
3.3 覆盖率验证
# 运行测试并检查覆盖率
npm run test:coverage -- --collectCoverageFrom='<target-path>'
# 确保满足:
# - 行覆盖率 ≥ 80%
# - 分支覆盖率 ≥ 80%
3.4 变异测试验证(推荐)
# 验证测试有效性
npx stryker run --mutate '<target-path>'
# 目标:变异得分 ≥ 80%
详细的测试编写指导、Mock 策略、变异测试配置请参考
/testing-guide
Step 4: 执行重构
4.1 重构前检查
- [ ] 测试全部通过
- [ ] 覆盖率满足要求(≥80%)
- [ ] 已创建 Git 分支或可回滚
4.2 重构策略
普通代码重构
应用 /code-quality MTE 原则:
| 问题 | 重构手法 | 验证 |
|---|---|---|
| 过长函数 | 提取函数 | 每个函数 ≤50 行 |
| 过多参数 | 参数对象 | 参数 ≤5 个 |
| 过深嵌套 | 早返回、提取函数 | 嵌套 ≤3 层 |
| 重复代码 | 提取公共函数 | 无重复块 |
| 上帝类 | 拆分职责 | 每类单一职责 |
UI 代码重构
调用 /ui-skills 约束:
UI 重构检查点:
- [ ] 使用 Tailwind CSS 默认值
- [ ] 使用可访问组件原语(Base UI/Radix/React Aria)
- [ ] 动画只使用 transform/opacity
- [ ] 遵循 prefers-reduced-motion
- [ ] 空状态有明确的下一步操作
4.3 小步重构原则
每次重构步骤:
1. 执行一个重构操作
2. 运行测试
3. 测试通过 → 继续下一步
4. 测试失败 → 回滚,重新分析
5. 提交(可选,推荐频繁提交)
4.4 重构进度追踪
使用 TodoWrite 追踪重构进度:
重构任务示例:
1. [x] 提取 validateUser 函数
2. [x] 将 UserService 拆分为 UserQueryService
3. [ ] 将 UserService 拆分为 UserCommandService
4. [ ] 消除 processData 重复
Step 5: 重写流程
当代码被判定为"不可测试"时,进入重写流程。
5.1 触发条件
进入重写流程的条件:
- 代码被评估为"不可测试"
- 重构后测试仍无法达到 80% 覆盖率
- 用户明确要求重写
5.2 重写流程
1. 调用 /devdocs-retrofit
│
├── 模式:代码逆向推导
├── 输出:需求文档、系统设计
│
▼
2. 基于 DevDocs 文档重新实现
│
├── 遵循 /code-quality MTE 原则
├── UI 部分遵循 /ui-skills
│
▼
3. 编写测试(测试先行)
│
├── 覆盖率 ≥ 80%
│
▼
4. 实现新代码
│
▼
5. 迁移验证
│
├── 功能对比测试
├── 性能对比(如适用)
└── 回归测试
5.3 重写文档
重写时生成的文档:
docs/devdocs/
├── 01-requirements.md # 从代码逆向的需求
├── 02-system-design.md # 新设计(可测试)
├── 03-test-cases.md # 测试方案
└── 05-refactor-rewrite.md # 重写报告
Step 6: 验证与报告
6.1 验证清单
- [ ] 所有测试通过
- [ ] 覆盖率 ≥ 80%(行和分支)
- [ ] 覆盖率未降低
- [ ] 无新增 lint 警告
- [ ] 功能行为不变
6.2 重构报告模板
# 重构报告
## 概览
- **重构范围**: <scope>
- **重构时间**: <timestamp>
- **重构类型**: 普通重构 / 重写
## 重构前状态
| 指标 | 值 |
|------|-----|
| 文件数 | 5 |
| 代码行数 | 1,200 |
| 测试覆盖率(行) | 45% |
| 测试覆盖率(分支) | 38% |
| 主要问题 | 上帝类、过长函数 |
## 重构后状态
| 指标 | 值 | 变化 |
|------|-----|------|
| 文件数 | 8 | +3 |
| 代码行数 | 980 | -220 |
| 测试覆盖率(行) | 85% | +40% |
| 测试覆盖率(分支) | 82% | +44% |
## 重构内容
### 已完成
1. [x] UserService 拆分为 UserQueryService + UserCommandService
2. [x] 提取 validateUser、formatUser 函数
3. [x] 消除 processData 重复代码
4. [x] 补充单元测试 23 个
### 变更文件
| 文件 | 操作 | 说明 |
|------|------|------|
| `src/services/user.ts` | 修改 | 拆分职责 |
| `src/services/user-query.ts` | 新增 | 查询服务 |
| `src/services/user-command.ts` | 新增 | 命令服务 |
| `src/utils/user-utils.ts` | 新增 | 提取的工具函数 |
| `tests/services/user.test.ts` | 修改 | 补充测试 |
## 测试报告
Test Suites: 12 passed, 12 total Tests: 89 passed, 89 total Coverage: Lines: 85.2% Branches: 82.1% Functions: 88.5%
## 风险与注意事项
- `UserQueryService` 和 `UserCommandService` 需要分别注入
- 原 `UserService` 保留为门面类,后续可逐步迁移调用方
## 下一步建议
1. 更新调用方代码,逐步使用新的服务类
2. 监控生产环境,确保行为一致
3. 考虑删除原 UserService 门面类
Output
输出文件
docs/devdocs/
├── 05-refactor-audit.md # 代码审查报告(Step 1)
├── 05-refactor-plan.md # 重构计划(Step 1 确认后)
├── 05-refactor-report.md # 重构报告(Step 6)
└── 05-refactor-rewrite.md # 重写报告(如适用)
文件命名规则
- 普通重构:
05-refactor-*.md - 如果是针对特定模块:
05-refactor-<module>-*.md
Constraints
范围约束
- [ ] 必须明确重构范围后才能开始
- [ ] 未指定范围时必须先进行代码审查
- [ ] 用户必须确认重构范围
测试约束
- [ ] 重构前测试覆盖率必须 ≥80%
- [ ] 无测试或覆盖不足时必须先补充测试
- [ ] 代码不可测试时必须进入重写流程
- [ ] 重构后所有测试必须通过
- [ ] 重构后覆盖率不得降低
过程约束
- [ ] 每步重构后必须运行测试
- [ ] 不得在重构中添加新功能
- [ ] 使用 TodoWrite 追踪重构进度
- [ ] 频繁提交,保持可回滚
协作约束
- [ ] UI 重构必须应用
/ui-skills约束 - [ ] 代码重构必须应用
/code-qualityMTE 原则 - [ ] 重写时必须使用
/devdocs-retrofit生成文档
文档约束
- [ ] 必须生成重构报告
- [ ] 重写时必须生成 DevDocs 文档
- [ ] 报告必须包含前后对比
Error Handling
测试失败
重构后测试失败。
失败的测试:
- UserService.test.ts: validateUser should return false for invalid email
操作选项:
1. 回滚此次重构步骤
2. 查看失败详情并修复
3. 跳过此测试(不推荐)
建议:回滚到上一个通过的状态,重新分析重构方案。
覆盖率不足
当前测试覆盖率不满足重构要求。
目标范围: src/services/user.ts
当前覆盖率:
- 行覆盖: 45% (要求 ≥80%)
- 分支覆盖: 38% (要求 ≥80%)
操作选项:
1. **补充测试**(推荐)- 为未覆盖代码编写测试
2. 降低要求 - 以当前覆盖率开始重构(风险较高)
3. 标记为不可测试 - 进入重写流程
代码不可测试
目标代码被评估为"不可测试"。
原因:
- [x] 硬编码数据库连接
- [x] 业务逻辑与 IO 混合
- [ ] 全局状态依赖
建议进入重写流程:
1. 使用 /devdocs-retrofit 逆向分析代码
2. 生成需求和设计文档
3. 按照可测试的设计重新实现
是否进入重写流程?
Integration with DevDocs
在 DevDocs 流程中的位置
DevDocs 工作流(含重构):
新项目:
/devdocs-requirements → /devdocs-system-design → /devdocs-test-cases → /devdocs-dev-tasks
│
▼
开发实现
┌────────┼────────┐
▼ ▼ ▼
/code-quality /ui-skills /refactor
│
已有项目: │
/devdocs-retrofit ←─────────────────────────────────────────────────────────────────────┘
│ (不可测试时)
▼
标准化文档 → 重新实现
与其他 Skills 的调用关系
/refactor
│
├── 代码审查 → /code-quality (MTE 原则)
│
├── UI 重构 → /ui-skills (UI 约束)
│
├── 不可测试 → /devdocs-retrofit (逆向分析)
│ │
│ ├── /devdocs-requirements
│ ├── /devdocs-system-design
│ └── /devdocs-test-cases
│
└── 测试编写 → /devdocs-test-cases (测试策略参考)