کپسولهسازی (Encapsulation) چیست؟
کپسولهسازی یا Encapsulation یکی از چهار اصل مهم برنامهنویسی شیگرا (OOP) است. هدف اصلی این مفهوم، مخفی کردن اطلاعات داخلی یک کلاس و کنترل نحوه دسترسی به آنها است.
به بیان ساده، در کپسولهسازی دادهها (Fields) و عملیات مرتبط با آنها (Methods و Properties) داخل یک کلاس قرار میگیرند و دسترسی مستقیم به اطلاعات حساس محدود میشود. به این ترتیب تنها از طریق متدها یا Propertyهایی که برنامهنویس تعریف کرده است، امکان خواندن یا تغییر اطلاعات وجود دارد.
این کار باعث میشود کلاسها امنتر، قابل اعتمادتر و نگهداری آنها آسانتر باشد.
چرا از کپسولهسازی استفاده میکنیم؟
اگر تمام متغیرهای یک کلاس به صورت Public باشند، هر بخش از برنامه میتواند آنها را تغییر دهد. این موضوع ممکن است باعث ایجاد دادههای نامعتبر و بروز خطاهای متعدد شود.
کپسولهسازی کمک میکند:
- از تغییرات غیرمجاز جلوگیری شود.
- اعتبار دادهها بررسی شود.
- وابستگی بخشهای مختلف برنامه کاهش پیدا کند.
- توسعه و نگهداری پروژه آسانتر شود.
- امنیت اطلاعات افزایش یابد.
کپسولهسازی در C# چگونه پیادهسازی میشود؟
در زبان C# معمولاً برای پیادهسازی کپسولهسازی از سه ابزار استفاده میشود:
- Access Modifierها
- Propertyها
- متدهای عمومی
رایجترین روش این است که فیلدها را Private تعریف کنیم و از طریق Property یا Method به آنها دسترسی داشته باشیم.
مثال اول: بدون کپسولهسازی
public class User
{
public int Age;
}
User user = new User();
user.Age = -20;
در مثال بالا هیچ محدودیتی وجود ندارد و حتی مقدار منفی نیز قابل ثبت است.
مثال دوم: استفاده از کپسولهسازی
public class User
{
private int _age;
public int Age
{
get => _age;
set
{
if (value >= 0)
_age = value;
}
}
}
حالا فقط مقادیر معتبر در شیء ذخیره میشوند.
استفاده از Propertyهای خودکار
در بسیاری از مواقع نیازی به نوشتن فیلد خصوصی نیست.
public class Product
{
public string Name { get; set; }
public decimal Price { get; private set; }
public Product(decimal price)
{
Price = price;
}
}
در این مثال مقدار Price فقط داخل کلاس قابل تغییر است و سایر بخشهای برنامه فقط میتوانند آن را مشاهده کنند.
استفاده از متد برای کنترل عملیات
گاهی لازم است تغییر مقدار فقط از طریق یک عملیات مشخص انجام شود.
public class BankAccount
{
private decimal _balance;
public decimal Balance => _balance;
public void Deposit(decimal amount)
{
if (amount > 0)
_balance += amount;
}
public bool Withdraw(decimal amount)
{
if (amount <= 0 || amount > _balance)
return false;
_balance -= amount;
return true;
}
}
در این طراحی هیچ بخشی از برنامه نمیتواند موجودی حساب را مستقیماً تغییر دهد.
Access Modifierهای پرکاربرد
| سطح دسترسی | توضیح |
|---|---|
| public | قابل دسترسی از همه جا |
| private | فقط داخل همان کلاس |
| protected | داخل کلاس و کلاسهای مشتق شده |
| internal | داخل همان اسمبلی |
| protected internal | ترکیبی از protected و internal |
| private protected | فقط کلاس مشتق شده در همان اسمبلی |
مزایای کپسولهسازی
- افزایش امنیت دادهها
کاربر کلاس نمیتواند اطلاعات حساس را مستقیماً تغییر دهد. - جلوگیری از دادههای نامعتبر
اعتبارسنجی قبل از ذخیره اطلاعات انجام میشود. - کاهش وابستگی
ساختار داخلی کلاس قابل تغییر است بدون اینکه کدهای دیگر دچار مشکل شوند. - نگهداری آسانتر
اشکالیابی و توسعه پروژه سادهتر خواهد بود. - خوانایی بیشتر
کلاسها رفتار مشخص و قابل پیشبینی خواهند داشت.
تفاوت Field و Property
Field محل نگهداری داده است، اما Property واسطهای برای کنترل دسترسی به آن داده محسوب میشود.
به همین دلیل در اکثر پروژههای حرفهای توصیه میشود فیلدها Private باشند و دسترسی از طریق Property انجام شود.
اشتباهات رایج
- تعریف تمام فیلدها به صورت Public
- عدم اعتبارسنجی دادهها
- استفاده نکردن از Property
- تغییر مستقیم وضعیت داخلی کلاس از بیرون
چه زمانی از کپسولهسازی استفاده کنیم؟
تقریباً در تمام کلاسهای دامنه (Domain Models)، موجودیتهای Entity Framework، سرویسها و پروژههای بزرگ از کپسولهسازی استفاده میشود. این اصل یکی از پایههای طراحی نرمافزارهای قابل توسعه و قابل نگهداری است.
جمعبندی
کپسولهسازی یکی از مهمترین اصول شیگرایی در زبان C# است که باعث محافظت از دادهها، جلوگیری از ورود اطلاعات نامعتبر و افزایش کیفیت طراحی نرمافزار میشود. با استفاده از Access Modifierها، Propertyها و متدهای کنترلشده میتوان کلاسهایی ساخت که هم امنتر باشند و هم توسعه آنها در آینده بسیار سادهتر انجام شود. رعایت این اصل در پروژههای کوچک و بزرگ، کدی تمیزتر، پایدارتر و حرفهایتر ایجاد خواهد کرد.
ثبت دیدگاه
0 دیدگاه