APM

>Agent Skill

@mattnigh/claude-skills-code-smell-detection-skill-md

skilldevelopment

コードスメル(悪臭)とアーキテクチャアンチパターンの検出を専門とするスキル。 📚 リソース参照: このスキルには以下のリソースが含まれています。 必要に応じて該当するリソースを参照してください: - `.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.

development
apm::install
$apm install @mattnigh/claude-skills-code-smell-detection-skill-md
apm::skill.md
---
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                         # 検出レポートテンプレート
```

## コマンドリファレンス

### リソース読み取り

```bash
# クラスレベルのスメル
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
```

### スクリプト実行

```bash
# スメル検出スクリプト
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
- 複数の異なる関心事を扱う

**検出方法**:

```bash
# 大きなクラスを検出
wc -l src/**/*.ts | sort -n | tail -20

# メソッド数が多いクラス
grep -c "^\s*(public|private|protected)" src/**/*.ts
```

**兆候**:

- [ ] クラス名が抽象的(Manager、Handler、Service)
- [ ] 関連のないメソッドが同居
- [ ] 変更時に複数の理由がある

**是正方針**:

1. 責務を列挙
2. 関連するメソッドをグループ化
3. グループごとにクラスを抽出
4. ファサードで統合(必要に応じて)

#### 2. Feature Envy(機能の横恋慕)

**定義**: あるクラスのメソッドが、他クラスのデータに過度に依存

**検出基準**:

- 他クラスのgetterを3回以上呼び出し
- 自クラスのデータよりも他クラスのデータを多く使用
- 計算ロジックが依存データと異なるクラスに存在

**検出方法**:

```bash
# getter呼び出しの多いメソッドを検出
grep -n "\.get[A-Z]\|\.is[A-Z]" src/**/*.ts
```

**兆候**:

- [ ] メソッドが他クラスのメソッドを多数呼び出す
- [ ] データの取得と計算が分離している
- [ ] 「このメソッドは本当にこのクラスに属すべきか?」

**是正方針**:

1. 依存先のクラスにメソッドを移動
2. 必要なデータとロジックを同じ場所に
3. Tell, Don't Ask原則の適用

#### 3. Data Class(データクラス)

**定義**: getter/setterのみを持ち、振る舞いがないクラス

**検出基準**:

- publicフィールドまたはgetter/setterのみ
- ビジネスロジックが存在しない
- 他クラスがデータを取り出して処理

**検出方法**:

```bash
# getter/setterのみのクラスを検出
grep -l "get\|set" src/**/*.ts | xargs grep -L "function\|method"
```

**兆候**:

- [ ] クラスがgetter/setterのみ
- [ ] ロジックが別のクラスに存在
- [ ] DTOとしてのみ使用される

**是正方針**:

1. 関連するロジックをデータクラスに移動
2. カプセル化を強化
3. 意図を明確にするメソッド名を使用

### メソッドレベルのスメル

#### 4. Long Method(長いメソッド)

**定義**: 行数が多すぎるメソッド

**検出基準**:

- 行数 > 30行
- 複数の抽象度レベルが混在
- コメントで「セクション」を区切っている

**検出方法**:

```bash
# 長いメソッドを検出(awkで行数カウント)
awk '/function|method/{start=NR} /^}$/{if(NR-start>30)print FILENAME":"start":"NR-start"lines"}' src/**/*.ts
```

**兆候**:

- [ ] スクロールが必要
- [ ] コメントでブロックを区切っている
- [ ] ローカル変数が多い

**是正方針**:

1. Extract Methodでメソッドを分割
2. 各メソッドに意図を明確にする名前
3. 抽象度を統一

#### 5. Long Parameter List(長いパラメータリスト)

**定義**: パラメータが多すぎるメソッド

**検出基準**:

- パラメータ数 > 4
- 同じパラメータの組み合わせが複数メソッドで登場
- パラメータの順序が覚えられない

**検出方法**:

```bash
# パラメータが多いメソッドを検出
grep -n "function.*,.*,.*,.*," src/**/*.ts
```

**兆候**:

- [ ] 呼び出し側でパラメータの順序を間違える
- [ ] 同じパラメータグループが繰り返し登場
- [ ] デフォルト値が多い

**是正方針**:

1. パラメータオブジェクトの導入
2. 関連パラメータをグループ化
3. Builderパターンの検討

#### 6. Switch Statements(switch文の乱用)

**定義**: 同じ条件によるswitch文が複数箇所に散在

**検出基準**:

- 同じ型による分岐が複数メソッドに存在
- 新しいケース追加時に複数箇所を修正
- ポリモーフィズムで置き換え可能

**検出方法**:

```bash
# switch文を検出
grep -rn "switch\s*(" src/
grep -rn "case\s\+[A-Z]" src/
```

**兆候**:

- [ ] 型による分岐が複数箇所
- [ ] 新しいケース追加時に「散弾銃手術」
- [ ] if-else連鎖が長い

**是正方針**:

1. ポリモーフィズムの導入
2. Strategyパターンの適用
3. Factory + インターフェースで置き換え

### 構造的スメル

#### 7. Shotgun Surgery(散弾銃手術)

**定義**: 1つの変更のために多くのクラスを修正する必要

**検出基準**:

- 小さな変更で多くのファイルを編集
- 関連する変更が分散している
- 変更漏れが発生しやすい

**検出方法**:

```bash
# Gitの変更履歴から検出
git log --name-only --oneline | head -100 | sort | uniq -c | sort -n
```

**兆候**:

- [ ] 1つの機能変更で5ファイル以上を編集
- [ ] 同様の変更を複数箇所で行う
- [ ] 変更漏れが頻発

**是正方針**:

1. 関連するコードを1クラスに集約
2. 変更理由ごとに責務を分離
3. モジュールの凝集度を高める

#### 8. Parallel Inheritance Hierarchies(並行継承階層)

**定義**: あるクラスのサブクラスを作ると、別の階層でも対応するサブクラスが必要

**検出基準**:

- 2つの継承階層が並行して存在
- 新しいサブクラス追加時に両方の階層を変更
- 類似した名前のサブクラスが対で存在

**兆候**:

- [ ] XxxとXxxFactoryが対で存在
- [ ] 新しい型追加時に2つのクラスを作成
- [ ] 継承階層が鏡像のように対応

**是正方針**:

1. 一方の階層を他方に統合
2. 合成による再構築
3. ジェネリクスの活用

### アーキテクチャアンチパターン

#### 9. Big Ball of Mud(泥団子)

**定義**: 認識可能な構造がない、無秩序なシステム

**検出基準**:

- 明確なレイヤー構造がない
- 依存関係が網の目状
- 「どこでも何でもできる」状態

**兆候**:

- [ ] ディレクトリ構造が意味不明
- [ ] 循環依存が多数
- [ ] 新メンバーが理解に時間がかかる

**是正方針**:

1. 段階的にレイヤーを導入
2. 最も重要なモジュールから境界を明確化
3. 長期的なリファクタリング計画

#### 10. Golden Hammer(金のハンマー)

**定義**: 慣れたツールや技術をあらゆる問題に適用

**検出基準**:

- 同じパターンがあらゆる場所で使用
- 問題に適さない技術選択
- 「いつもの方法」への固執

**兆候**:

- [ ] すべてがシングルトン
- [ ] あらゆる場所でORMを使用
- [ ] 不適切なデザインパターンの適用

**是正方針**:

1. 問題に適した解決策を検討
2. チームの技術スキルを拡大
3. 技術選択の理由を文書化

## ワークフロー

### Phase 1: 自動検出

**目的**: 定量的な基準でスメルを検出

**ステップ**:

1. 静的解析ツールの実行
2. メトリクス収集(行数、複雑度等)
3. 閾値超過の特定

**検出項目**:

```bash
# 行数
wc -l src/**/*.ts

# 循環的複雑度
npx ts-complexity src/

# 依存関係
npx madge --circular src/
```

### Phase 2: 手動レビュー

**目的**: 文脈を考慮したスメル評価

**ステップ**:

1. 自動検出結果のレビュー
2. 偽陽性の除外
3. 追加スメルの特定

**判断基準**:

- [ ] 技術的負債として認識すべきか?
- [ ] 意図的な設計決定か?
- [ ] リファクタリングの費用対効果は?

### Phase 3: 優先順位付け

**目的**: リファクタリング対象の優先順位決定

**評価軸**:

- **影響度**: 変更頻度、依存モジュール数
- **深刻度**: バグ発生リスク、保守コスト
- **修正コスト**: 必要な工数、リスク

**優先度マトリクス**:

```
        影響度
        高    低
深刻度
高    [P1]  [P2]
低    [P3]  [P4]
```

### Phase 4: レポート生成

**目的**: 検出結果の構造化と共有

**レポート項目**:

1. エグゼクティブサマリー
2. スメル一覧(カテゴリ別)
3. 優先順位と是正方針
4. 推奨アクション

## ベストプラクティス

### すべきこと

1. **定期的な検出**:
   - CIに静的解析を組み込み
   - スプリントごとにレビュー

2. **段階的な改善**:
   - 新規コードでスメルを発生させない
   - 既存スメルは計画的に解消

3. **知識の共有**:
   - チームでスメルカタログを共有
   - コードレビューで指摘

### 避けるべきこと

1. **完璧主義**:
   - ❌ すべてのスメルを即座に修正
   - ✅ 優先順位に基づく計画的改善

2. **スメルの正当化**:
   - ❌ 「動いているから問題ない」
   - ✅ 技術的負債として認識し管理

## 関連スキル

- **.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