mcpField
Q
qe-refactoring-patterns

qe-refactoring-patterns

github.com/proffesor-for-testing開発51984 回インストール今日更新
リポジトリ

qe-refactoring-patterns について

開発者向けのリファクタリングパターンをまとめたスキルです。テストで確認しながら小さく変更し、動作を変えずにコード構造を改善する方法を示します。

主な機能

  1. 01コードの問題と手法を対応付け
  2. 02リファクタリング前のテストを重視
  3. 03小さな変更と検証を案内
  4. 04段階的なパターンを提示

活用シーン

  1. 01長いメソッドや大きなクラスの分割
  2. 02重複コードの解消
  3. 03複雑な条件やネストしたループの簡素化
  4. 04構造変更時の動作維持

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill qe-refactoring-patterns

インストール後、Claude Code で/qe-refactoring-patternsを入力して読み込まれたか確認します。

詳細

リファクタリングのパターン

<default_to_action> リファクタリングするときは、次の手順に従います。

  1. テストが通ることを確認します(テストなしでリファクタリングしないでください)
  2. 小さな変更を行います(リファクタリングは一度に1つずつ行います)
  3. テストを実行します(常に成功する状態を保ちます)
  4. コミットします(進捗を保存します)
  5. 繰り返します

安全なリファクタリングサイクル:

npm test               # Green ✅
# Make ONE small change
npm test               # Still green ✅
git commit -m "refactor: extract calculateTotal"
# Repeat

コードの臭い → リファクタリング:

臭いリファクタリング
長すぎるメソッド(20行超)メソッドの抽出
大きすぎるクラスクラスの抽出
長すぎるパラメーターリスト(3個超)パラメーターオブジェクトの導入
重複したコードメソッド/クラスの抽出
複雑な条件分岐条件分岐の分解
マジックナンバー名前付き定数
入れ子になったループループをパイプラインに置き換え

リファクタリングをしてはいけない状況:

  • テストがない場合(先にテストを書いてください)
  • 締め切りが明日の場合
  • 理解していないコード
  • 動作していて、今後変更する予定のないコード </default_to_action>

クイックリファレンスカード

よく使うリファクタリング
パターン変更前変更後
メソッドの抽出50行の関数5つの小さな関数
クラスの抽出5つの役割を担うクラス単一の役割を担う5つのクラス
パラメーターオブジェクトfn(a,b,c,d,e,f)fn(options)
条件分岐の置き換えif (type === 'a') {...}ポリモーフィズム
パイプライン入れ子になったループ.filter().map().reduce()
3回ルール
  1. 1回目 → そのまま実装します
  2. 2回目 → ためらいながらも重複させます
  3. 3回目 → リファクタリングします

主なパターン

メソッドの抽出
// Before: Long method
function processOrder(order) {
  // 50 lines of validation, calculation, saving, emailing...
}

// After: Clear responsibilities
function processOrder(order) {
  validateOrder(order);
  const pricing = calculatePricing(order);
  const saved = saveOrder(order, pricing);
  sendConfirmationEmail(saved);
  return saved;
}
ループをパイプラインに置き換え
// Before
let results = [];
for (let item of items) {
  if (item.inStock) {
    results.push(item.name.toUpperCase());
  }
}

// After
const results = items
  .filter(item => item.inStock)
  .map(item => item.name.toUpperCase());
条件分岐の分解
// Before
if (order.total > 1000 && customer.isPremium && allInStock(order)) {
  return 'FREE_SHIPPING';
}

// After
function isEligibleForFreeShipping(order, customer) {
  return isLargeOrder(order) &&
         isPremiumCustomer(customer) &&
         allInStock(order);
}

リファクタリングのアンチパターン

❌ アンチパターン問題✅ より良い方法
テストなし安全網がない先にテストを書く
一括変更すべてを書き直す小さく段階的に進める
完璧を目指す終わりのない調整十分な状態で次に進む
早すぎる抽象化まだパターンが明確でない3回目までは待つ
機能開発中に行う変更が混在するコミットを分ける

エージェントとの連携

// Detect code smells
const smells = await Task("Detect Code Smells", {
  source: 'src/services/',
  patterns: ['long-method', 'large-class', 'duplicate-code']
}, "qe-quality-analyzer");

// Safe refactoring with test verification
await Task("Verify Refactoring", {
  beforeCommit: 'abc123',
  afterCommit: 'def456',
  expectSameBehavior: true
}, "qe-test-executor");

エージェント連携のヒント

メモリー名前空間
aqe/refactoring/
├── smells/*          - Detected code smells
├── suggestions/*     - Refactoring recommendations
├── verifications/*   - Behavior preservation checks
└── history/*         - Refactoring log
フリートの連携
const refactoringFleet = await FleetManager.coordinate({
  strategy: 'refactoring',
  agents: [
    'qe-quality-analyzer',   // Identify targets
    'qe-test-generator',     // Add safety tests
    'qe-test-executor',      // Verify behavior
    'qe-test-refactorer'     // TDD refactor phase
  ],
  topology: 'sequential'
});

関連スキル


覚えておくこと

リファクタリングではないもの:

  • 機能の追加
  • バグの修正
  • パフォーマンスの最適化
  • 最初から書き直すこと

リファクタリングとは:

  • 構造を改善すること
  • コードを読みやすくすること
  • 複雑さを減らすこと
  • 重複を取り除くこと
  • 動作を変えないこと

必ずテストを用意し、必ず小さな手順で進め、必ずテストが成功する状態を保ってください。

コメント