はじめに
シングル・レスポンシビリティ・プリンシプル(SRP: Single Responsibility Principle)は、ソフトウェア設計の基本原則の一つであり、オブジェクト指向設計のSOLID原則の一部です。
SRPの定義
SRPの定義
- 「クラスは、変更の理由が一つだけになるようにするべきである」
シンプルな解釈
- 1つのクラスは1つの責任だけを持つべきである。
- クラスは単一の機能を提供し、その機能に関連する変更の理由が一つだけになるようにする。
SRPの目的
- 保守性の向上: クラスが一つの責任に集中しているため、変更が必要になったときにどのクラスを変更すればよいかが明確になります。
- 再利用性の向上: クラスが単一の責任を持っていると、他のコンテキストでも再利用しやすくなります。
- 理解の容易さ: クラスが一つの責任を持っているため、そのクラスの役割と動作を理解するのが簡単になります。
具体例
例1: 書籍の管理システム
書籍管理システムにおいて、以下のようなクラスを考えます:
悪い例(SRPに従っていない)
public class Book {
private String title;
private String author;
private String text;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
// 本を印刷するメソッド
public void print() {
// 印刷ロジック
}
// 本を保存するメソッド
public void save() {
// 保存ロジック
}
}
このBook
クラスは、書籍の情報を管理する責任の他に、印刷や保存の責任も持っています。これにより、クラスが複数の責任を持ち、変更の理由が増えます。
良い例(SRPに従っている)
public class Book {
private String title;
private String author;
private String text;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public class BookPrinter {
public void print(Book book) {
// 印刷ロジック
}
}
public class BookRepository {
public void save(Book book) {
// 保存ロジック
}
}
この設計では、Book
クラスは書籍の情報を管理し、BookPrinter
クラスは印刷を管理し、BookRepository
クラスは保存を管理します。これにより、各クラスが単一の責任を持つようになり、変更の理由が明確になります。
SRPの適用方法
- 責任の特定: クラスが現在持っている責任を特定します。
- 分割: クラスが複数の責任を持っている場合、それを複数のクラスに分割します。
- テスト: 各クラスが単一の責任を持つようにテストし、変更があった場合の影響範囲を確認します。
SRPのメリットとデメリット
メリット
- 保守性の向上: 変更の理由が明確になるため、コードの保守が容易になります。
- 再利用性の向上: 単一責任を持つクラスは他のプロジェクトやコンテキストでも再利用しやすくなります。
- 理解の容易さ: クラスが単一の責任を持つため、その役割を理解しやすくなります。
デメリット
- 初期の設計コスト: 責任を分割するために、初期設計時により多くのクラスを作成する必要があります。
- 過剰な分割: 責任を過剰に分割すると、クラスが増えすぎて管理が難しくなる可能性があります。