Single Responsibility Principle (SRP - Nguyên tắc Trách nhiệm Duy nhất)
“Một Class chỉ nên có một lý do để thay đổi.” - Uncle Bob
Một Class chỉ làm MỘT việc, và duy nhất một việc. Công việc này được đóng gói gọn gàng bên trong Class, chỉ cho bên ngoài truy cập khi cần thiết.
Mục tiêu chính: giảm bớt sự phức tạp - không còn những đoạn code dài hàng gang tay, không phải maintain những ứng dụng nghiệp vụ khù khoằm.
Tip thực chiến của tác giả: thiết kế theo hướng “Use case”
Mỗi class chỉ có một hàm duy nhất là handle (hoặc execute) và chỉ làm duy nhất một công việc. Nghiệp vụ mới phát sinh → tạo class mới (với hàm handle/execute mới). Laravel áp dụng thường xuyên: các class Jobs / Listeners đều đơn lẻ, kích hoạt qua hàm handle duy nhất.
<?php
// Single Action Controller (phổ biến trong cộng đồng Laravel)
class RegisterUserController extends Controller
{
protected $userService;
public function __construct(UserService $userService) {
$this->userService = $userService;
}
// Kích hoạt duy nhất qua __invoke() - chỉ làm MỘT việc: đăng ký User
public function __invoke(Request $request) {
$data = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
$this->userService->register($data);
return response()->json(['message' => 'User registered successfully'], 201);
}
}Nếu không đảm bảo SRP?
Cơn ác mộng tới khi ứng dụng gặp thay đổi: một class Service lớn khiến bạn bối rối khi sửa để đáp ứng nghiệp vụ - nguy cơ thay đổi những thứ không mong muốn, dẫn tới lỗi tiềm ẩn.
Liên quan
- SOLID - chữ S
- Encapsulation - Đóng gói - SRP là đóng gói ở mức class
- Command Pattern - mỗi command một trách nhiệm
- Chain of Responsibility Pattern - chia trách nhiệm ra các class riêng biệt