Encapsulation یا کپسوله‌سازی یکی از مفاهیم بنیادی طراحی آبجکت‌گراست. منظور آن است که داده و عملیاتی که روی آن انجام می‌شود در یک واحد منطقی کنار هم قرار گیرند و تغییر وضعیت داخلی از مسیرهای کنترل‌شده انجام شود. هدف فقط پنهان کردن یک متغیر نیست، بلکه حفاظت از قواعدی است که آبجکت باید همواره رعایت کند.

مثال در PHP

فرض کنید موجودی کیف پول نباید منفی شود. به‌جای عمومی کردن موجودی، عملیات برداشت را در متدی قرار می‌دهیم که شرط را بررسی می‌کند.

final class Wallet
{
    public function __construct(private int $balance) {}

    public function withdraw(int $amount): void
    {
        if ($amount <= 0 || $amount > $this->balance) {
            throw new InvalidArgumentException();
        }
        $this->balance -= $amount;
    }

    public function balance(): int { return $this->balance; }
}

مثال در JavaScript

در JavaScript جدید، فیلدهایی که با علامت # تعریف شده‌اند از خارج کلاس به‌صورت مستقیم قابل دسترسی نیستند.

class Wallet {
  #balance;
  constructor(balance) { this.#balance = balance; }
  withdraw(amount) {
    if (amount <= 0 || amount > this.#balance) throw new Error("Invalid amount");
    this.#balance -= amount;
  }
  get balance() { return this.#balance; }
}

در Java و Python چه تفاوتی دارد؟

در Java می‌توان با private و متدهای عمومی دسترسی را کنترل کرد. در Python، نام‌هایی مانند _balance قرارداد رایج برای اعضای غیرعمومی هستند و __balance مکانیزم Name Mangling دارد، اما مانند private در Java یک مرز امنیتی سخت ایجاد نمی‌کند.

Encapsulation با ابسترکشن فرق دارد. کپسوله‌سازی از وضعیت و قواعد داخلی محافظت می‌کند، اما انتزاع رابط ساده و معناداری برای استفاده از قابلیت‌ها فراهم می‌کند.

برای آشنایی با امکانات جدید تعریف کلاس و پارامترها در PHP، مقاله بهبود کار با آبجکت‌ها در PHP نیز مفید است.

درک تفاوت این موضوع با کلاس و آبجکت به انتخاب راهکار مناسب‌تر کمک می‌کند.