Encapsulation و کنترل دسترسی
Encapsulation و کنترل دسترسی
بخشی از آموزش جامع C# و .NET 10
محتوای درس Encapsulation و کنترل دسترسی
Encapsulation جزئیات داخلی Type را پنهان و یک API کنترلشده برای استفاده از آن ارائه میکند. Access Modifierها و Propertyها ابزار اصلی اعمال این اصل هستند.
۱. Access Modifierها
public دسترسی عمومی، private دسترسی داخلی Type، protected دسترسی Type و فرزندان و internal دسترسی داخل Assembly را مشخص میکند.
مثال
class Account { private decimal _balance; public decimal Balance=>_balance; }در این مثال، مفهوم «Access Modifierها» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۲. Property
Property میتواند Getter و Setter متفاوت، Validation و سطح دسترسی مستقل برای Setter داشته باشد.
مثال
class Product { public decimal Price {get; private set;} public void SetPrice(decimal p)=>Price=p; }در این مثال، مفهوم «Property» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۳. Auto Property
برای وضعیت ساده میتوان از Auto Property استفاده کرد و در صورت نیاز بعداً منطق کنترل را بدون تغییر API اضافه کرد.
مثال
class Product { public decimal Price {get; private set;} public void SetPrice(decimal p)=>Price=p; }در این مثال، مفهوم «Auto Property» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۴. init
init اجازه میدهد Property در زمان ساخت Object مقداردهی شود اما پس از آن تغییر نکند.
مثال
record Profile { public required string Name {get;init;} }
var p=new Profile{Name="Sara"};در این مثال، مفهوم «init» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۵. Invariant
Type باید قواعد اعتبار داخلی خود را حفظ کند و اجازه ندهد مصرفکننده بهسادگی آن را وارد وضعیت نامعتبر کند.
مثال
class Stock { public int Qty{get;private set;} public void Add(int n){ if(n<=0) throw new ArgumentOutOfRangeException(); Qty+=n;} }در این مثال، مفهوم «Invariant» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۶. مثالهای عملی
public class BankAccount
{
public decimal Balance { get; private set; }
public void Deposit(decimal amount)
{
if (amount <= 0)
throw new ArgumentOutOfRangeException(nameof(amount));
Balance += amount;
}
}این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
public class User
{
public required string Name { get; init; }
public string? Email { get; init; }
}این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
۷. خطاهای رایج
• Setter عمومی برای هر Property بدون نیاز
• افشای Collection داخلی قابل تغییر
• قرار دادن Validation فقط در UI و رها کردن Model
۸. نکات اجرایی
• نامها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.
• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.
• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.
۹. تمرین عملی
کلاس InventoryItem طراحی کنید که موجودی فقط از طریق متدهای Increase و Decrease تغییر کند و هیچگاه منفی نشود.
۱۰. جمعبندی
در این فصل، مبانی «Encapsulation و کنترل دسترسی» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.