sandi-metz-rules について
Ruby コードに Sandi Metz の4つのオブジェクト指向設計ルールを適用するスキルです。正確な計測方法、指摘の優先順位、具体的な設計案により、コードレビューとリファクタリングを支援します。
主な機能
- 014つのルールに基づく Ruby コードレビュー
- 02クラス、メソッド、引数の制限を計測
- 03違反を重大度順に整理
- 04リファクタリングパターンと例の提示
- 05ルールを緩和できる状況への配慮
活用シーン
- 01Ruby コードの保守性レビュー
- 02長すぎるクラスやメソッドの特定
- 03コントローラーや引数の多いメソッドのリファクタリング
- 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つのルール
- クラスは100行を超えてはなりません
- メソッドは5行を超えてはなりません
- メソッドに渡すパラメーターは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:コードベース全体のレビュー
コードベース全体をレビューする場合:
- glob パターンを使って Ruby ファイルを検索します
- 最初に、最も大きなクラスとメソッドを特定します
- コントローラーにビジネスロジックが含まれていないか確認します
- 違反を深刻度の高い順に優先順位付けします
- 該当するファイルの場所と行番号を明記して、調査結果を要約します
- 最も重大な問題に対するリファクタリングを提案します
パターン 2:特定のファイルまたはクラスのレビュー
特定のファイルをレビューする場合:
- ファイルを読み込みます
- 各クラスとメソッドの規模を測定します
- すべてのルール違反を特定します
- コード例を使って、具体的なリファクタリング案を提示します
- 提案した各変更のメリットを説明します
パターン 3:リファクタリングの支援
コードを実際にリファクタリングする場合:
- 詳細なガイダンスについて、references/rules.md を読み込みます
- 参考資料にある具体的なリファクタリングパターンを適用します
- リファクタリング後のコードが 4 つすべてのルールに従っていることを確認します
- テストが引き続き成功することを確認します
- 実施した設計上の改善について説明します
コードのカウントルール
一貫性を保つため、次の正確なカウントルールを使用します:
クラスの行数:
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