پس از اینکه در درس قبلی با مفهوم کلاس و شیء آشنا شدید، در این جلسه میخواهم درباره اولین رکن از چهار رکن اصلی برنامهنویسی شیءگرا توضیحاتی بدم.
کپسولهسازی یا Encapsulation:
کپسولهسازی به معنی بستهبندی دادهها (ویژگیها) و رفتارها (متدها) توی یه
کلاس و کنترل دسترسی به اونهاست. فکر کنید مثل یه کپسول دارویی که مواد داخلش رو
محافظت میکنه و فقط از راه مشخصی (مثل خوردن) میشه بهش دسترسی داشت. یا باتری
ماشین که فقط با اتصال دو سیم میتونید ازش استفاده کنید، یا خود ماشین که با کمک
سوئیچ روشن میشه و هزاران مثال دیگه.
هدف Encapsulation در سیشارپ اینه که
دادهها رو از دسترسی یا تغییرات مستقیم و ناخواسته محافظت کنه، جزئیات داخلی
پیادهسازی رو مخفی نگه داره و دسترسی به دادهها رو فقط از طریق متدهای مشخص و
کنترلشده (مثل خواص یا متدها) فراهم کنه.
در واقع بدون کپسولهسازی، هر بخشی از کد (مثل متدها یا اشیاء دیگه) میتونه
مستقیماً به دادههای داخلی کلاس دسترسی داشته باشه و اونا رو تغییر بده. این
مسئله میتونه منجر به بروز خطاها یا رفتارهای غیرقابل پیشبینی در برنامه بشه، بهخصوص
توی پروژههای بزرگ و پیچیده که چندین توسعهدهنده روی کد کار میکنن. این اولین
قدم برای ساختن کد امن و قابل نگهداریه.
برای درک مفهوم کپسولهسازی فقط کافیه تا با مفهوم متغیرها و همچنین دو
مفهوم کلاس و شیء آشنا باشید که دو مورد آخر توی درس قبلی معرفی شدن.
چه مواقعی از کپسولهسازی در پروژه خود استفاده کنیم؟
کپسولهسازی را چگونه در پروژه خود
اعمال کنیم؟
در واقع برای این کار ابتدا از سطوح دسترسی مناسب برای جلوگیری از در دسترس
بودن برخی فیلدها و سپس استفاده از پراپرتیهای
(get/set)
برای خواندن و تغییر این فیلدها و همچنین استفاده از متدها برای تغییر یا
مشاهده قاعدهمند دادهها استفاده میکنیم. این یعنی اینکه ما دسترسی به فیلدها رو
محدود و طبق شرایط خاص مجاز کردیم.
مثال عملی: حساب بانکی
فرض کنید یه کلاس برای حساب بانکی داریم. میخواهیم موجودی حساب رو کنترل
کنیم تا مستقیم تغییر نکنه و منفی هم نشه. اینجوری کپسولهسازی پیاده سازی میشه:
public class BankAccount
{
private decimal _balance; // موجودی حساب مخفی شده
public decimal Balance // پراپرتی برای دسترسی کنترلشده
{
get { return _balance; }
set
{
if (value >= 0) // قانون: موجودی نمیتونه منفی باشه
_balance = value;
}
}
public void Deposit(decimal amount) // متد برای تغییر قاعدهمند
{
if (amount > 0)
_balance += amount;
}
}
توی این مثال، _balance با private مخفی شده و فقط از طریق پراپرتی Balance یا متد Deposit میشه بهش دسترسی داشت. اینجوری مطمئنیم که موجودی حساب طبق قوانین مشخص تغییر میکنه.