tdd-workflows-tdd-refactor について
テストで動作を保護しながらコードを改善する、TDDベースのリファクタリングガイドです。評価、段階的な変更、検証、失敗時の復旧を扱い、参照先のプレイブックとエージェントは同梱されないと明記しています。
主な機能
- 01テスト基準とコードの評価
- 02コードスメルと設計の指針
- 03段階的なリファクタリング手順
- 04テストと性能の検証
- 05失敗時の復旧ガイド
活用シーン
- 01動作を保つリファクタリングの計画
- 02コードスメルと設計判断の確認
- 03テストによる変更の検証
- 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"
制限事項
- タスクが上記の対象範囲に明確に該当する場合にのみ、このスキルを使用してください。
- 出力を、環境固有の検証、テスト、専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中止して確認を求めてください。