mcpField
T
tdd-workflows-tdd-refactor

tdd-workflows-tdd-refactor

github.com/sickn33テスト・品質48.7k254 回インストール今日更新
リポジトリ

tdd-workflows-tdd-refactor について

テストで動作を保護しながらコードを改善する、TDDベースのリファクタリングガイドです。評価、段階的な変更、検証、失敗時の復旧を扱い、参照先のプレイブックとエージェントは同梱されないと明記しています。

主な機能

  1. 01テスト基準とコードの評価
  2. 02コードスメルと設計の指針
  3. 03段階的なリファクタリング手順
  4. 04テストと性能の検証
  5. 05失敗時の復旧ガイド

活用シーン

  1. 01動作を保つリファクタリングの計画
  2. 02コードスメルと設計判断の確認
  3. 03テストによる変更の検証
  4. 04リファクタリング失敗への対処

インストール

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

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill tdd-workflows-tdd-refactor

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

詳細

このスキルを使用する場合

  • TDD ワークフロー、TDD リファクタリングのタスクやワークフローに取り組む場合
  • TDD ワークフロー、TDD リファクタリングに関するガイダンス、ベストプラクティス、チェックリストが必要な場合

このスキルを使用しない場合

  • タスクが TDD ワークフロー、TDD リファクタリングに関係しない場合
  • この範囲外の別のドメインやツールが必要な場合

手順

  • 目標、制約、必要な入力を明確にします。
  • 関連するベストプラクティスを適用し、成果を検証します。
  • 実行可能な手順と検証方法を提示します。
  • 参照先の実装プレイブックと tdd-orchestrator エージェントは同梱されていません。利用可能なリポジトリツールを使用し、実際に実行していない限り、名前の付いたエージェントやモデルが実行されたと主張しないでください。

包括的なテストによる安全網を活用して、自信を持ってコードをリファクタリングします。

現在の指示で許可されている場合に限り、選択された利用可能なモデルを使用して委任します。テストスイートが成功しても、カバレッジが不完全であれば、動作が変わっていないことの証明にはなりません。

使用方法

Task ツールを使用し、subagent_type="tdd-orchestrator" を指定して、安全なリファクタリングを実行します。

プロンプト:「すべてのテストが成功する状態を保ちながら、このコードをリファクタリングしてください:$ARGUMENTS。TDD のリファクタリングフェーズを適用してください。

基本プロセス

1. 事前評価

  • テストを実行して、成功状態のベースラインを確立する
  • コードの不吉な匂いとテストカバレッジを分析する
  • 現在のパフォーマンス指標を記録する
  • 段階的なリファクタリング計画を作成する

2. コードの不吉な匂いの検出

  • 重複コード → メソッド/クラスを抽出する
  • 長いメソッド → 焦点を絞った関数に分解する
  • 大きなクラス → 責務を分割する
  • 長いパラメーターリスト → パラメーターオブジェクトを導入する
  • フィーチャーエンヴィ → メソッドを適切なクラスに移動する
  • プリミティブ執着 → 値オブジェクトを導入する
  • switch 文 → ポリモーフィズムに置き換える
  • デッドコード → 削除する

3. デザインパターン

  • 生成パターン(Factory、Builder、Singleton)を適用する
  • 構造パターン(Adapter、Facade、Decorator)を適用する
  • 振る舞いパターン(Strategy、Observer、Command)を適用する
  • ドメインパターン(Repository、Service、Value Objects)を適用する
  • 明確な価値がある場合にのみパターンを使用する

4. SOLID 原則

  • 単一責任の原則:変更理由を 1 つにする
  • オープン・クローズドの原則:拡張に開き、変更に閉じる
  • リスコフの置換原則:サブタイプを置換可能にする
  • インターフェース分離の原則:小さく、焦点を絞ったインターフェースにする
  • 依存性逆転の原則:抽象に依存する

5. リファクタリング手法

  • メソッド/変数/インターフェースを抽出する
  • 不要な間接化をインライン化する
  • 明確になるように名前を変更する
  • メソッド/フィールドを適切なクラスに移動する
  • マジックナンバーを定数に置き換える
  • フィールドをカプセル化する
  • 条件分岐をポリモーフィズムに置き換える
  • Null Object を導入する

6. パフォーマンスの最適化

  • プロファイリングを行い、ボトルネックを特定する
  • アルゴリズムとデータ構造を最適化する
  • 有益な場合はキャッシュを実装する
  • データベースクエリを削減する(N+1 問題の解消)
  • 遅延読み込みとページネーションを導入する
  • 必ず変更前後を測定する

7. 段階的な手順

  • 小さく、独立した変更を行う
  • 変更のたびにテストを実行する
  • リファクタリングに成功するたびにコミットする
  • リファクタリングと動作変更を分離する
  • 必要に応じて足場を用意する

8. アーキテクチャの進化

  • レイヤーの分離と依存関係の管理
  • モジュール境界とインターフェースの定義
  • 疎結合のためのイベント駆動パターン
  • データベースアクセスパターンの最適化

9. 安全性の検証

  • 変更のたびにテストスイート全体を実行する
  • パフォーマンスのリグレッションテストを実施する
  • テストの有効性を確認するため、ミューテーションテストを実施する
  • 大きな変更に備えてロールバック計画を用意する

10. 高度なパターン

  • Strangler Fig:レガシーシステムを段階的に置き換える
  • Branch by Abstraction:大規模な変更を行う
  • Parallel Change:拡張・縮小パターン
  • Mikado Method:依存関係グラフをたどる

出力要件

  • 改善を適用したリファクタリング済みコード
  • テスト結果(すべて成功)
  • 変更前後の指標比較
  • 適用したリファクタリング手法の一覧
  • パフォーマンス改善の測定結果
  • 残存する技術的負債の評価

安全性チェックリスト

コミットする前に:

  • ✓ すべてのテストが成功している(成功率 100%)
  • ✓ 機能のリグレッションがない
  • ✓ パフォーマンス指標に問題がない
  • ✓ コードカバレッジが維持または向上している
  • ✓ ドキュメントが更新されている

復旧プロトコル

テストが失敗した場合:

  • 失敗内容を調査し、必要に応じて最後に行った独立した変更だけを元に戻します。無関係なユーザーの編集は保持します
  • 破壊的なリファクタリングを特定します
  • より小さな段階に分けて変更を適用します
  • 安全に試行するため、バージョン管理を使用します

例:メソッド抽出パターン

変更前:

class OrderProcessor {
  processOrder(order: Order): ProcessResult {
    // Validation
    if (!order.customerId || order.items.length === 0) {
      return { success: false, error: "Invalid order" };
    }

    // Calculate totals
    let subtotal = 0;
    for (const item of order.items) {
      subtotal += item.price * item.quantity;
    }
    let total = subtotal + (subtotal * 0.08) + (subtotal > 100 ? 0 : 15);

    // Process payment...
    // Update inventory...
    // Send confirmation...
  }
}

変更後(挙動を維持する抽出ではなく、オーケストレーションの変更例):

この例では、非同期の決済、在庫、通知の各依存関係を導入しています。純粋なリファクタリングと呼ばないでください。採用する前に、冪等性、予約と課金の順序、障害発生時の補償処理を明確にしてください。

class OrderProcessor {
  async processOrder(order: Order): Promise<ProcessResult> {
    const validation = this.validateOrder(order);
    if (!validation.isValid) return ProcessResult.failure(validation.error);

    const orderTotal = OrderTotal.calculate(order);
    const inventoryCheck = await this.inventoryService.checkAvailability(order.items);
    if (!inventoryCheck.available) return ProcessResult.failure(inventoryCheck.reason);

    await this.paymentService.processPayment(order.paymentMethod, orderTotal.total);
    await this.inventoryService.reserveItems(order.items);
    await this.notificationService.sendOrderConfirmation(order, orderTotal);

    return ProcessResult.success(order.id, orderTotal.total);
  }

  private validateOrder(order: Order): ValidationResult {
    if (!order.customerId) return ValidationResult.invalid("Customer ID required");
    if (order.items.length === 0) return ValidationResult.invalid("Order must contain items");
    return ValidationResult.valid();
  }
}

適用済み: メソッド抽出、値オブジェクト、依存性注入、非同期パターン

リファクタリングするコード:$ARGUMENTS"

制限事項

  • タスクが上記の対象範囲に明確に該当する場合にのみ、このスキルを使用してください。
  • 出力を、環境固有の検証、テスト、専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中止して確認を求めてください。

コメント