CodeShot

Entity در مقابل Value Object

Entity در DDD یک هویت مشخص و پایدار دارد (معمولاً یک شناسه Id) که حتی اگر همه فیلدهایش تغییر کنند همچنان همان شیء محسوب می‌شود، در حالی که Value Object هیچ هویت مستقلی ندارد و کاملاً بر اساس مقدار فیلدهایش شناخته می‌شود؛ دو Value Object با مقادیر یکسان کاملاً معادل هم هستند و معمولاً غیرقابل تغییر (Immutable) طراحی می‌شوند.

ویژگیEntityValue 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 استفاده کنید.