فصل 15 از 40 درس 1 از 1

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 و کنترل دسترسی» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.