🎯
単一責任の原則 (Single Responsibility Principle, SRP)
1. どんなもの?
単一責任の原則(Single Responsibility Principle, SRP)は、クラスが1つの責任だけを持つべきだという設計原則です。
この原則に従うことで、クラスは1つの目的に集中し、コードの保守性や再利用性を向上させることができます。
2. 通常の実装方法と比べてどこがすごいの?
通常の方法
例えば、「ユーザー情報の管理」と「メール送信」に関する実装を進めているとします。
複数の責任(「ユーザー情報の管理」と「メール送信」)を1つのクラスに詰め込むと、コードが煩雑になり、変更や拡張時に問題が発生します。
class User
attr_accessor :name, :email
def initialize(name, email)
@name = name
@name = email
end
def send_welcome_email
puts "Sending welcome email to #{email}"
end
end
user = User.new("Alice", "alice@example.com")
user.send_welcome_email
-
課題:
- ユーザー情報の管理とメール送信が1つのクラスに詰め込まれている。
- メール送信ロジックを変更すると、ユーザークラス自体を変更することになる。
- ユーザー情報が使いたいだけなのに、メール送信機能も付いてくる。
- 1つのクラスで複数機能を持っているため、複数メンバーでの開発の際にコンフリクトを起こしやすくなる。
SRPに基づいた方法
単一責任の原則を適用すると、1つのクラスが1つの責任のみを持つように設計されます。
class User
attr_accessor :name, :email
def initialize(name, email)
@name = name
@name = email
end
end
class EmailService
def send_welcome_email(user)
puts "Sending welcome email to #{user.email}"
end
end
user = User.new("Alice", "alice@example.com")
email_service = EmailService.new
email_service.send_welcome_email(user)
-
利点:
- ユーザー情報の管理とメール送信の責任が分離され、クラスがシンプルになる。
- メール送信ロジックを変更しても、ユーザークラスには影響を与えない。
- 逆にユーザークラスを変更しても、メール送信ロジックには影響を与えない。
- 複数メンバーで開発する際もクラスが分離されているため、コンフリクトを回避しやすい。
3. 技術や手法の"キモ"はどこにある?
-
責任の分離
- 1つのクラスが1つの目的に集中することで、コードの可読性と再利用性が向上します。
-
変更理由の分離
- クラスが持つ責任が1つであれば、そのクラスを変更する理由も1つに絞られます。
-
設計の柔軟性
- 単一責任の原則を守ることで、クラス間の依存関係が減り、設計が柔軟になります。
4. 実装例
Railsモデルとサービスオブジェクトの分離
モデルの責任をデータ管理のみに限定し、ビジネスロジックをサービスオブジェクトに分離。
class User < ApplicationRecord
end
class UserService
def initialize(user)
@user = user
end
def activate
@user.update(active: true)
NotificationService.new.send_activation_email(@user)
end
end
class NotificationService
def send_activation_email(user)
puts "Sending activation email to #{user.email}"
end
end
user = User.find(1)
user_service = UserService.new(user)
user_service.activate
-
ポイント:
- Userクラスの責任がデータ管理のみに限定され、それ以外の処理(例では activate化)が切り出されまとまっているので、コードが簡潔になる。
5. 議論はあるか?
メリット
- クラスがシンプルになり、理解しやすくなる。
- 責任が分離されているため、影響範囲が小さく、変更が容易。
デメリット
- 責任を分離することで、クラスやファイルの数が増える。
- 小規模なプロジェクトでは、複雑さを招く場合がある。
議論
単一責任の原則は、コードの可読性と保守性を大幅に向上させる強力な原則ですが、適用しすぎると過剰設計になるリスクもあります。シンプルさを保ちながら適用することが重要です。
6. まとめ
単一責任の原則(SRP)は、1つのクラスが1つの責任だけを持つべきという設計原則です。
Railsでは、モデルとビジネスロジックの分離、サービスオブジェクトやメールテンプレートの分離など、さまざまな場面で適用されています。
この原則を守ることで、コードの保守性と拡張性が向上し、変更に強いシステムを構築できます。
Discussion