| name | .claude/skills/code-smell-detection/SKILL.md |
| description | コードスメル(悪臭)とアーキテクチャアンチパターンの検出を専門とするスキル。 📚 リソース参照: このスキルには以下のリソースが含まれています。 必要に応じて該当するリソースを参照してください: - `.claude/skills/code-smell-detection/resources/architecture-antipatterns.md`: アーキテクチャ・アンチパターン - `.claude/skills/code-smell-detection/resources/class-smells.md`: クラス関連のコードスメル - `.claude/skills/code-smell-detection/resources/method-smells.md`: メソッド関連のコードスメル - `.claude/skills/code-smell-detection/templates/code-smell-report.md`: コードスメル検出レポート - `.claude/skills/code-smell-detection/scripts/detect-code-smells.mjs`: コードスメル検出スクリプト 専門分野: - クラススメル: God Object、Feature Envy、Data Class - メソッドスメル: Long Method、Long Parameter List、Switch Statements - 構造スメル: Shotgun Surgery、Parallel Inheritance Hierarchies - アーキテクチャアンチパターン: Big Ball of Mud、Golden Hammer 使用タイミング: - コードレビューで品質問題を検出する時 - リファクタリング対象を特定する時 - 技術的負債を可視化する時 - 保守性低下の原因を分析する時 Use proactively when reviewing code quality, identifying refactoring targets, or analyzing technical debt in the codebase. |
| version | 1.0.0 |
Code Smell Detection
概要
このスキルは、Martin Fowlerが『Refactoring』で体系化したコードスメルの知識に基づき、 保守性を低下させる構造的問題を検出し、改善方針を提案します。
核心概念: コードスメルは「コードに深刻な問題が存在する可能性を示す表面的な兆候」である。 スメル自体はバグではないが、放置すると技術的負債となり、将来の変更を困難にする。
主要な価値:
- 保守性低下の早期検出
- リファクタリング優先順位の明確化
- 技術的負債の可視化
- コード品質の継続的改善
対象ユーザー:
- アーキテクチャレビューを行う.claude/agents/arch-police.md
- コード品質を管理する開発者
- リファクタリングを計画するチーム
リソース構造
code-smell-detection/
├── SKILL.md # 本ファイル
├── resources/
│ ├── class-smells.md # クラスレベルのスメル
│ ├── method-smells.md # メソッドレベルのスメル
│ ├── structural-smells.md # 構造的スメル
│ └── architecture-antipatterns.md # アーキテクチャアンチパターン
├── scripts/
│ └── detect-code-smells.mjs # スメル検出スクリプト
└── templates/
└── smell-report.md # 検出レポートテンプレート
コマンドリファレンス
リソース読み取り
# クラスレベルのスメル
cat .claude/skills/code-smell-detection/resources/class-smells.md
# メソッドレベルのスメル
cat .claude/skills/code-smell-detection/resources/method-smells.md
# 構造的スメル
cat .claude/skills/code-smell-detection/resources/structural-smells.md
# アーキテクチャアンチパターン
cat .claude/skills/code-smell-detection/resources/architecture-antipatterns.md
スクリプト実行
# スメル検出スクリプト
node .claude/skills/code-smell-detection/scripts/detect-code-smells.mjs src/
# 特定カテゴリのスメル検出
node .claude/skills/code-smell-detection/scripts/detect-code-smells.mjs src/ --category=class
コードスメルカタログ
クラスレベルのスメル
1. God Class(神クラス)
定義: 多すぎる責務を持つ巨大なクラス
検出基準:
- 行数 > 500行
- メソッド数 > 20
- フィールド数 > 15
- 複数の異なる関心事を扱う
検出方法:
# 大きなクラスを検出
wc -l src/**/*.ts | sort -n | tail -20
# メソッド数が多いクラス
grep -c "^\s*(public|private|protected)" src/**/*.ts
兆候:
- クラス名が抽象的(Manager、Handler、Service)
- 関連のないメソッドが同居
- 変更時に複数の理由がある
是正方針:
- 責務を列挙
- 関連するメソッドをグループ化
- グループごとにクラスを抽出
- ファサードで統合(必要に応じて)
2. Feature Envy(機能の横恋慕)
定義: あるクラスのメソッドが、他クラスのデータに過度に依存
検出基準:
- 他クラスのgetterを3回以上呼び出し
- 自クラスのデータよりも他クラスのデータを多く使用
- 計算ロジックが依存データと異なるクラスに存在
検出方法:
# getter呼び出しの多いメソッドを検出
grep -n "\.get[A-Z]\|\.is[A-Z]" src/**/*.ts
兆候:
- メソッドが他クラスのメソッドを多数呼び出す
- データの取得と計算が分離している
- 「このメソッドは本当にこのクラスに属すべきか?」
是正方針:
- 依存先のクラスにメソッドを移動
- 必要なデータとロジックを同じ場所に
- Tell, Don't Ask原則の適用
3. Data Class(データクラス)
定義: getter/setterのみを持ち、振る舞いがないクラス
検出基準:
- publicフィールドまたはgetter/setterのみ
- ビジネスロジックが存在しない
- 他クラスがデータを取り出して処理
検出方法:
# getter/setterのみのクラスを検出
grep -l "get\|set" src/**/*.ts | xargs grep -L "function\|method"
兆候:
- クラスがgetter/setterのみ
- ロジックが別のクラスに存在
- DTOとしてのみ使用される
是正方針:
- 関連するロジックをデータクラスに移動
- カプセル化を強化
- 意図を明確にするメソッド名を使用
メソッドレベルのスメル
4. Long Method(長いメソッド)
定義: 行数が多すぎるメソッド
検出基準:
- 行数 > 30行
- 複数の抽象度レベルが混在
- コメントで「セクション」を区切っている
検出方法:
# 長いメソッドを検出(awkで行数カウント)
awk '/function|method/{start=NR} /^}$/{if(NR-start>30)print FILENAME":"start":"NR-start"lines"}' src/**/*.ts
兆候:
- スクロールが必要
- コメントでブロックを区切っている
- ローカル変数が多い
是正方針:
- Extract Methodでメソッドを分割
- 各メソッドに意図を明確にする名前
- 抽象度を統一
5. Long Parameter List(長いパラメータリスト)
定義: パラメータが多すぎるメソッド
検出基準:
- パラメータ数 > 4
- 同じパラメータの組み合わせが複数メソッドで登場
- パラメータの順序が覚えられない
検出方法:
# パラメータが多いメソッドを検出
grep -n "function.*,.*,.*,.*," src/**/*.ts
兆候:
- 呼び出し側でパラメータの順序を間違える
- 同じパラメータグループが繰り返し登場
- デフォルト値が多い
是正方針:
- パラメータオブジェクトの導入
- 関連パラメータをグループ化
- Builderパターンの検討
6. Switch Statements(switch文の乱用)
定義: 同じ条件によるswitch文が複数箇所に散在
検出基準:
- 同じ型による分岐が複数メソッドに存在
- 新しいケース追加時に複数箇所を修正
- ポリモーフィズムで置き換え可能
検出方法:
# switch文を検出
grep -rn "switch\s*(" src/
grep -rn "case\s\+[A-Z]" src/
兆候:
- 型による分岐が複数箇所
- 新しいケース追加時に「散弾銃手術」
- if-else連鎖が長い
是正方針:
- ポリモーフィズムの導入
- Strategyパターンの適用
- Factory + インターフェースで置き換え
構造的スメル
7. Shotgun Surgery(散弾銃手術)
定義: 1つの変更のために多くのクラスを修正する必要
検出基準:
- 小さな変更で多くのファイルを編集
- 関連する変更が分散している
- 変更漏れが発生しやすい
検出方法:
# Gitの変更履歴から検出
git log --name-only --oneline | head -100 | sort | uniq -c | sort -n
兆候:
- 1つの機能変更で5ファイル以上を編集
- 同様の変更を複数箇所で行う
- 変更漏れが頻発
是正方針:
- 関連するコードを1クラスに集約
- 変更理由ごとに責務を分離
- モジュールの凝集度を高める
8. Parallel Inheritance Hierarchies(並行継承階層)
定義: あるクラスのサブクラスを作ると、別の階層でも対応するサブクラスが必要
検出基準:
- 2つの継承階層が並行して存在
- 新しいサブクラス追加時に両方の階層を変更
- 類似した名前のサブクラスが対で存在
兆候:
- XxxとXxxFactoryが対で存在
- 新しい型追加時に2つのクラスを作成
- 継承階層が鏡像のように対応
是正方針:
- 一方の階層を他方に統合
- 合成による再構築
- ジェネリクスの活用
アーキテクチャアンチパターン
9. Big Ball of Mud(泥団子)
定義: 認識可能な構造がない、無秩序なシステム
検出基準:
- 明確なレイヤー構造がない
- 依存関係が網の目状
- 「どこでも何でもできる」状態
兆候:
- ディレクトリ構造が意味不明
- 循環依存が多数
- 新メンバーが理解に時間がかかる
是正方針:
- 段階的にレイヤーを導入
- 最も重要なモジュールから境界を明確化
- 長期的なリファクタリング計画
10. Golden Hammer(金のハンマー)
定義: 慣れたツールや技術をあらゆる問題に適用
検出基準:
- 同じパターンがあらゆる場所で使用
- 問題に適さない技術選択
- 「いつもの方法」への固執
兆候:
- すべてがシングルトン
- あらゆる場所でORMを使用
- 不適切なデザインパターンの適用
是正方針:
- 問題に適した解決策を検討
- チームの技術スキルを拡大
- 技術選択の理由を文書化
ワークフロー
Phase 1: 自動検出
目的: 定量的な基準でスメルを検出
ステップ:
- 静的解析ツールの実行
- メトリクス収集(行数、複雑度等)
- 閾値超過の特定
検出項目:
# 行数
wc -l src/**/*.ts
# 循環的複雑度
npx ts-complexity src/
# 依存関係
npx madge --circular src/
Phase 2: 手動レビュー
目的: 文脈を考慮したスメル評価
ステップ:
- 自動検出結果のレビュー
- 偽陽性の除外
- 追加スメルの特定
判断基準:
- 技術的負債として認識すべきか?
- 意図的な設計決定か?
- リファクタリングの費用対効果は?
Phase 3: 優先順位付け
目的: リファクタリング対象の優先順位決定
評価軸:
- 影響度: 変更頻度、依存モジュール数
- 深刻度: バグ発生リスク、保守コスト
- 修正コスト: 必要な工数、リスク
優先度マトリクス:
影響度
高 低
深刻度
高 [P1] [P2]
低 [P3] [P4]
Phase 4: レポート生成
目的: 検出結果の構造化と共有
レポート項目:
- エグゼクティブサマリー
- スメル一覧(カテゴリ別)
- 優先順位と是正方針
- 推奨アクション
ベストプラクティス
すべきこと
定期的な検出:
- CIに静的解析を組み込み
- スプリントごとにレビュー
段階的な改善:
- 新規コードでスメルを発生させない
- 既存スメルは計画的に解消
知識の共有:
- チームでスメルカタログを共有
- コードレビューで指摘
避けるべきこと
完璧主義:
- ❌ すべてのスメルを即座に修正
- ✅ 優先順位に基づく計画的改善
スメルの正当化:
- ❌ 「動いているから問題ない」
- ✅ 技術的負債として認識し管理
関連スキル
- .claude/skills/solid-principles/SKILL.md (
.claude/skills/solid-principles/SKILL.md): 原則違反の検出 - .claude/skills/clean-architecture-principles/SKILL.md (
.claude/skills/clean-architecture-principles/SKILL.md): 構造的問題 - .claude/skills/dependency-analysis/SKILL.md (
.claude/skills/dependency-analysis/SKILL.md): 依存関係の問題
メトリクス
スメル検出率
測定方法: (検出されたスメル数 / コードベースサイズ) × 1000
目標: スプリントごとに減少
技術的負債指数
計算方法: Σ(スメルの深刻度 × 影響度)
目標: 管理可能なレベルを維持
変更履歴
| バージョン | 日付 | 変更内容 |
|---|---|---|
| 1.0.0 | 2025-11-25 | 初版作成 - コードスメル検出の体系化 |
参考文献
- 『Refactoring』 Martin Fowler著
- Chapter 3: Bad Smells in Code
- 『Clean Code』 Robert C. Martin著
- Chapter 17: Smells and Heuristics