مفهوم کپسوله‌سازی در برنامه‌نویسی شی‌گرا چیست

خلاصه
1404/08/28

کپسوله‌سازی (Encapsulation) یکی از چهار مفهوم اصلی برنامه‌نویسی شیءگرا (OOP) است (به همراه وراثت، چندریختی و انتزاع). به طور خلاصه، کپسوله‌سازی به معنای **پنهان کردن داده‌ها و

مفهوم کپسوله‌سازی در برنامه‌نویسی شی‌گرا چیست

کپسوله‌سازی (Encapsulation) یکی از چهار مفهوم اصلی برنامه‌نویسی شیءگرا (OOP) است (به همراه وراثت، چندریختی و انتزاع). به طور خلاصه، کپسوله‌سازی به معنای **پنهان کردن داده‌ها و روش‌های داخلی یک کلاس از دنیای بیرون و در عین حال ارائه یک رابط (interface) مشخص برای دسترسی و تعامل با آن داده‌ها و روش‌ها است.**

**به عبارت دیگر:**

* **بسته‌بندی:** کپسوله‌سازی به معنای بسته‌بندی داده‌ها (attributes یا fields) و روش‌ها (methods) که بر روی آن داده‌ها عمل می‌کنند، در داخل یک واحد واحد به نام کلاس است.
* **پنهان‌سازی (Data Hiding):** کپسوله‌سازی به معنای مخفی کردن جزئیات پیاده‌سازی داخلی یک کلاس از دید کاربران خارجی است. این کار با استفاده از سطوح دسترسی (access modifiers) مانند `private`، `protected` و `public` انجام می‌شود.
* **کنترل دسترسی:** کپسوله‌سازی به شما امکان می‌دهد کنترل کنید که کدام بخش‌های کلاس در دسترس دنیای بیرون باشند و کدام بخش‌ها فقط برای استفاده داخلی طراحی شده‌اند.

**چرا کپسوله‌سازی مهم است؟**

* **افزایش امنیت:** با پنهان کردن داده‌های حساس و جلوگیری از دسترسی مستقیم به آن‌ها، می‌توان از تغییرات ناخواسته یا مخرب در وضعیت شیء جلوگیری کرد.
* **بهبود قابلیت نگهداری:** تغییرات در پیاده‌سازی داخلی یک کلاس (که به خوبی کپسوله‌سازی شده است) نباید بر کد خارجی که از آن کلاس استفاده می‌کند تأثیر بگذارد، زیرا رابط (interface) ثابت باقی می‌ماند.
* **افزایش قابلیت استفاده مجدد:** کلاس‌های کپسوله‌شده را می‌توان به راحتی در پروژه‌های دیگر مورد استفاده مجدد قرار داد، زیرا جزئیات پیاده‌سازی آن‌ها از دید کاربر پنهان است.
* **کاهش پیچیدگی:** با مخفی کردن جزئیات غیرضروری، کد خواناتر و قابل فهم‌تر می‌شود.

**مثال:**

فرض کنید کلاسی به نام `BankAccount` دارید که نشان‌دهنده یک حساب بانکی است.

* `balance` (موجودی حساب) یک attribute مهم است که باید محافظت شود.
* `deposit()` (واریز وجه) و `withdraw()` (برداشت وجه) methodهایی هستند که بر روی `balance` عمل می‌کنند.

با استفاده از کپسوله‌سازی، می‌توانیم `balance` را به عنوان `private` تعریف کنیم و از دسترسی مستقیم به آن از بیرون کلاس جلوگیری کنیم. به جای آن، می‌توانیم `deposit()` و `withdraw()` را به عنوان `public` تعریف کنیم و از طریق این methodها به `balance` دسترسی کنترل شده داشته باشیم.

**کد نمونه (فرضی):**

```python
class BankAccount:
def __init__(self, account_number, initial_balance):
self.__account_number = account_number # private attribute
self.__balance = initial_balance # private attribute

def deposit(self, amount):
if amount > 0:
self.__balance += amount
print(f"مبلغ {amount} واریز شد. موجودی جدید: {self.__balance}")
else:
print("مبلغ واریزی نامعتبر است.")

def withdraw(self, amount):
if amount > 0 and amount <= self.__balance:
self.__balance -= amount
print(f"مبلغ