code-quality
保守性やテスト容易性の高いコードを書くための制約を設け、過剰な設計を避け、リファクタリングを支援し、コードレビューのチェックリストを提供するなど、コードの品質向上を総合的にサポートするSkill。
📜 元の英語説明(参考)
Opinionated constraints for writing maintainable, testable code. Apply MTE principles, avoid over-engineering, guide refactoring, and provide code review checklists. Use when users write code, refactor, or need code review. Triggers on keywords like "code quality", "refactor", "review", "MTE", "代码质量", "重构", "审查".
🇯🇵 日本人クリエイター向け解説
保守性やテスト容易性の高いコードを書くための制約を設け、過剰な設計を避け、リファクタリングを支援し、コードレビューのチェックリストを提供するなど、コードの品質向上を総合的にサポートするSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o code-quality.zip https://jpskill.com/download/8765.zip && unzip -o code-quality.zip && rm code-quality.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/8765.zip -OutFile "$d\code-quality.zip"; Expand-Archive "$d\code-quality.zip" -DestinationPath $d -Force; ri "$d\code-quality.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
code-quality.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
code-qualityフォルダができる - 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 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
コード品質
コーディングとリファクタリング時の品質制約、コードの保守性、テスト容易性、適切な拡張性を確保します。
言語
- 中国語と英語の両方の質問を受け付けます
- 常に中国語で回答します
トリガー条件
- ユーザーが新しいコードを書いている
- ユーザーが既存のコードをリファクタリングする必要がある
- ユーザーが Code Review チェックリストを必要としている
- ユーザーが MTE 原則、コード品質、過剰設計の回避について言及している
核心原則:MTE
すべてのコードは MTE 原則 に従う必要があります。
| 原則 | 説明 | チェックポイント |
|---|---|---|
| Maintainability | 可维护性 (保守性) | 职责单一、依赖清晰、易于理解 (単一責任、明確な依存関係、理解しやすい) |
| Testability | 可测试性 (テスト容易性) | 核心逻辑可单元测试、依赖可 Mock (コアロジックは単体テスト可能、依存関係は Mock 可能) |
| Extensibility | 可扩展性 (拡張性) | 预留合理扩展点、接口抽象 (合理的な拡張ポイントの予約、インターフェースの抽象化) |
Part 1: コーディング制約
モジュール設計
単一責任
✅ 正しい:一个类/函数只做一件事 (クラス/関数は 1 つのことだけを行う)
- UserService: 用户业务逻辑 (ユーザービジネスロジック)
- UserRepository: 用户数据访问 (ユーザーデータアクセス)
- UserValidator: 用户数据校验 (ユーザーデータ検証)
❌ 错误:一个类做多件事 (クラスが複数のことを行う)
- UserManager: 业务逻辑 + 数据访问 + 校验 + 发送邮件 (ビジネスロジック + データアクセス + 検証 + メール送信)
依存方向
┌─────────────────────────────────────┐
│ Interface Layer │ ← 薄层,无业务逻辑 (薄い層、ビジネスロジックなし)
├─────────────────────────────────────┤
│ Service Layer │ ← 业务逻辑(核心)(ビジネスロジック(コア))
├─────────────────────────────────────┤
│ Domain Layer │ ← 领域模型 (ドメインモデル)
├─────────────────────────────────────┤
│ Infrastructure Layer │ ← 可替换 (置換可能)
└─────────────────────────────────────┘
依赖规则:(依存ルール)
- 外层依赖内层 ✅ (外側の層は内側の層に依存する ✅)
- 内层依赖外层 ❌ (内側の層は外側の層に依存する ❌)
- 依赖接口,不依赖实现 ✅ (インターフェースに依存し、実装に依存しない ✅)
関数設計
関数長
- 推奨:単一の関数は 30 行を超えない
- 最大:50 行を超えない
- 超過時:複数の小さな関数に分割する
引数数
- 推奨:3 つ以下の引数
- 最大:5 つ以下の引数
- 超過時:引数オブジェクトを使用する
// ❌ 参数过多 (引数が多すぎる)
function createUser(name, email, age, role, department, manager) {}
// ✅ 使用参数对象 (引数オブジェクトを使用する)
function createUser(params: CreateUserParams) {}
ネスト深度
- 推奨:2 層以下のネスト
- 最大:3 層以下のネスト
- 超過時:関数を抽出するか、早期リターンを使用する
// ❌ 嵌套过深 (ネストが深すぎる)
if (a) {
if (b) {
if (c) {
// ...
}
}
}
// ✅ 早返回 (早期リターン)
if (!a) return;
if (!b) return;
if (!c) return;
// ...
テスト容易性設計
詳細なテスト作成仕様については、
/testing-guideを参照してください
核心原則
可测试代码的三个要素: (テスト可能なコードの 3 つの要素:)
1. 依赖可注入 - 外部依赖通过参数传入 (依存性の注入可能 - 外部依存関係は引数として渡される)
2. 纯函数优先 - 业务逻辑无副作用 (純粋関数優先 - ビジネスロジックに副作用がない)
3. 边界分离 - 业务逻辑与 IO 分离 (境界分離 - ビジネスロジックと IO を分離する)
依存性注入
// ❌ 硬编码依赖 (ハードコードされた依存関係)
class UserService {
private db = new Database();
private mailer = new EmailService();
}
// ✅ 依赖注入 (依存性注入)
class UserService {
constructor(
private db: IDatabase,
private mailer: IEmailService
) {}
}
純粋関数優先
// ❌ 有副作用,难测试 (副作用があり、テストが難しい)
function calculateTotal(items) {
const total = items.reduce((sum, item) => sum + item.price, 0);
console.log(`Total: ${total}`); // 副作用
analytics.track('calculate'); // 副作用
return total;
}
// ✅ 纯函数,易测试 (純粋関数、テストしやすい)
function calculateTotal(items) {
return items.reduce((sum, item) => sum + item.price, 0);
}
境界分離
// ❌ 业务逻辑混合 IO (ビジネスロジックと IO が混在)
async function processOrder(orderId) {
const order = await db.findOrder(orderId); // IO
if (order.total > 1000) { // 业务逻辑 (ビジネスロジック)
order.discount = 0.1;
}
await db.save(order); // IO
await email.send(order.user, 'confirmed'); // IO
}
// ✅ 分离业务逻辑 (ビジネスロジックを分離)
function applyDiscount(order) { // 纯业务逻辑,可测试 (純粋なビジネスロジック、テスト可能)
if (order.total > 1000) {
return { ...order, discount: 0.1 };
}
return order;
}
async function processOrder(orderId) {
const order = await db.findOrder(orderId);
const updated = applyDiscount(order); // 调用纯函数 (純粋関数を呼び出す)
await db.save(updated);
await email.send(order.user, 'confirmed');
}
テスト作成時:アサーションの品質、Mock 戦略、変異テストなどの詳細なガイダンスについては、
/testing-guideを参照してください
過剰設計の回避
YAGNI 原則
You Aren't Gonna Need It - あなたはそれを必要としないでしょう
// ❌ 过度设计:为假设需求添加配置 (過剰設計:仮定の要件のために構成を追加する)
const config = {
maxRetries: 3,
retryDelay: 1000,
enableCache: true,
cacheExpiry: 3600,
enableRateLimit: false, // 从未使用 (未使用)
rateLimitWindow: 60000, // 从未使用 (未使用)
enableMetrics: false, // 从未使用 (未使用)
metricsEndpoint: '', // 从未使用 (未使用)
};
// ✅ 只添加当前需要的配置 (現在必要な構成のみを追加する)
const config = {
maxRetries: 3,
retryDelay: 1000,
cacheExpiry: 3600,
};
抽象化のタイミング
❌ 过早抽象:(早期の抽象化:)
- 只有一个实现就创建接口 (実装が 1 つしかないのにインターフェースを作成する)
- 只有一处使用就提取函数 (1 か所しか使用しないのに関数を抽出する)
- 只有两个相似场景就创建基类 (2 つの類似したシナリオしかないのに基底クラスを作成する)
✅ 适时抽象(Rule of Three):(適切なタイミングでの抽象化 (Rule of Three):)
- 3 个以上实现时考虑接口 (3 つ以上の実装がある場合はインターフェースを検討する)
- 3 处以上重复时考虑提取 (3 か所以上の繰り返しがある場合は抽出を検討する)
- 3 个以上相似场景时考虑基类 (3 つ以上の類似したシナリオがある場合は基底クラスを検討する)
シンプルな解決策を優先
// ❌ 过度设计:简单场景用复杂模式 (過剰設計:単純なシナリオで複雑なパターンを使用する)
class UserFactory {
createAdmin() { return new AdminUser(); }
createMember() { return new MemberUser(); }
createGuest() { return new GuestUser(); }
}
// ✅ 简单场景用简单方案 (単純なシナリオで単純な解決策を使用する)
function createUser(role: 'admin' | 'member' | 'guest') {
return { role, permissions: getPermissions(role) };
}
デザインパターンの使用
使用原則
- 必要时才用:解决实际问题,不为炫技 (必要なときにのみ使用する:実際の問題を解決するため、技術を誇示するためではない)
- 说明理由:为什么选择这个模式 (理由を説明する:なぜこのパターンを選択したのか)
- 保持一致:相同问题用相同模式 (一貫性を保つ:同じ問題には同じパターンを使用する)
推薦シーン
| 场景 (シーン) | 推荐模式 (推奨パターン) | 使用条件 (使用条件) |
|---|---|---|
| 对象创建 (オブジェクトの作成) | Factory / Builder | 创建逻辑复杂、多种类型 (作成ロジックが複雑、複数のタイプ) |
| 行为扩展 (動作の拡張) | Strategy / Template | 算法可替换、流程步骤可变 (アルゴリズムを置き換え可能、プロセスステップが可変) |
| 结构适配 (構造の適合) | Facade / Adapter | 简化接口、适配第三方 (インターフェースの簡素化、サードパーティの適合) |
| 状态管理 (状態管理) | State / Observer | 状态驱动、事件通知 (状態駆動、イベント通知) |
Part 2: リファクタリング指導
リファクタリングトリガー条件
コードに以下の Code Smells が見られる場合は、リファクタリングを検討してください。
必須リファクタリング
| 问题 (問題) | 指标 (指標) | 重构方向 (リファクタリング方向) |
|---|---|---|
| 函数过长 (関数が長すぎる) | > 50 行 | 提取函数 (関数を抽出する) |
| 参数过多 (引数が多すぎる) | > 5 个 | 参数对象 (引数オブジェクト) |
| 嵌套过深 (ネストが深すぎる) | > 3 层 | 早返回、提取函数 (早期リターン、関数を抽出する) |
| 重复代码 (重複コード) | 3+ 处 | 提取公共逻辑 (共通ロジックを抽出する) |
| 上帝类 (神クラス) | > 500 行 | 拆分职责 (責任を分割する) |
提案リファクタリング
| 问题 (問題) | 描述 (説明) | 重构方向 (リファクタリング方向) |
|---|---|---|
| 特性依恋 (フィーチャーエンヴィー) | 频繁访问其他类数据 (他のクラスのデータに頻繁にアクセスする) | 移动方法 (メソッドを移動する) |
| 数据泥团 (データクラスター) | 多个参数总是一起出现 (複数の引数が常に一緒に現れる) | 提取类 (クラスを抽出する) |
| 霰弹式修改 (ショットガン手術) | 一个改动影响多处 (1 つの変更が複数の場所に影響を与える) | 集中逻辑 (ロジックを集中させる) |
| 平行继承 (並行継承) | 每次加子类要加配套类 (サブクラスを追加するたびに、対応するクラスを追加する必要がある) | 合并层次 (階層をマージする) |
リファクタリングフロー
1. 确保测试覆盖 (テストカバレッジを確保する)
│
├── 有测试 → 继续 (テストがある → 続行)
└── 无测试 → 先补充测试 (テストがない → まずテストを追加する)
│
▼
2. 小步重构 (小さなステップでリファクタリングする)
│
├── 每次只改一件事 (毎回 1 つのことだけを変更する)
├── 每步都能运行 (すべてのステップが実行可能)
└── 每步都运行测试 (すべてのステップでテストを実行する)
│
▼
3. 验证行为不变 (動作が変わらないことを検証する)
│
├── 测试全部通过 (すべてのテストに合格する)
└── 手动验证关键路径 (手動でクリティカルパスを検証する)
│
▼
4. 提交代码 (コードをコミットする)
リファクタリング制約
安全制約
- [ ] 重构前必须有测试覆盖 (リファクタリング前にテストカバレッジが必須)
- [ ] 每步重构后运行测试 (すべてのリファクタリングステップの後にテストを実行する)
- [ ] 不在重构中添加新功能 (リファクタリング中に新しい機能を追加しない)
- [ ] 不在添加功能时重构 (機能を追加するときにリファクタリングしない)
範囲制約
- [ ] 单次重构只改一类问题 (1 回のリファクタリングで 1 種類の問題のみを変更する)
- [ ] 单次 PR 只包含一个重构主题 (1 回の PR には 1 つのリファクタリングテーマのみを含める)
- [ ] 大范围重构需要分阶段进行 (大規模なリファクタリングは段階的に行う必要がある)
リスク評価
| 风险等级 (リスクレベル) | 条件 (条件) | 策略 (戦略) |
|---|---|---|
| 低 | 有完善测试、改动局部 (完全なテストがある、変更が局所的) | 直接重构 (直接リファクタリングする) |
| 中 | 部分测试、影响多处 (部分的なテスト、複数の場所に影響を与える) | 先补测试 (まずテストを補完する) |
| 高 | 无测试、核心逻辑 (テストがない、コアロジック) | 逐步添加测试后重构 (段階的にテストを追加した後、リファクタリングする) |
Part 3: Code Review チェックリスト
Review 前置検査
- [ ] PR 描述清晰说明改动内容和原因 (PR の説明で変更内容と理由を明確に説明する)
- [ ] CI 通过(测试、lint、build)(CI が合格 (テスト、lint、build))
- [ ] 改动范围合理(单一主题)(変更範囲が合理的 (単一テーマ))
コード品質検査
MTE 原則
-
[ ] M - 可维护性 (M - 保守性)
- [ ] 函数职责单一 (関数の責任が単一)
- [ ] 命名清晰准确 (命名が明確かつ正確)
- [ ] 依赖关系清晰 (依存関係が明確)
-
[ ] T - 可测试性 (T - テスト容易性)
- [ ] 核心逻辑有测试 (コアロジックにテストがある)
- [ ] 依赖可以 Mock (依存関係を Mock 可能)
- [ ] 边界条件覆盖 (境界条件を網羅)
-
[ ] E - 可扩展性 (E - 拡張性)
- [ ] 预留合理扩展点 (合理的な拡張ポイントの予約)
- [ ] 不为假设需求设计 (仮定の要件のために設計しない)
- [ ] 配置合理 (構成が合理的)
コード規範
- [ ] 函数长度 < 50 行 (関数長 < 50 行)
- [ ] 参数数量 < 5 个 (引数の数 < 5 個)
- [ ] 嵌套深度 < 3 层 (ネスト深度 < 3 層)
- [ ] 无重复代码 (重複コードなし)
- [ ] 无硬编码敏感信息 (ハードコードされた機密情報なし)
エラー処理
- [ ] 边界条件处理 (境界条件の処理)
- [ ] 错误信息有意义 (エラーメッセージが意味を持つ)
- [ ] 不吞掉异常 (例外を握りつぶさない)
安全検査
- [ ] 无 SQL 注入风险 (SQL インジェクションのリスクなし)
- [ ] 无 XSS 风险 (XSS のリスクなし)
- [ ] 敏感数据加密/脱敏 (機密データの暗号化/マスキング)
- [ ] 权限控制正确 (権限制御が正しい)
Review フィードバックレベル
| 级别 (レベル) | 标记 (マーク) | 含义 (意味) | 要求 (要件) |
|---|---|---|---|
| 阻塞 (ブロッキング) | [Blocker] |
必须修复才能合并 (マージするには修正が必須) | 安全问题、逻辑错误 (セキュリティの問題、ロジックエラー) |
| 建议 (提案) | [Suggestion] |
建议修改但不阻塞 (修正を提案するが、ブロッキングしない) | 代码风格、小优化 (コードスタイル、小さな最適化) |
| 疑问 (疑問) | [Question] |
不确定是否需要修改 (修正が必要かどうか不明) | 需要讨论、寻求共识 (議論が必要、合意を求める) |
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Code Quality
编码和重构时的质量约束,确保代码可维护、可测试、适度扩展。
Language
- Accept questions in both Chinese and English
- Always respond in Chinese
Trigger Conditions
- 用户正在编写新代码
- 用户需要重构现有代码
- 用户需要 Code Review 检查清单
- 用户提到 MTE 原则、代码质量、避免过度设计
核心原则:MTE
所有代码必须遵循 MTE 原则:
| 原则 | 说明 | 检查点 |
|---|---|---|
| Maintainability | 可维护性 | 职责单一、依赖清晰、易于理解 |
| Testability | 可测试性 | 核心逻辑可单元测试、依赖可 Mock |
| Extensibility | 可扩展性 | 预留合理扩展点、接口抽象 |
Part 1: 编码约束
模块设计
单一职责
✅ 正确:一个类/函数只做一件事
- UserService: 用户业务逻辑
- UserRepository: 用户数据访问
- UserValidator: 用户数据校验
❌ 错误:一个类做多件事
- UserManager: 业务逻辑 + 数据访问 + 校验 + 发送邮件
依赖方向
┌─────────────────────────────────────┐
│ Interface Layer │ ← 薄层,无业务逻辑
├─────────────────────────────────────┤
│ Service Layer │ ← 业务逻辑(核心)
├─────────────────────────────────────┤
│ Domain Layer │ ← 领域模型
├─────────────────────────────────────┤
│ Infrastructure Layer │ ← 可替换
└─────────────────────────────────────┘
依赖规则:
- 外层依赖内层 ✅
- 内层依赖外层 ❌
- 依赖接口,不依赖实现 ✅
函数设计
函数长度
- 建议:单个函数不超过 30 行
- 最大:不超过 50 行
- 超过时:拆分为多个小函数
参数数量
- 建议:不超过 3 个参数
- 最大:不超过 5 个参数
- 超过时:使用参数对象
// ❌ 参数过多
function createUser(name, email, age, role, department, manager) {}
// ✅ 使用参数对象
function createUser(params: CreateUserParams) {}
嵌套深度
- 建议:不超过 2 层嵌套
- 最大:不超过 3 层嵌套
- 超过时:提取函数或使用早返回
// ❌ 嵌套过深
if (a) {
if (b) {
if (c) {
// ...
}
}
}
// ✅ 早返回
if (!a) return;
if (!b) return;
if (!c) return;
// ...
可测试性设计
详细的测试编写规范请参考
/testing-guide
核心原则
可测试代码的三个要素:
1. 依赖可注入 - 外部依赖通过参数传入
2. 纯函数优先 - 业务逻辑无副作用
3. 边界分离 - 业务逻辑与 IO 分离
依赖注入
// ❌ 硬编码依赖
class UserService {
private db = new Database();
private mailer = new EmailService();
}
// ✅ 依赖注入
class UserService {
constructor(
private db: IDatabase,
private mailer: IEmailService
) {}
}
纯函数优先
// ❌ 有副作用,难测试
function calculateTotal(items) {
const total = items.reduce((sum, item) => sum + item.price, 0);
console.log(`Total: ${total}`); // 副作用
analytics.track('calculate'); // 副作用
return total;
}
// ✅ 纯函数,易测试
function calculateTotal(items) {
return items.reduce((sum, item) => sum + item.price, 0);
}
边界分离
// ❌ 业务逻辑混合 IO
async function processOrder(orderId) {
const order = await db.findOrder(orderId); // IO
if (order.total > 1000) { // 业务逻辑
order.discount = 0.1;
}
await db.save(order); // IO
await email.send(order.user, 'confirmed'); // IO
}
// ✅ 分离业务逻辑
function applyDiscount(order) { // 纯业务逻辑,可测试
if (order.total > 1000) {
return { ...order, discount: 0.1 };
}
return order;
}
async function processOrder(orderId) {
const order = await db.findOrder(orderId);
const updated = applyDiscount(order); // 调用纯函数
await db.save(updated);
await email.send(order.user, 'confirmed');
}
编写测试时:参考
/testing-guide获取断言质量、Mock 策略、变异测试等详细指导
避免过度设计
YAGNI 原则
You Aren't Gonna Need It - 你不会需要它
// ❌ 过度设计:为假设需求添加配置
const config = {
maxRetries: 3,
retryDelay: 1000,
enableCache: true,
cacheExpiry: 3600,
enableRateLimit: false, // 从未使用
rateLimitWindow: 60000, // 从未使用
enableMetrics: false, // 从未使用
metricsEndpoint: '', // 从未使用
};
// ✅ 只添加当前需要的配置
const config = {
maxRetries: 3,
retryDelay: 1000,
cacheExpiry: 3600,
};
抽象时机
❌ 过早抽象:
- 只有一个实现就创建接口
- 只有一处使用就提取函数
- 只有两个相似场景就创建基类
✅ 适时抽象(Rule of Three):
- 3 个以上实现时考虑接口
- 3 处以上重复时考虑提取
- 3 个以上相似场景时考虑基类
简单方案优先
// ❌ 过度设计:简单场景用复杂模式
class UserFactory {
createAdmin() { return new AdminUser(); }
createMember() { return new MemberUser(); }
createGuest() { return new GuestUser(); }
}
// ✅ 简单场景用简单方案
function createUser(role: 'admin' | 'member' | 'guest') {
return { role, permissions: getPermissions(role) };
}
设计模式使用
使用原则
- 必要时才用:解决实际问题,不为炫技
- 说明理由:为什么选择这个模式
- 保持一致:相同问题用相同模式
推荐场景
| 场景 | 推荐模式 | 使用条件 |
|---|---|---|
| 对象创建 | Factory / Builder | 创建逻辑复杂、多种类型 |
| 行为扩展 | Strategy / Template | 算法可替换、流程步骤可变 |
| 结构适配 | Facade / Adapter | 简化接口、适配第三方 |
| 状态管理 | State / Observer | 状态驱动、事件通知 |
Part 2: 重构指导
重构触发条件
当代码出现以下 Code Smells 时考虑重构:
必须重构
| 问题 | 指标 | 重构方向 |
|---|---|---|
| 函数过长 | > 50 行 | 提取函数 |
| 参数过多 | > 5 个 | 参数对象 |
| 嵌套过深 | > 3 层 | 早返回、提取函数 |
| 重复代码 | 3+ 处 | 提取公共逻辑 |
| 上帝类 | > 500 行 | 拆分职责 |
建议重构
| 问题 | 描述 | 重构方向 |
|---|---|---|
| 特性依恋 | 频繁访问其他类数据 | 移动方法 |
| 数据泥团 | 多个参数总是一起出现 | 提取类 |
| 霰弹式修改 | 一个改动影响多处 | 集中逻辑 |
| 平行继承 | 每次加子类要加配套类 | 合并层次 |
重构流程
1. 确保测试覆盖
│
├── 有测试 → 继续
└── 无测试 → 先补充测试
│
▼
2. 小步重构
│
├── 每次只改一件事
├── 每步都能运行
└── 每步都运行测试
│
▼
3. 验证行为不变
│
├── 测试全部通过
└── 手动验证关键路径
│
▼
4. 提交代码
重构约束
安全约束
- [ ] 重构前必须有测试覆盖
- [ ] 每步重构后运行测试
- [ ] 不在重构中添加新功能
- [ ] 不在添加功能时重构
范围约束
- [ ] 单次重构只改一类问题
- [ ] 单次 PR 只包含一个重构主题
- [ ] 大范围重构需要分阶段进行
风险评估
| 风险等级 | 条件 | 策略 |
|---|---|---|
| 低 | 有完善测试、改动局部 | 直接重构 |
| 中 | 部分测试、影响多处 | 先补测试 |
| 高 | 无测试、核心逻辑 | 逐步添加测试后重构 |
Part 3: Code Review 清单
Review 前置检查
- [ ] PR 描述清晰说明改动内容和原因
- [ ] CI 通过(测试、lint、build)
- [ ] 改动范围合理(单一主题)
代码质量检查
MTE 原则
-
[ ] M - 可维护性
- [ ] 函数职责单一
- [ ] 命名清晰准确
- [ ] 依赖关系清晰
-
[ ] T - 可测试性
- [ ] 核心逻辑有测试
- [ ] 依赖可以 Mock
- [ ] 边界条件覆盖
-
[ ] E - 可扩展性
- [ ] 预留合理扩展点
- [ ] 不为假设需求设计
- [ ] 配置合理
代码规范
- [ ] 函数长度 < 50 行
- [ ] 参数数量 < 5 个
- [ ] 嵌套深度 < 3 层
- [ ] 无重复代码
- [ ] 无硬编码敏感信息
错误处理
- [ ] 边界条件处理
- [ ] 错误信息有意义
- [ ] 不吞掉异常
安全检查
- [ ] 无 SQL 注入风险
- [ ] 无 XSS 风险
- [ ] 敏感数据加密/脱敏
- [ ] 权限控制正确
Review 反馈分级
| 级别 | 标记 | 含义 | 要求 |
|---|---|---|---|
| 阻塞 | [Blocker] |
必须修复才能合并 | 安全问题、逻辑错误 |
| 建议 | [Suggestion] |
建议修改但不阻塞 | 代码风格、小优化 |
| 疑问 | [Question] |
需要作者解释 | 不理解的设计决策 |
| 赞 | [Nice] |
写得好的地方 | 鼓励好的实践 |
Part 4: 应用场景
场景 1: 编写新代码
当用户编写新代码时,自动应用以下约束:
- 模块设计:检查职责是否单一
- 函数设计:检查长度、参数、嵌套
- 可测试性:检查依赖是否可注入
- 避免过度设计:检查是否 YAGNI
场景 2: 重构现有代码
当用户要求重构时:
- 评估风险:检查测试覆盖
- 识别问题:找出 Code Smells
- 制定计划:确定重构步骤
- 小步执行:每步运行测试
场景 3: Code Review
当用户要求审查代码时:
- 使用清单:逐项检查
- 分级反馈:区分阻塞和建议
- 说明理由:解释为什么这样建议
Constraints
编码约束
- [ ] 函数不超过 50 行
- [ ] 参数不超过 5 个
- [ ] 嵌套不超过 3 层
- [ ] 依赖通过注入,不硬编码
- [ ] 核心逻辑可单元测试
设计约束
- [ ] 每个模块职责单一
- [ ] 依赖方向:外层依赖内层
- [ ] 不为假设需求设计
- [ ] 3 个以上相似场景才抽象
重构约束
- [ ] 重构前必须有测试
- [ ] 每步重构后运行测试
- [ ] 不在重构中添加功能
Review 约束
- [ ] 区分阻塞和建议
- [ ] 反馈需要说明理由
- [ ] 安全问题必须阻塞