پاسخ هوش مصنوعی
مفهوم Value Object در برنامه نویسی به اشیایی اشاره دارد که تنها به داده ها (مقدارها) وابسته هستند و نه به هویت. این اشیاء معمولاً به عنوان مجموعه ای از ویژگی ها یا داده ها تعریف می شوند که برای نمایش یک مقدار خاص طراحی شده اند.
ویژگی های اصلی Value Object عبارتند از:
- عدم وجود هویت: Value Object ها هویت جداگانه ای ندارند و می توانند بر اساس مقادیرشان مقایسه شوند.
- غیر قابل تغییر: بسیاری از Value Object ها به گونه ای طراحی می شوند که بعد از ایجاد قابل تغییر نباشند (immutable), به این معنی که هر بار که بخواهید مقداری را تغییر دهید، باید یک نمونه جدید ایجاد کنید.
- کاربردی: Value Object ها معمولاً برای نمایندگی اطلاعاتی مانند تاریخ، زمان، آدرس، یا سایر داده های عددی و متنی استفاده می شوند.
به عنوان مثال، فرض کنید که یک کلاس برای نمایندگی یک نقطه در فضا داریم. این کلاس می تواند شامل مختصات X و Y باشد و به طور کلی به عنوان Value Object عمل می کند:
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Point)) return false;
Point other = (Point) obj;
return x == other.x && y == other.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
در این مثال، دو نقطه با مختصات مشابه برابر در نظر گرفته می شوند، زیرا هویت ندارند و تنها بر اساس مقادیر خود مقایسه می شوند.
در کل، Value Object ها در طراحی نرم افزار مفید هستند زیرا می توانند به سادگی و بهینه سازی کد کمک کنند و از بروز اشکالاتی مانند ناهماهنگی در داده ها جلوگیری کنند.
مفهوم 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 رو براتون جا بندازم.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول