ruby-coder について
ruby-coder は、Ruby 開発者向けに Ruby 3.x の記法とコード構成の指針を示すスキルです。クラスやメソッドの小規模化、引数の制限、スレッドセーフ性を重視し、例外の理由も記録します。
主な機能
- 01Ruby 3.x の記法ガイド
- 02Sandi Metz の 4 つの開発ルール
- 03共有状態のスレッドセーフなパターン
- 04冪等な操作の指針
- 05リファクタリングの基準と例外
活用シーン
- 01Ruby コード構成の確認
- 02大きすぎるクラスやメソッドのリファクタリング
- 03安全に繰り返せる操作の設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill ruby-coderインストール後、Claude Code で/ruby-coderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ruby-style-conventions.mdruby-tips.mdsandi-metz.md詳細
Ruby コーダー
Ruby 3.x のモダン構文
キー名が変数名と一致する場合は、ハッシュの省略記法を使用します。
age = 49
name = "David"
user = { name:, age: }
一般的な命名規則、セマンティックメソッド、Enumerable のパターンについては、references/ruby-style-conventions.md を参照してください。
Sandi Metz の開発者向け 4 つのルール
これらのルールでは、コード品質を維持するために厳格な制限を設けています。ルールに違反する場合は、明確な正当化が必要です。
ルール 1:クラスは 100 行を超えてはならない
制限:クラスごとのコードは最大 100 行です。
確認方法:クラスがこの制限を超えた場合、補助的な関心事を新しいクラスに切り出します。
# When exceeding 100 lines, extract secondary concerns:
class UserProfilePresenter # Presentation logic
class UserProfileValidator # Validation logic
class UserProfileNotifier # Notification logic
例外:単一責任の原則(SRP)に基づく正当な理由が必要です。
ルール 2:メソッドは 5 行を超えてはならない
制限:メソッドは最大 5 行です。各 if/else 分岐も行数に含まれます。
# Good - 5 lines or fewer
def process_order
validate_order
calculate_totals
apply_discounts
finalize_payment
end
# Avoid - extract when too long
def process_order
return unless items.any?
return unless valid_address?
self.subtotal = items.sum(&:price)
self.tax = subtotal * tax_rate
self.total = subtotal + tax
charge_customer
send_confirmation
end
例外:ペアでの承認が必要です(ルール 0:合意のうえでルールに違反します)。
ルール 3:パラメーターは 4 つまでにする
制限:メソッドのパラメーターは最大 4 つです。それ以上のデータが必要な場合は、パラメーターオブジェクトまたはハッシュを使用します。
# Parameter object when data is related
def create_post(post_params)
Post.create(user: post_params.user, title: post_params.title, content: post_params.content)
end
例外:link_to や form_for などの Rails ビュー ヘルパーは対象外です。
ルール 4:コントローラーでインスタンス化するオブジェクトは 1 つまでにする
制限:コントローラーでインスタンス化するオブジェクトは 1 つだけにし、ほかのオブジェクトはファサードパターンを介して取得します。
# Good - single object via facade
class DashboardController < ApplicationController
def show
@dashboard = DashboardFacade.new(current_user)
end
end
# Avoid - multiple instance variables
class DashboardController < ApplicationController
def show
@user = current_user
@posts = @user.posts.recent
@notifications = @user.notifications.unread
end
end
- 未使用のインスタンス変数には、アンダースコアを接頭辞として付けます:
@_calculation - ビューからコラボレーターに直接アクセスするのは避けます:
@user.profile.avatar→ ファサードメソッドを使用します
コード品質基準
スレッドセーフ
共有された可変状態には Mutex を使用します。
class Configuration
@instance_mutex = Mutex.new
def self.instance
return @instance if @instance
@instance_mutex.synchronize { @instance ||= new }
end
end
冪等な操作
安全に繰り返し実行できる操作を設計します。
def activate_user
return if user.active?
user.update(active: true)
send_activation_email unless email_sent?
end
リファクタリングのきっかけ
次の場合はクラスを切り出します:
- クラスが 100 行を超える(Sandi Metz のルール 1)
- クラスが複数の責務を持つ
- クラス名に "And" または "Or" が含まれる
次の場合はメソッドを切り出します:
- メソッドが 5 行を超える(Sandi Metz のルール 2)
- 条件分岐が複雑である
- ネストしたループや条件分岐がある
- コメントでコードの動作を説明している(コードは自己説明的であるべきです)
次の場合はパラメーターオブジェクトを使用します:
- メソッドに 4 つを超えるパラメーターが必要である(Sandi Metz のルール 3)
- 関連するパラメーターが常に一緒に渡される
- パラメーターのリストが徐々に増えている
次の場合はファサードを作成します:
- コントローラーで複数のオブジェクトが必要である(Sandi Metz のルール 4)
- ビューからネストしたコラボレーターにアクセスしている
- 複雑なデータ集約が必要である
ルールに違反する場合
Sandi Metz の「ルール 0」:4 つのルールに違反する場合は、ペアでの承認を得るか、明確な正当化を行います。
| ルール | 有効な例外 |
|---|---|
| 100 行 | SRP に基づく明確な正当化が必要 |
| 5 行 | 複雑だが、これ以上分割できないアルゴリズム |
| 4 パラメーター | Rails ビューヘルパーは対象外 |
| 1 オブジェクト | ファサードを使わないシンプルなビュー |
例外にはすべて、明確な理由をコードコメントに記録します。
参考資料
references/sandi-metz.md- コードの不吉な臭い、リファクタリング、テストの原則references/ruby-tips.md- 型変換、ハッシュのパターン、Proc の合成、Refinementsreferences/ruby-style-conventions.md- 命名、セマンティックメソッド、Enumerable、合成