Bỏ qua

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ạpkhó 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: EmailService có 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ũ