مفهوم Value Object چیست ؟
خب ببینید شما با یک جستجوی ساده در گوگل می تونید مقالات زیادی رو در مورد مفهوم Value Object پیدا کنید. اما من می خوام طبق تجربه شخصی خودم و به صورت خیلی ساده این مفهوم رو براتون شرح بدم.
اول اینکه معمولا Value Object ها در معماری های بزرگی مثل معماری Domain Driven Desgin استفاده می شوند.
اجازه بدید یک مثال رو به صورت خیلی ساده براتون شرح بدم. فرض کنید قصد دارید برای یک بازی شطرنج برنامه نویسی کنید. خب در بازی شطرنج مهره ها نقش کلیدی دارند. هر مهره حرکات خاصی را می تواند انجام دهد. به عنوان مثال یک سرباز می تواند یک یا دو خانه جلو برود. یا مهره فیل می تواند به صورت مورب در خانه های سیاه یا سفید حرکت کند یا اینکه مهره اسب می تواند حرکت L (ال) مانند داشته باشد.
در واقع مهره های بازی شطرنج می توانند حرکات ثابتی را داشته باشند. یعنی اگر به شما بگویند مهره ای که فقط می تواند یک یا دو خانه به جلو حرکت کند کدام مهره است ؟ می توانید به راحتی بگویید مهره سرباز است.
خب مثال بالا را در نظر داشته باشید تا در ادامه بهتر به مفهوم Value Object بپردازیم.
Value Object چیست ؟
از Value Object ها برای نگهداری اطلاعات ثابت یک شی استفاده می شود. این اطلاعات در نهایت باید منجر به شناسایی شی شود. به عنوان مثال فرض کنید یک کاربر داریم با نام و نام خانوادگی و آی دی منحصر بفرد و آدرس. خب در اینجا توسط ID میتوان کاربر را شناسایی کرد ولی ID هیچ گاه جزو Value Object ها حساب نمی شود. در اینجا میتوانیم بگوییم کاربری که در استان فارس، شهر شیراز، خیابان ملاصدرا، کوچه شماره 8 و پلاک 5 می باشد همان علی است. خب آدرس در اینجا یک Value Object می باشد.
یا در مثال شطرنج می توانیم بگوییم مهره ای که دو خانه به جلو می رود و سپس به سمت چپ یا راست حرکت می کند همان اسب می باشد. بنابراین حرکات مهره های شطرنج Value Object می باشند.
خب وقتی ما برای حرکات مهره ها Value Object تعریف کردیم به راحتی می توانیم میلیون ها و یا میلیاردها حالات مختلف حرکت مهره های شطرنج را کنترل کنیم. مثلا پروژه از این پس می داند که مهره سرباز یک یا دو خانه به جلو حرکت می کند.
خصوصیات مهم Value Object ها چیست ؟
برای تعریف Value Object ها باید توجه کنید که یک سری قواعد و مشخصه هایی وجود دارد. از جمله :
- شناسه یا ID ندارند. در واقع در مثال شطرنج ما نمی توانیم بگوییم آی دی 2 سرباز است و آی دی 3 اسب. اشیا توسط خصوصیات آنها شناسایی می شود.
- به مقدار وابسته هستند. همچنین مقایسه دو Value Object توسط مقادیر انجام می شود. مثلا در مقایسه دو آدرس شهر و خیابان و کوچه و پلاک مقایسه می شود.
- می توانند متد داشته باشند و کارهایی درون خود انجام دهند. مثلا اگر شما Value Object برای نگهداری پول ایجاد کنید می توانید درون این Value Object متد تبدیل دلار به ریال یا ... هم پیاده سازی کرد.
- دارای چسبندگی بالا هستند.
- قابل ترکیب هستند.
- قابل تغییر نیستند. چون اگر تغییر کنند ماهیت شی از بین رفته است. به عنوان مثال می گوییم شخصی که وزن 80 کیلوگرم و قد 180 سانتیمتر دارد رضا است. حال اگر وزن 90 کیلوگرم و قد 175 سانتیمتر شد مطمینا این شخص دیگر رضا نیست.
- وظیفه validate کردن را انجام می دهند.
- قابلیت تست پذیری بالایی دارند.
مثال از Value Object
خب ببینید من نمی خوام در اینجا مثال از پیاده سازی کامل یک Value Object رو براتون بیارم. توی این لینک مثال کاملی از پیاده سازی Value Object هست که می تونید انجام بدید. یکی از Value Object های خیلی پر کاربرد که شاید خیلی هم استفاده کردید DateTime هست. در واقع وقتی شما تاریخ و زمان رو نگهداری می کنید در یک متغیر DateTime اون متغیر یک Value Object هست.
دلیل این امر هم واضح هست. متغیر DateTime آی دی نداره و برای مقایسه دو تاریخ مستقیم خود 2 تاریخ رو مقایسه می کنید.
دارای متدهای مختلفی مثل افرودن روز، ماه، سال یا بدست آوردن ثانیه، دقیقه و ... هست.
قابل تغییر نیست به این شکل که اگر هم شما تغییر بدید دیگه زمان کامل تغییر کرده و ماهیت زمان از بین رفته.
اعتبار سنجی رو انجام میده. یعنی شما نمی تونید یک عدد رو به جای زمان قرار بدید یا یک string.
امیدوارم تونسته باشم مفهوم Value Object رو براتون جا بندازم.
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- نمایش صفحه در پنجره جدید با کلیک روی لینک (تگ a) در Asp
- افزودن مقادیر به صورت دستی به List دریافت شده از ریپازیتوری
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول