Entity در مقابل Value Object
Entity در DDD یک هویت مشخص و پایدار دارد (معمولاً یک شناسه Id) که حتی اگر همه فیلدهایش تغییر کنند همچنان همان شیء محسوب میشود، در حالی که Value Object هیچ هویت مستقلی ندارد و کاملاً بر اساس مقدار فیلدهایش شناخته میشود؛ دو Value Object با مقادیر یکسان کاملاً معادل هم هستند و معمولاً غیرقابل تغییر (Immutable) طراحی میشوند.
| ویژگی | Entity | Value Object |
|---|---|---|
| داشتن شناسه (Id) | بله | خیر |
| مبنای برابری | شناسه | مقدار فیلدها |
| تغییرپذیری | قابل تغییر | معمولاً Immutable |
کِی از Entity استفاده کنیم؟
وقتی شیء باید در طول زمان ردیابی شود و هویتش مستقل از مقادیر فعلیاش اهمیت دارد، مثل یک کاربر یا یک سفارش.
کِی از Value Object استفاده کنیم؟
وقتی فقط مقدار مهم است نه هویت، مثل یک آدرس پستی، بازه قیمتی یا مختصات جغرافیایی.
مثال Entity
public class Customer // Entity
{
public Guid Id { get; }
public string Name { get; set; }
}
مثال Value Object
public record Money(decimal Amount, string Currency);
// Value Object: دو Money با مقدار یکسان برابرند
var a = new Money(100, "IRR");
var b = new Money(100, "IRR"); // a == b -> true
اشتباه رایج
اشتباه رایج دادن شناسه Id به یک Value Object (مثل Address) است؛ این کار عملاً آن را به یک Entity تبدیل میکند و مزیت اصلی Value Object یعنی مقایسه بر اساس مقدار و سادگی را از بین میبرد.
جمعبندی
برای اشیائی که هویت پایدار و مستقل از مقدار دارند از Entity و برای اشیائی که فقط بر اساس مقدارشان معنا دارند از Value Object استفاده کنید.
