Entity vs Value Object

Trong domain model, cần phân biệt hai loại đối tượng cơ bản: EntityValue 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

  • định danh phân biệt (hai Order khá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 EmailAddress cù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ùng Money thay float).
  • DateRange, phần trăm thuế, địa chỉ…

Trong ví dụ đơn giản, sách dùng string + validate trong constructor Order cũng được. Ở thiết kế nâng cao, tạo EmailAddress value 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