یاد بگیرید که چگونه می توانید از اشیاء ارزشی در سی شارپ برای بهبود وضوح، ساختار و قابلیت نگهداری کد خود استفاده کنید.
در زبان برنامه نویسی سی شارپ، یک شی می تواند یک نوع مقدار یا یک نوع مرجع باشد. در حالی که یک شی یک شی یک شی است، تفاوت بین انواع ارزش و انواع مرجع به ماهیت متغیرهای آنها برمی گردد. یک متغیر از یک نوع مقدار حاوی یک شی یا یک نمونه از نوع است. یک متغیر از نوع مرجع حاوی ارجاع به یک شی یا ارجاع به نمونه ای از نوع است.
C# همچنین به ما امکان میدهد چیزی به نام اشیاء ارزش ایجاد کنیم، نوع خاصی از شیء مورد استفاده در طراحی دامنه محور که به ما امکان میدهد مفاهیم دامنه را به سادگی، واضح و مختصر بیان کنیم. در این مقاله ما اشیاء ارزشی را بررسی میکنیم، مزایای آنها را مورد بحث قرار میدهیم و نحوه استفاده از آنها را در سی شارپ نشان میدهیم.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را برای ایجاد یک پروژه برنامه کاربردی کنسول هسته دات نت دنبال کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی”، “.NET 8.0 (پشتیبانی طولانی مدت)” را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
- قطعههای انتخاب «از بیانیههای سطح بالا استفاده نکنید» و «فعال کردن انتشار بومی AOT» را علامت نگذارید.
- روی ایجاد کلیک کنید.
ما از این پروژه برنامه کاربردی کنسول NET 8 برای کار با اشیاء ارزش در بخشهای بعدی این مقاله استفاده خواهیم کرد.
اشیاء ارزش در سی شارپ چیست؟
در زبان سی شارپ، یک شیء ارزشی به عنوان یک شی تعریف میشود که فقط با وضعیت خصوصیات آن قابل شناسایی است. اشیاء ارزشی یک جنبه توصیفی از یک دامنه را بدون داشتن هویت نشان می دهند. به عبارت دیگر، اشیاء ارزشی عناصری از طراحی را نشان می دهند که ما فقط از نظر محتوای آنها به آنها اهمیت می دهیم، نه هویت آنها.
در طراحی دامنه محور (DDD)، الگوی شی ارزش اشیاء بدون هویت را نشان می دهد و از برابری بر اساس ویژگی های آنها پشتیبانی می کند. در اینجا باید توجه داشت که بر خلاف اشیاء ارزشی، اشیاء موجودیت دارای هویت های متمایزی هستند. بر خلاف اشیاء موجودیت، که با هویت خود تعریف می شوند و حالت تغییرپذیر دارند، اشیاء ارزش با ویژگی های خود تعریف می شوند و تغییر ناپذیر هستند.
تغییرناپذیری به این معنی است که شما نمی توانید یک شی مقدار را پس از ایجاد تغییر دهید. هر عملیاتی که بر روی اشیاء ارزشی انجام شود در عوض یک نمونه جدید ایجاد می کند. تغییرناپذیری اشیاء ارزش دارای مزایای عملکردی مهمی است. از آنجایی که دو شیء ارزشی در صورتی که دارای مقادیر یکسان باشند، برابر در نظر گرفته می شوند، حتی اگر ممکن است اشیاء متفاوتی باشند، قابل تعویض می شوند. به عبارت دیگر، تغییرناپذیری استفاده مجدد از شی را امکان پذیر می کند.
مثال یک مقدار در سی شارپ
کلاس زیر را با نام Address در نظر بگیرید که حاوی چند ویژگی و یک سازنده آرگومان است.
public class Address { public string HouseNo { get; set; } public string Street { get; set; } public string ZipCode { get; set; } public string City { get; set; } public Address(string houseno, string street, string zipCode, string city) { HouseNo = houseno; Street = street; ZipCode = zipCode; City = city; } }
می توانید نمونه ای از این کلاس ایجاد کنید و با استفاده از کد زیر مقادیری را به ویژگی های آن اختصاص دهید.
Address address = new Address("505", "Woodland Street", "CR2 8EN", "London");
اما، چون کلاس Address در اینجا تنظیم کننده های عمومی را نشان می دهد، می توانید به راحتی مقادیر ویژگی های آن را از خارج از کلاس تغییر دهید. این یکی از ویژگی های اساسی اشیاء ارزش، یعنی پشتیبانی آن از تغییرناپذیری را نقض می کند.
میتوانیم با طراحی مجدد کلاس Address همانطور که در زیر نشان داده شده است، این مشکل را برطرف کنیم.
public class Address { public string HouseNo { get; private set; } public string Street { get; private set; } public string ZipCode { get; private set; } public string City { get; private set; } public Address(string houseno, string street, string zipCode, string city) { HouseNo = houseno; Street = street; ZipCode = zipCode; City = city; } }
همانطور که در بالا مشاهده میکنید، ویژگیهای کلاس Address جدید ما حاوی تنظیمکنندههای خصوصی هستند که اجازه تغییر در مقدار هیچ یک از این ویژگیها را از خارج از کلاس نمیدهند و در نتیجه تغییر ناپذیری را حفظ میکنند. اگر این برنامه را اجرا کنید، با خطای نشان داده شده در شکل ۱ زیر مواجه خواهید شد.
شکل ۱. اشیاء ارزش تغییرناپذیر هستند.
شما همچنین می توانید اشیاء ارزش را با استفاده از رکوردهای C# پیاده سازی کنید. برای انجام این کار، از کلمه کلیدی رکورد برای تعریف یک نوع رکورد استفاده میکنید که دادهها را به همان روشی که قبلاً با کلاس Author انجام دادیم، کپسوله میکند. قطعه کد زیر نشان می دهد که چگونه می توانید نوع رکورد را در سی شارپ تعریف کنید.
public record Address(string Houseno, string Street, string ZipCode, string City);
بهترین شیوه ها برای استفاده از اشیاء ارزش در سی شارپ
هنگام کار با اشیاء ارزشی در سی شارپ، باید بهترین روشها را دنبال کنید:
- براساس ارزش، بررسیهای برابری مناسب را برای جلوگیری از ناسازگاریها و خطاها اجرا کنید.
- از اشیاء ارزشی برای نمایش مفاهیم در مدل دامنه فقط زمانی استفاده کنید که احساس می کنید مناسب است.
- از اشیاء ارزشی با احتیاط استفاده کنید زیرا دارای سربار عملکرد هستند.
- اجرای منطق اعتبارسنجی را در سازنده شی ارزش خود برای اعمال قوانین و محدودیتهای تجاری در هنگام ایجاد شی ارزش در نظر بگیرید.
- از الگوها و قراردادهای نامگذاری توصیه شده برای اطمینان از وضوح، سازگاری و خوانایی در پیاده سازی اشیاء ارزشی خود پیروی کنید.
اشیاء ارزش انواع اولیه را در خود محصور می کنند و دو ویژگی اصلی دارند، یعنی هویت ندارند و تغییر ناپذیر هستند. اشیاء ارزش می توانند ساختارهای داده پیچیده را با کپسوله کردن داده های مرتبط در یک واحد ساده کنند. این یکپارچگی داده ها را تضمین می کند، تایپ قوی را اعمال می کند، خطاها را کاهش می دهد و خوانایی کد منبع را بهبود می بخشد. شما می توانید با ارائه نمایش گویاتری از مفاهیم دامنه، از اشیاء ارزش برای افزایش وضوح و قابلیت نگهداری کد C# خود استفاده کنید.
به طور معمول، ایجاد اشیاء ارزش در سی شارپ شامل غلبه بر مقایسه برابری و اجرای معنایی مبتنی بر ارزش مناسب است. یک عمل معمولی شامل نادیده گرفتن متدهای Equals() و GetHashCode() و ارائه عملگرهای دیگر برای مقایسه است. به طور معمول، ما از یک کلاس پایه استفاده میکنیم که شامل این روشها میشود که همه پیادهسازیهای شی مقدار باید گسترش دهند.
در مثال بالا، من یک پیاده سازی اساسی از اشیاء ارزش در سی شارپ ارائه کرده ام. در پست آینده در اینجا، چگونگی پیادهسازی کلاس پایه شی مقدار و مفاهیم پیشرفتهتر را بررسی خواهم کرد.
پست های مرتبط
نحوه استفاده از اشیاء ارزش در سی شارپ
نحوه استفاده از اشیاء ارزش در سی شارپ
نحوه استفاده از اشیاء ارزش در سی شارپ