Single Responsibility Principle (SRP)¶
Single Responsibility Principle là nguyên lý đầu tiên trong bộ nguyên lý SOLID, quy định rằng:
- Một class chỉ nên có một lý do để thay đổi
- Nghĩa là mỗi class chỉ làm một việc duy nhất, giống như một người thợ chỉ chuyên một nghề
Ví dụ vi phạm SRP¶
Đây là một ví dụ về class User vi phạm nguyên lý SRP:
class User {
private String name;
private String email;
// Nhiệm vụ 1: Quản lý thông tin user
public void setName(String name) {
this.name = name;
}
// Nhiệm vụ 2: Lưu vào database (KHÔNG NÊN)
public void saveToDatabase() {
// Code lưu database
System.out.println("Lưu user vào database");
}
// Nhiệm vụ 3: Gửi email (KHÔNG NÊN)
public void sendEmail() {
// Code gửi email
System.out.println("Gửi email đến " + email);
}
}
Vấn đề của cách làm trên:¶
- Class
Userđang thực hiện 3 nhiệm vụ khác nhau - Khi cần thay đổi cách lưu database → phải sửa class
User - Khi cần thay đổi cách gửi email → cũng phải sửa class
User - Class trở nên phức tạp và khó bảo trì
Giải pháp tuân thủ SRP¶
Tách các nhiệm vụ ra thành những class riêng biệt:
// Class này chỉ quản lý thông tin user
class User {
private String name;
private String email;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
// Class riêng để lưu database
class UserRepository {
public void save(User user) {
System.out.println("Lưu user " + user.getName() + " vào database");
}
}
// Class riêng để gửi email
class EmailService {
public void sendEmail(User user, String message) {
System.out.println("Gửi email đến " + user.getEmail() + ": " + message);
}
}
Lợi ích của cách làm này:¶
- Tách biệt trách nhiệm: Mỗi class chỉ làm một việc
- Dễ bảo trì: Thay đổi logic database không ảnh hưởng đến class
User - Dễ test: Có thể test từng chức năng độc lập
- Tái sử dụng:
EmailServicecó thể dùng cho nhiều đối tượng khác - Mở rộng dễ dàng: Thêm cách lưu trữ mới không cần sửa code cũ