Record چیست؟ آشنایی با Record در برنامهنویسی C#
فرض کنید در حال ساخت یک فروشگاه اینترنتی هستید. هر محصول اطلاعاتی مانند نام، قیمت، شناسه و موجودی دارد. حالا تصور کنید میخواهید اطلاعات یک محصول را ذخیره کنید، آن را به بخش دیگری از برنامه بفرستید یا با محصول دیگری مقایسه کنید.
در زبان C# میتوانید برای این کار از کلاسها (Class) استفاده کنید؛ اما آیا میدانستید راه سادهتری هم برای نگهداری چنین اطلاعاتی وجود دارد؟
یکی از قابلیتهای کاربردی زبان C#، نوع دادهای به نام Record است که به شما کمک میکند دادهها را با کد کمتر و مقایسه سادهتر مدیریت کنید.
اما Record دقیقاً چیست؟ چه تفاوتی با Class دارد و در چه پروژههایی به کار میآید؟
Record چیست؟
به زبان ساده، Record نوعی داده در برنامهنویسی است که برای نگهداری اطلاعات و مقایسه آنها بر اساس مقدارشان طراحی شده است.
در زبان C#، از Record میتوان برای نمایش اطلاعاتی مانند مشخصات کاربر، جزئیات سفارش، اطلاعات محصول یا نتیجه یک درخواست API استفاده کرد.
برای مثال، فرض کنید یک اپلیکیشن فروشگاهی دارید و میخواهید اطلاعات یک سفارش را نگهداری کنید. این اطلاعات ممکن است شامل شماره سفارش، نام مشتری و مبلغ پرداختی باشد.
بهجای اینکه برای تعریف و مدیریت این دادهها کدهای زیادی بنویسید، میتوانید از Record استفاده کنید و ساختار اطلاعات را سادهتر بسازید.
البته توجه داشته باشید که Record در همه زبانهای برنامهنویسی دقیقاً به یک معنا نیست. در C#، منظور از record یک قابلیت مشخص زبان است؛ اما در مفاهیمی مانند پایگاه داده، واژه Record معمولاً به یک رکورد یا مجموعهای از اطلاعات مرتبط اشاره میکند.
در ادامه، منظور ما از Record بیشتر همان قابلیت زبان C# است.
یک مثال ساده از Record در دنیای واقعی
فرض کنید در حال ساخت یک اپلیکیشن سفارش غذا هستید. هر سفارش شامل اطلاعاتی مانند شماره سفارش، نام غذا و قیمت آن است.
برای نمایش این اطلاعات میتوانیم یک Record به شکل زیر تعریف کنیم:
public record Order(int Id, string FoodName, decimal Price);
در این مثال، یک Record به نام Order ساختهایم که سه ویژگی دارد:
Id: شماره سفارش
FoodName: نام غذا
Price: قیمت غذا
حالا میتوانیم از این Record برای ساخت یک سفارش استفاده کنیم:
var order = new Order(101, "پیتزا", 250000);
Console.WriteLine(order.FoodName);
خروجی برنامه به شکل زیر خواهد بود:
پیتزا
همانطور که میبینید، با چند خط کد توانستیم ساختاری برای نگهداری اطلاعات سفارش تعریف کنیم و از آن در برنامه استفاده کنیم.
نکته مهم این است که مقدار 250000 در این مثال صرفاً یک قیمت فرضی است و نوع داده decimal برای نمایش مقادیر عددی مانند قیمتها مناسب است.
چرا Record در C# اهمیت دارد؟
یکی از مشکلاتی که برنامهنویسان هنگام توسعه نرمافزار با آن روبهرو میشوند، نوشتن کدهای تکراری برای تعریف و مدیریت دادههاست.
برای مثال، اگر بخواهید یک کلاس ساده برای نگهداری اطلاعات مشتری بسازید، ممکن است لازم باشد ویژگیها، سازنده کلاس و در بعضی شرایط متدهایی برای مقایسه اشیا را تعریف کنید.
Record بسیاری از این کارها را سادهتر میکند.
این قابلیت از نسخه C# 9 معرفی شد و بهخصوص برای موقعیتهایی مفید است که هدف اصلی شما نگهداری و انتقال دادههاست، نه مدیریت رفتارهای پیچیده یک شیء.
از جمله کاربردهای آن میتوان به موارد زیر اشاره کرد:
نگهداری اطلاعات کاربران و مشتریان
نمایش جزئیات محصولات و سفارشها
انتقال اطلاعات بین بخشهای مختلف برنامه
تعریف مدلهای مورد استفاده در APIها
نگهداری نتیجه عملیات یا محاسبات
مقایسه دادههایی که مقادیر یکسانی دارند
البته Record جایگزین تمام کلاسها نیست و انتخاب آن به نیازهای پروژه بستگی دارد.
مهمترین ویژگی Record؛ مقایسه بر اساس مقدار
یکی از تفاوتهای مهم Record با کلاس معمولی در C#، نحوه مقایسه نمونههای آن است.
برای درک بهتر، تصور کنید دو سفارش مختلف در برنامه دارید که شماره، نام غذا و قیمت آنها کاملاً یکسان است.
آیا این دو سفارش از نظر اطلاعات با یکدیگر برابرند؟
در بسیاری از موقعیتها، پاسخ مثبت است. اگر هدف ما مقایسه اطلاعات سفارشها باشد، مهم است که مقادیر آنها را بررسی کنیم، نه اینکه صرفاً ببینیم آیا هر دو متغیر به یک شیء واحد اشاره میکنند یا خیر.
در C#، Record بهصورت پیشفرض از مقایسه مبتنی بر مقدار پشتیبانی میکند.
برای مثال:
var order1 = new Order(101, "پیتزا", 250000);
var order2 = new Order(101, "پیتزا", 250000);
Console.WriteLine(order1 == order2);
خروجی:
True
چرا؟
چون هر دو Record از یک نوع هستند و مقادیر ویژگیهای آنها برابر است.
اگر همین مثال را با دو نمونه از یک کلاس معمولی که مقایسه بر اساس مرجع را حفظ کرده است انجام دهیم، نتیجه مقایسه با == معمولاً False خواهد بود؛ زیرا دو شیء جداگانه ساختهایم.
این ویژگی Record در موقعیتهایی مانند مقایسه اطلاعات دریافتی از API، بررسی تغییرات دادهها و نوشتن تستهای نرمافزاری بسیار کاربردی است.
تفاوت Record و Class چیست؟
هر دو Record و Class برای تعریف انواع داده در C# استفاده میشوند؛ اما هدف طراحی آنها یکسان نیست.
بهطور کلی، کلاسها برای مدلسازی اشیایی با دادهها و رفتارهای مختلف کاربرد دارند. در مقابل، Record برای نمایش دادههایی طراحی شده است که مقادیر آنها اهمیت زیادی دارد.
برای مثال، در یک سامانه فروشگاهی:
کلاس ShoppingCart میتواند مسئول افزودن و حذف محصولات از سبد خرید باشد.
Record به نام ProductInfo میتواند اطلاعات یک محصول را برای نمایش یا انتقال به بخش دیگری از برنامه نگهداری کند.
تفاوتهای مهم این دو عبارتاند از:
۱. نحوه مقایسه
Record بهصورت پیشفرض بر اساس مقادیر اعضای خود مقایسه میشود؛ اما کلاس معمولی معمولاً بر اساس هویت یا مرجع شیء مقایسه میشود، مگر اینکه رفتار مقایسه آن را تغییر دهید.
۲. میزان کدنویسی
برای تعریف دادههایی که ویژگیهای مشخصی دارند، Record میتواند کدهای تکراری را کاهش دهد؛ بهخصوص زمانی که از شکل موقعیتی آن استفاده میکنید.
۳. تغییرپذیری دادهها
Recordهای تعریفشده با ویژگیهای موقعیتی، معمولاً برای نگهداری دادههایی استفاده میشوند که قرار نیست بهسادگی تغییر کنند. بااینحال، Record ذاتاً همیشه تغییرناپذیر نیست و میتوان ویژگیهای قابلتغییر نیز در آن تعریف کرد.
۴. کاربرد در پروژه
اگر میخواهید یک موجودیت با رفتارها و مسئولیتهای پیچیده بسازید، کلاس میتواند انتخاب مناسبی باشد. اگر هدف اصلی شما نمایش و انتقال دادهها و مقایسه آنها بر اساس مقدار است، Record اغلب گزینه خوبی خواهد بود.
آیا اطلاعات یک Record قابل تغییر است؟
یکی از نکات مهم درباره Record این است که نباید آن را با یک شیء کاملاً تغییرناپذیر اشتباه بگیریم.
در شکل موقعیتی رایج Record در C#، ویژگیها معمولاً از نوع init هستند. یعنی میتوانید مقدار آنها را هنگام ساخت شیء یا در مرحله مقداردهی اولیه تنظیم کنید، اما پس از پایان این مرحله نمیتوانید بهسادگی مقدارشان را دوباره تغییر دهید.
برای مثال:
public record User(string Name, int Age);
var user = new User("علی", 20);
در این مثال، اطلاعات کاربر هنگام ساخت Record مشخص شدهاند.
اگر بخواهیم نسخهای جدید از همین کاربر با سن متفاوت بسازیم، میتوانیم از قابلیت with استفاده کنیم:
var updatedUser = user with { Age = 21 };
اکنون updatedUser یک Record جدید با سن ۲۱ است و مقدار user.Age همچنان ۲۰ باقی میماند.
این روش زمانی مفید است که بخواهید نسخه جدیدی از دادهها ایجاد کنید، بدون اینکه نمونه اولیه را تغییر دهید.
البته این رفتار به نحوه تعریف اعضای Record بستگی دارد و اگر اعضای قابلتغییر یا اشیای داخلی تغییرپذیر داشته باشید، لزوماً تمام دادههای داخلی آن تغییرناپذیر نخواهند بود.
Record در پروژههای واقعی چه کاربردی دارد؟
حالا که با مفهوم Record آشنا شدیم، بهتر است ببینیم این قابلیت در پروژههای واقعی چگونه به کار میرود.
۱. توسعه Web API
فرض کنید یک Web API اطلاعات محصولات را از سرور دریافت میکند و باید آنها را به بخش دیگری از برنامه بفرستد. میتوانید با تعریف یک Record، ساختار اطلاعات موردنیاز را مشخص کنید.
۲. ساخت نرمافزارهای فروشگاهی
در نرمافزارهای فروشگاهی، اطلاعاتی مانند جزئیات سفارش، قیمت نهایی، کد تخفیف و اطلاعات ارسال را میتوان در قالب Record نمایش داد.
۳. مدیریت اطلاعات کاربران
هنگام انتقال اطلاعات کاربران بین بخشهای مختلف نرمافزار، Record میتواند ساختاری مشخص و خوانا برای نگهداری دادهها فراهم کند.
۴. تست نرمافزار
از آنجا که Recordها بر اساس مقدار مقایسه میشوند، بررسی برابر بودن دادههای مورد انتظار و دادههای واقعی در تستها میتواند سادهتر شود.
۵. توسعه برنامههای مدرن با .NET
در پروژههای جدید C# و .NET، Record یکی از ابزارهای مفید برای تعریف مدلهای دادهای است؛ بهخصوص زمانی که خوانایی کد، کاهش کدهای تکراری و مقایسه دقیق دادهها اهمیت دارد.
البته استفاده از Record به معنی بهتر شدن خودکار عملکرد یا امنیت برنامه نیست. انتخاب درست نوع داده باید بر اساس ساختار و نیاز واقعی پروژه انجام شود.
Record در پایگاه داده چه معنایی دارد؟
تا اینجا درباره Record در زبان C# صحبت کردیم؛ اما ممکن است هنگام یادگیری SQL یا مفاهیم پایگاه داده نیز با این واژه روبهرو شوید.
در پایگاه داده، Record معمولاً به یک مجموعه از اطلاعات مرتبط اشاره دارد که در یک ردیف جدول ذخیره شدهاند.
برای مثال، فرض کنید جدولی به نام Students داریم که اطلاعات هنرجویان یک آموزشگاه را نگهداری میکند.
هر ردیف این جدول میتواند شامل شناسه هنرجو، نام، نام خانوادگی و شماره تماس باشد. در این مفهوم، هر ردیف را میتوان یک Record در نظر گرفت.
بنابراین، اگر در حال یادگیری SQL Server هستید، بهتر است این تفاوت را به خاطر بسپارید:
در C#، record یک قابلیت برای تعریف نوع داده است؛ اما در پایگاه داده، Record معمولاً به یک مجموعه اطلاعات ذخیرهشده در یک ردیف اشاره دارد.
این دو مفهوم به نگهداری و سازماندهی دادهها مربوطاند، اما یکسان نیستند.
جمعبندی
Record یکی از قابلیتهای کاربردی زبان C# است که برای تعریف و نگهداری دادهها با کدنویسی سادهتر طراحی شده است. این قابلیت بهویژه زمانی مفید است که بخواهید اطلاعاتی مانند مشخصات کاربر، جزئیات سفارش یا دادههای دریافتی از API را نمایش دهید و بر اساس مقادیرشان مقایسه کنید.
مهمترین مزیت Record، پشتیبانی پیشفرض از مقایسه مبتنی بر مقدار و کاهش کدهای تکراری در تعریف برخی مدلهای داده است. همچنین قابلیتهایی مانند with امکان ساخت نسخه جدیدی از دادهها را بدون تغییر نمونه اولیه فراهم میکنند.
بااینحال، Record همیشه جایگزین Class نیست و انتخاب بین آنها به نیاز پروژه بستگی دارد.
اگر قصد دارید برنامهنویسی C# و توسعه نرمافزارهای تحت وب را یاد بگیرید، آشنایی با مفاهیمی مانند Record، Class، Object و انواع داده به شما کمک میکند کدهایی خواناتر و ساختارمندتر بنویسید.
فرایانه؛ جایی که مفاهیم پیچیده برنامهنویسی را به زبان ساده، کاربردی و قابل فهم آموزش میدهیم. 💚