🍈
Rubyでさらっと学ぶSOLID原則①「単一責任の原則」
SOLID原則とは
ソフトウェアの拡張性や保守性を高めるための下記5つの原則のこと。
- S(Single-responsibility principle): 単一責任の原則
- O(Open-closed principle): オープン・クローズドの原則
- L(Liskov substitution principle): リスコフの置換原則
- I(Interface segregation principle): インターフェース分離の原則
- D(Dependency inversion principle): 依存性逆転の原則
単一責任の原則(SRP)とは
「モジュールはたったひとつのアクターに対して責任を負うべきである」という原則。
補足
- モジュールとは
- クラス・モジュール・関数・メソッドのことを指す。
- アクターとは
- システムを使うユーザーや外部システムのこと。
- ユースケース図では人型で表現される。
- 例:エンドユーザー、管理ユーザー、社内専用管理ユーザー
単一責任の原則に違反している例
外部システムに通知するためのクラスがあるとします。
class Notifier
def notify_to_slack(channel:, text:)
# slackに通知する
end
def send_mail(from:, to:, title:, body:)
# メールで通知する
end
end
上記の例の場合、アクターは「Slack」と「メールシステム」になります。1つの「Notifier」モジュールの中に2つのアクターが存在しているので、単一責任の原則違反だといえるでしょう。
解決策
Slackへの送信を責任として持つクラスと、メール送信を責任として持つクラスに分けます。
class SlackNotifier
def notify(channel:, text:)
# slackに通知する
end
end
class MailSender
def send(from:, to:, title:, body:)
# メールで通知する
end
end
単一責任の原則違反の臭いに気付くための質問
- 1つのクラスorメソッドの行数が長すぎないか?
- そのクラスが何か、そのメソッドは何を行うメソッドか、一言で表現できるか?
Discussion