jpskill.com
🛠️ 開発・MCP コミュニティ

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本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
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
🪟 Windows (PowerShell)
$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. 1. 下の青いボタンを押して code-quality.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → code-quality フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

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: 编写新代码

当用户编写新代码时,自动应用以下约束:

  1. 模块设计:检查职责是否单一
  2. 函数设计:检查长度、参数、嵌套
  3. 可测试性:检查依赖是否可注入
  4. 避免过度设计:检查是否 YAGNI

场景 2: 重构现有代码

当用户要求重构时:

  1. 评估风险:检查测试覆盖
  2. 识别问题:找出 Code Smells
  3. 制定计划:确定重构步骤
  4. 小步执行:每步运行测试

场景 3: Code Review

当用户要求审查代码时:

  1. 使用清单:逐项检查
  2. 分级反馈:区分阻塞和建议
  3. 说明理由:解释为什么这样建议

Constraints

编码约束

  • [ ] 函数不超过 50 行
  • [ ] 参数不超过 5 个
  • [ ] 嵌套不超过 3 层
  • [ ] 依赖通过注入,不硬编码
  • [ ] 核心逻辑可单元测试

设计约束

  • [ ] 每个模块职责单一
  • [ ] 依赖方向:外层依赖内层
  • [ ] 不为假设需求设计
  • [ ] 3 个以上相似场景才抽象

重构约束

  • [ ] 重构前必须有测试
  • [ ] 每步重构后运行测试
  • [ ] 不在重构中添加功能

Review 约束

  • [ ] 区分阻塞和建议
  • [ ] 反馈需要说明理由
  • [ ] 安全问题必须阻塞