خانه / OOP / DDD / یک ترفند خیلی ساده جهت تشخیص تمایز بین ValueObjectها و Entityها

یک ترفند خیلی ساده جهت تشخیص تمایز بین ValueObjectها و Entityها

آیا این رو Entity در نظر بگیرم یا ValueObject؟
این سوال از اون جنس سوالاتی هست که آدم معمولا جوابهای زیادی براش پیدا می کنه ولی، باز هم در تشخیص تفاوت بین این دو گیج خواهد بود. به چند مورد از این نوع جواب ها اشاره می کنم:

  • ببین Entity اونی هست که شناسه یکتا (Identity) داره ولی ValueObject این شناسه یکتا رو نداره و با مقادیرش متمایز میشه. (اینجا معمولا میگی: چی میگه!! (احتمالا تو دلت میگی))
  • جوابش راحته که! ValueObjectها Immutable هستند. اجازه بده بیشتر بازش کنم برات. اینی که گفتم منظورش اینه که ValueObjectها رو بعد از اینکه ایجاد کردیم حق دخل و تصرف و تغییر در مقادیرش رو نداریم. در صورتی که نیاز به تغییر مقادیرش داشتیم باید یک Object جدید بسازیم.( مخاطب اینجا هم میگه بدتر شد که، اصلا از خیر طراحی VOها گذشتم.)
  • Entityها اونایی هستند که تغییرات در مقادیرشون رو در بازه ی زمانی حیات و ممات اون Entity نیاز داری و در موردشون دغدغه داری، ولی در مورد ValueObject ها این دغدغه رو نداری و هر موقع مقداری ازشون تغییر کنه کلا با یک ValueObject جدید جایگزینش می کنی (احتمال اینجا هم بگی نکنه لاگ دیتابیس و اینا منظورشه).

 

خب بیاید این دفعه از یه جنبه ساده تر بهش نگاه کنیم، من قصد دارم اینجا یک ترفند خیلی ساده رو بهتون معرفی کنم.
موقع طراحی دامین وقتی به یک چیزی میرسی که نمی دونی باید Entity در نظرش بگیری یا ValueObject می تونی از این ترفند ساده استفاده کنی.

این سوال رو از خودت بپرس:

اگر این چیزی که می خوام طراحی کنم، رو دو نفر همزمان عینا داشته باشند آیا به کسی در جایی برمی خوره یا خیر؟

 

منم موافقم باهات درست میگی بدون مثال معلوم نیست چی میگه جمله ی بالا
فرض کنید مثال کلاسیک پول رو داریم، که شامل یک مقدار و یک واحد هست. مثلا مقدار 5 و واحد پولی دلار که میشود 5 دلار.

  • آیا اگر همین 5 دلار رو تقی و نقی عینا و همزمان با هم داشته باشند، ایراد داره یا خیر؟ خب جواب این سوال خیلی واضح و مشخص نیست و بستگی به دامنه مسئله داره. دو تا حالت رو برای دامنه مسئله در نظر می گیریم:
    حالت یک. ما فقط موجودی حساب افراد رو میخواهیم بدونیم. توی همچین دامنه ای طبیعتا مهم نیست و ایرادی ندارد. تقی و نقی می تونن همزمان صاحب 5 دلار در حساب خودشون باشن. پس در اینجا اون رو بصورت ValueObject طراحی می کنیم.
  •  حالت دوم. فرض کنید خود اسکناس فیزیکی هم مهم هست. (توی این مورد کلا محدودیت دنیای فیزیکی جلوی ما رو میگیره) در این حالت 5 دلاری ای که دست تقی هست باید متمایز از 5 دلاری باشه که دست نقی. و اصلا نمی تونیم بگیم این اسکناس 5 دلاری همزمان هم دست تقی هست و هم دست نقی. در اینصورت به همه بر می خوره. پس در این مورد باید بصورت Entity در نظر گرفته شود.

 

 

درباره ی masoud@admin

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

به کانال من در تلگرام بپیوندید

اگر علاقمند به مباحث معماری و مدلسازی نرم افزار هستید می توانید به کانال تلگرام بپیوندید.

پیوستن بستن