Entity vs Value Object
Trong domain model, cần phân biệt hai loại đối tượng cơ bản: Entity và Value Object. Dùng đúng chỗ giúp tăng tính biểu đạt và đúng đắn của mô hình.
🆔 Entity - có danh tính
- Có định danh phân biệt (hai
Orderkhác nhau dựa trên ID, kể cả khi mọi thuộc tính giống nhau). - Trạng thái thay đổi theo thời gian (Order “Pending” → “Paid”).
- Đại diện thực thể có vòng đời. Xem Domain Entity.
💎 Value Object - có giá trị
- Không có danh tính riêng, đại diện cho một giá trị.
- Bất biến (immutable) - tạo xong không đổi nội dung.
- So sánh bằng giá trị: hai
EmailAddresscùng chuỗi email được coi là bằng nhau.
📦 Ví dụ Value Object
EmailAddress: bao bọc chuỗi email, tự validate format bên trong → giúp core không dùng kiểu nguyên thủy trần.Money/Price: giữ số tiền + đơn vị tiền tệ cùng nhau → đảm bảo tính toán đúng, tránh nhầm lẫn đơn vị (dùngMoneythayfloat).DateRange, phần trăm thuế, địa chỉ…
Trong ví dụ đơn giản, sách dùng
string+ validate trong constructorOrdercũng được. Ở thiết kế nâng cao, tạoEmailAddressvalue object là cách “sạch” hơn.
💡 Vì sao Value Object quan trọng với core
Value Object giúp core code tự kiểm soát logic và tính đúng đắn mà không phụ thuộc kiểu dữ liệu nguyên thủy của hệ thống - góp phần giữ code ở Core Code là gì (vd Money thay float, DateTimeImmutable thay timestamp thô).
Liên quan
- Domain Entity
- Domain Model - Mô hình miền nghiệp vụ
- Ranh giới giữa Core và Infrastructure Code - value object giúp giữ core sạch
- Encapsulation - Đóng gói