Domain Entity
Entity là loại đối tượng có định danh duy nhất (vd Order ID để phân biệt các instance) và có vòng đời - trạng thái thay đổi theo thời gian (Order từ “Pending” → “Paid”). Entity thường tương ứng với thực thể thật trong domain (đơn hàng thật, người dùng thật).
🧱 Nguyên tắc thiết kế: cung cấp đủ dữ liệu ngay khi tạo
Cách tốt trong OOP là yêu cầu đầy đủ dữ liệu bắt buộc ngay tại thời điểm tạo đối tượng. Constructor bắt buộc truyền đủ tham số → thiếu thông tin thì không tạo được entity → không có Order “nửa vời”.
final class Order
{
private int $ebookId;
private string $emailAddress;
private int $quantity;
private int $pricePerUnit;
private int $totalAmount;
public function __construct(int $ebookId, string $emailAddress, int $quantity, int $pricePerUnit)
{
if ($ebookId <= 0) throw new \InvalidArgumentException('ID ebook phải > 0');
if (!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) throw new \InvalidArgumentException('Email không hợp lệ');
if ($quantity <= 0) throw new \InvalidArgumentException('Số lượng phải > 0');
if ($pricePerUnit < 0) throw new \InvalidArgumentException('Đơn giá không hợp lệ');
$this->ebookId = $ebookId;
$this->emailAddress = $emailAddress;
$this->quantity = $quantity;
$this->pricePerUnit = $pricePerUnit;
$this->totalAmount = $quantity * $pricePerUnit; // tự tính, không nhận từ ngoài
}
// ... các getter
}🛡️ Đảm bảo bất biến (invariant)
Với constructor như trên, ta đạt được:
Orderluôn có đủ thông tin - không ai tạo được order thiếu email hay quên tính tổng tiền.- Mọi
Ordertạo ra đều hợp lệ ở mức cơ bản - không có order số lượng = 0 hay email sai định dạng lọt vào hệ thống, vì đã bị chặn ở “cửa” tạo đối tượng. - Giảm rủi ro sai sót:
totalAmountđược tính bên trong constructor thay vì truyền từ ngoài → tránh lập trình viên tính sai. Domain model tự lo những logic “hiển nhiên”.
Liên quan
- Domain Model - Mô hình miền nghiệp vụ
- Entity vs Value Object - phân biệt entity với value object
- Repository Pattern - cách lưu & tái tạo entity
- Encapsulation - Đóng gói · Single Responsibility Principle