Domain Model - Mô hình miền nghiệp vụ
Domain Model là một tập hợp các khái niệm, đối tượng, quy tắc nghiệp vụ được mô hình hóa dưới dạng code, phản ánh sát nhất thực thể và quy trình trong thế giới thực của bài toán. Nó là cách hiện thực hóa Core Code là gì một cách chặt chẽ, có cấu trúc, theo tư tưởng Domain-Driven Design.
Domain Model gồm các thành phần: Domain Entity, Value Object (Entity vs Value Object), Domain Service, Domain Event.
❓ Tại sao cần Domain Model?
Trong code trộn lẫn (mixed), logic nghiệp vụ nằm tản mát trong controller dưới dạng thao tác thủ tục (tính tiền, tạo mảng, tính ID). Cách này gọi là Transaction Script - viết tuần tự các bước. Nhược điểm: logic không có chỗ “định cư” cố định → khó bảo trì và mở rộng.
Domain Model khắc phục bằng cách đóng gói dữ liệu + logic liên quan thành các đối tượng có trạng thái và hành vi:
- Thể hiện rõ các khái niệm domain. Thay vì mảng dữ liệu vô danh (
$record), ta tạo classOrder- biến “Đơn hàng” thành first-class citizen trong code (có danh tính, thuộc tính, phương thức). - Đảm bảo tính nhất quán & đầy đủ. Kiểm soát dữ liệu ngay tại lớp domain: constructor của
Orderyêu cầu đủ thông tin, thiếu/sai thì ném exception → ngăn tạoOrderkhông hợp lệ ngay từ đầu (bảo vệ invariant). - Đóng gói logic vào đúng chỗ.
$order->calculateTotal()- logic tính tiền nằm trong object thể hiện khái niệm, tái sử dụng dễ và dễ đọc. - Tách bạch domain logic khỏi chi tiết kỹ thuật. Object “sống” trong bộ nhớ, xử lý nghiệp vụ thuần bằng code PHP, không dính DB/framework. Phối hợp với Repository Pattern để lưu/tái tạo trạng thái.
🔄 Chuyển tư duy
Từ “làm gì trước, làm gì sau” (thủ tục) sang “đối tượng này làm những nhiệm vụ gì” (hướng đối tượng).
Ví dụ đơn hàng: Controller chỉ còn lo lấy dữ liệu đầu vào → tạo Order entity (tự tính tiền, tự validate) → gọi repository lưu. Chi tiết SQL bị đẩy đi hết.
Liên quan
- Domain Entity - viên gạch chính của domain model
- Entity vs Value Object
- Domain Service · Domain Event
- Repository Pattern - giúp domain model “làm việc” với hạ tầng dữ liệu
- Encapsulation - Đóng gói - nền tảng OOP của domain model