دوره‌ها / JAVA / کپسوله‌سازی (Java Encapsulation)

کپسوله‌سازی (Java Encapsulation)

15 دقیقه Article

کپسوله‌سازی (Encapsulation): مخفی‌سازی هوشمند 🛡️🔐

کپسوله‌سازی یکی از مهم‌ترین مفاهیم در برنامه‌نویسی شیءگراست. به زبان ساده، یعنی مخفی کردن داده‌های حساس از دیدِ مستقیمِ دنیای بیرون و محدود کردن دسترسی به آن‌ها فقط از طریق متدهای خاص.

۱. چرا کپسوله‌سازی؟

  • امنیت داده‌ها: هیچ‌کس نمی‌تواند مستقیماً مقدار یک متغیر را خراب کند.
  • کنترل بیشتر: شما می‌توانید ورودی‌ها را قبل از ذخیره‌سازی چک کنید (Validation).
  • انعطاف در تغییر: اگر بخواهید نحوه ذخیره داده را عوض کنید، کدهایی که از کلاس شما استفاده می‌کنند نیازی به تغییر ندارند.

۲. چطور پیاده‌سازی کنیم؟

برای کپسوله‌سازی دو گام اصلی برمی‌داریم:

  1. متغیرهای کلاس را private تعریف می‌کنیم.
  2. متدهای get و set (اصطلاحاً Getter & Setter) را برای دسترسی به آن‌ها می‌سازیم.

مثال Getter و Setter:

{code_block('public class Person {\n private String name; // مخفی\n\n public String getName() { return name; }\n\n public void setName(String newName) {\n if(newName != null) { this.name = newName; }\n }\n}')}
this: کلمه کلیدی this به شیءِ فعلی اشاره می‌کند و برای متمایز کردن متغیر کلاس از پارامترِ متد استفاده می‌شود.
نکته امنیتی: تصور کنید متغیر balance در یک کلاس بانکی public باشد! هر کسی می‌تواند آن را 0 کند. با کپسوله‌سازی، شما فقط اجازه می‌دهید از طریق متد deposit پول واریز شود.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: معماری سیستم‌های شیءگرا 🏗️💎

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

۱. کد تمیز و اصل ابزارمندی (Abstraction)

در پروژه‌های بزرگ صنعتی، ما سعی می‌کنیم تا حد امکان وابستگی‌ها (Dependencies) را کاهش دهیم. استفاده درست از Interface و Abstract Class باعث می‌شود کدهای ما انعطاف‌پذیر باشند. به قولی: "برنامه‌نویسی برای اینترفیس، نه برای پیاده‌سازی".

۲. مدیریت پکیج‌ها و جلوگیری از تداخل

پکیج‌بندی حرفه‌ای فقط برای نظم نیست؛ بلکه برای کنترلِ Visibility است. با استفاده درست از سطوح دسترسی (مثل protected و default) در سطح پکیج، می‌توانید از دسترسی‌های غیرمجاز به متدهای داخلی کلاس‌ها جلوگیری کنید.

۳. ترکیب به جای وراثت (Composition over Inheritance)

وراثت (Inheritance) ابزار قدرتمندی است، اما استفاده بیش از حد از آن باعث ایجاد "زنجیره‌های سفت‌وسخت" (Tight Coupling) می‌شود. در بسیاری از موارد، استفاده از ترکیب (داشتنِ یک شیء داخل شیء دیگر) راه‌حل منعطف‌تری برای گسترشِ کدهای شماست.

نکته پایانی: هدف از یادگیری این مفاهیمِ پیشرفته، نوشتن کدی است که نه تنها امروز کار کند، بلکه سال‌ها بعد هم به راحتی قابل تغییر و توسعه باشد.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

پیاده‌سازی Setter ایمن Medium
سوال تمرین

در کلاس Account، متغیر balance را کپسوله کنید. یک متد setBalance بنویسید که فقط اگر عدد ورودی مثبت بود، مقدار را ذخیره کند.

پاسخ تمرین
JAVA
class Account {
  private int balance;
  
  public int getBalance() {
    return balance;
  }
  
  public void setBalance(int b) {
    if (b >= 0) {
      balance = b;
    }
  }
}

public class Main {
  public static void main(String[] args) {
    Account myAcc = new Account();
    myAcc.setBalance(100);
    myAcc.setBalance(-50);
    System.out.println(myAcc.getBalance());
  }
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.