mcpField
S
sandi-metz-rules

sandi-metz-rules

github.com/lucianghinda開発42557 回インストール今日更新
リポジトリ

sandi-metz-rules について

Ruby コードに Sandi Metz の4つのオブジェクト指向設計ルールを適用するスキルです。正確な計測方法、指摘の優先順位、具体的な設計案により、コードレビューとリファクタリングを支援します。

主な機能

  1. 014つのルールに基づく Ruby コードレビュー
  2. 02クラス、メソッド、引数の制限を計測
  3. 03違反を重大度順に整理
  4. 04リファクタリングパターンと例の提示
  5. 05ルールを緩和できる状況への配慮

活用シーン

  1. 01Ruby コードの保守性レビュー
  2. 02長すぎるクラスやメソッドの特定
  3. 03コントローラーや引数の多いメソッドのリファクタリング
  4. 04コードの臭いや設計の複雑さの分析

インストール

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

$npx skills add https://github.com/lucianghinda/superpowers-ruby --skill sandi-metz-rules

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

同梱ファイルreferences/rules.md

詳細

Sandi Metz のルール

概要

このスキルは、保守しやすいオブジェクト指向コードを書くための Sandi Metz の4つのルールを、Ruby のコードベースに適用するのに役立ちます。これらのルールは、優れた設計プラクティスを促すヒューリスティックであり、コードの理解、テスト、保守を容易にします。

4つのルール

  1. クラスは100行を超えてはなりません
  2. メソッドは5行を超えてはなりません
  3. メソッドに渡すパラメーターは4つ以内にしてください
  4. コントローラーがインスタンス化できるオブジェクトは1つだけです

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

次の場合にこのスキルを適用します:

  • ユーザーが Sandi Metz のルールの適用を明示的に求めている
  • 保守性とコード品質の観点から Ruby コードをレビューする
  • 設計を改善するために既存の Ruby コードをリファクタリングする
  • ユーザーが「コードスメル」やオブジェクト指向設計の改善について尋ねている
  • Ruby コードの複雑さや保守性の問題を分析する
  • ユーザーが「POODR」という用語を使う、または Sandi Metz の著作に言及する

コードレビューのワークフロー

1. コードを分析する

Sandi Metz のルールに照らしてコードをレビューする場合:

参考ドキュメントを読む: まず、詳細なルールのドキュメントを読み込みます:

Read references/rules.md

正確に測定する:

  • クラス:実際のコード行数を数えます(空行、コメント、クラス定義、end 文は除外します)
  • メソッド:実際のコード行数を数えます(空行、コメント、メソッド定義、end 文は除外します)
  • パラメーター:明示的なパラメーターをすべて数えます。キーワード引数は含めますが、&block は含めません
  • コントローラー:各アクションでのオブジェクトのインスタンス化を数えます(既存のオブジェクトの検索は除外します)

違反を特定する: コードベースを調べ、各ルールへの違反を探します。grep やファイル検索でクラスとメソッドを見つけ、体系的に分析します。

2. 問題に優先順位を付ける

すべての違反が同じ重要度とは限りません:

優先度:高

  • 200行を超えるクラス(重大な違反)
  • 10行を超えるメソッド(重大な違反)
  • パラメーターが6つ以上のメソッド
  • 複雑なビジネスロジックを含むコントローラー

優先度:中

  • 100~200行のクラス
  • 5~10行のメソッド
  • パラメーターが5つのメソッド

優先度:低

  • 境界的なケース(例:6行のメソッド)
  • テストファイル、設定、DSL における違反
3. 具体的なリファクタリングを提案する

違反ごとに、具体的なリファクタリング方針を提示します:

長いクラス:

  • 関連するメソッドを新しいクラスに抽出する
  • 単一責任の原則を使って個別の責務を特定する
  • コンポジションやモジュールを使って振る舞いを共有する
  • パターンを適用する:Strategy、Decorator、Command、Facade

長いメソッド:

  • 説明的な名前を付けたサブメソッドを抽出する
  • 条件分岐をポリモーフィズムに置き換える
  • ガード節を使ってネストを減らす
  • Composed Method パターンを適用する(メソッドの抽象度をそろえる)
  • 複雑な式を、適切な名前を付けたメソッドに抽出する

パラメーターが多すぎる場合:

  • 関連するパラメーターに Parameter Object を導入する
  • 複雑なオブジェクトの構築には Builder パターンを使う
  • パラメーターをメソッド呼び出しに置き換える(インスタンス変数を使う)
  • そのメソッドが別のクラスに属するべきか検討する

肥大化したコントローラー:

  • サービスオブジェクトやユースケースを抽出する
  • Command または Interactor パターンを適用する
  • 複雑なオーケストレーションには Facade オブジェクトを作成する
  • ビジネスロジックをドメイン層に移す
4. コード例を提示する

リファクタリングを提案する場合:

  • リファクタリング前後のコード例を示す
  • リファクタリング後のコードが優れている理由を説明する
  • 使用するパターンの名前を挙げる
  • 変更によってテスト容易性と明瞭さがどう向上するかを明示する
5. コンテキストを考慮する

適切な理由があれば、ルールを破ってもよいことを覚えておいてください:

  • 設定ファイル(例:routes.rb)
  • テストファイル(ただし、読みやすさは保つ必要があります)
  • DSL の定義
  • 生成コードやデータベースマイグレーション
  • ルールに従うことでコードの明瞭さが損なわれる場合

違反が許容される可能性がある場合は、必ずその旨を記し、理由を説明してください。

使用パターン

パターン 1:コードベース全体のレビュー

コードベース全体をレビューする場合:

  1. glob パターンを使って Ruby ファイルを検索します
  2. 最初に、最も大きなクラスとメソッドを特定します
  3. コントローラーにビジネスロジックが含まれていないか確認します
  4. 違反を深刻度の高い順に優先順位付けします
  5. 該当するファイルの場所と行番号を明記して、調査結果を要約します
  6. 最も重大な問題に対するリファクタリングを提案します
パターン 2:特定のファイルまたはクラスのレビュー

特定のファイルをレビューする場合:

  1. ファイルを読み込みます
  2. 各クラスとメソッドの規模を測定します
  3. すべてのルール違反を特定します
  4. コード例を使って、具体的なリファクタリング案を提示します
  5. 提案した各変更のメリットを説明します
パターン 3:リファクタリングの支援

コードを実際にリファクタリングする場合:

  1. 詳細なガイダンスについて、references/rules.md を読み込みます
  2. 参考資料にある具体的なリファクタリングパターンを適用します
  3. リファクタリング後のコードが 4 つすべてのルールに従っていることを確認します
  4. テストが引き続き成功することを確認します
  5. 実施した設計上の改善について説明します

コードのカウントルール

一貫性を保つため、次の正確なカウントルールを使用します:

クラスの行数:

class MyClass  # Don't count
  def method   # Count: 1
    body       # Count: 2
  end          # Don't count
end            # Don't count

メソッドの行数:

def my_method        # Don't count
  line_1             # Count: 1
  line_2             # Count: 2
                     # Don't count (blank line)
  # comment          # Don't count
  line_3             # Count: 3
end                  # Don't count

パラメーター:

def method(a, b, c, d)              # 4 parameters - OK
def method(a, b, c, d, e)           # 5 parameters - Violation
def method(a:, b:, c:, d:)          # 4 parameters - OK
def method(a, b = nil, c = {})      # 3 parameters - OK (defaults still count)
def method(a, *rest)                # 2 parameters - OK
def method(a, &block)               # 1 parameter (blocks don't count)

自動化

これらのルールを適用するため、静的解析ツールの使用を提案します:

  • RuboCop: Metrics/MethodLength、Metrics/ClassLength、Metrics/ParameterLists を設定します
  • Reek: LongMethod、LargeClass、LongParameterList などのコードのにおいを検出します
  • flog: メソッドの複雑さを測定します
  • flay: コードの重複を検出します

RuboCop の設定例:

Metrics/ClassLength:
  Max: 100

Metrics/MethodLength:
  Max: 5

Metrics/ParameterLists:
  Max: 4
  MaxOptionalParameters: 3

リソース

このスキルには、以下を含む包括的な参考資料が含まれています:

  • 各ルールの詳細な説明
  • 根拠とメリット
  • よくある違反とその原因
  • 具体例を含む、具体的なリファクタリング戦略
  • ルールを破ってもよい場合のガイダンス
  • 関連する設計原則とパターン

詳細なコード分析を行う場合や、リファクタリングのアプローチを説明する場合は、この参考資料を読み込んでください:

Read references/rules.md

コメント