کپسولهسازی (Java Encapsulation)
کپسولهسازی (Encapsulation): مخفیسازی هوشمند 🛡️🔐
کپسولهسازی یکی از مهمترین مفاهیم در برنامهنویسی شیءگراست. به زبان ساده، یعنی مخفی کردن دادههای حساس از دیدِ مستقیمِ دنیای بیرون و محدود کردن دسترسی به آنها فقط از طریق متدهای خاص.
۱. چرا کپسولهسازی؟
- امنیت دادهها: هیچکس نمیتواند مستقیماً مقدار یک متغیر را خراب کند.
- کنترل بیشتر: شما میتوانید ورودیها را قبل از ذخیرهسازی چک کنید (Validation).
- انعطاف در تغییر: اگر بخواهید نحوه ذخیره داده را عوض کنید، کدهایی که از کلاس شما استفاده میکنند نیازی به تغییر ندارند.
۲. چطور پیادهسازی کنیم؟
برای کپسولهسازی دو گام اصلی برمیداریم:
- متغیرهای کلاس را
privateتعریف میکنیم. - متدهای
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 به شیءِ فعلی اشاره میکند و برای متمایز کردن متغیر کلاس از پارامترِ متد استفاده میشود.
balance در یک کلاس بانکی public باشد! هر کسی میتواند آن را 0 کند. با کپسولهسازی، شما فقط اجازه میدهید از طریق متد deposit پول واریز شود.
بخش تخصصی: معماری سیستمهای شیءگرا 🏗️💎
در این بخش، به مفاهیمی میپردازیم که تفاوت بین یک برنامهنویس معمولی و یک معمار نرمافزار را رقم میزند.
۱. کد تمیز و اصل ابزارمندی (Abstraction)
در پروژههای بزرگ صنعتی، ما سعی میکنیم تا حد امکان وابستگیها (Dependencies) را کاهش دهیم. استفاده درست از Interface و Abstract Class باعث میشود کدهای ما انعطافپذیر باشند. به قولی: "برنامهنویسی برای اینترفیس، نه برای پیادهسازی".
۲. مدیریت پکیجها و جلوگیری از تداخل
پکیجبندی حرفهای فقط برای نظم نیست؛ بلکه برای کنترلِ Visibility است. با استفاده درست از سطوح دسترسی (مثل protected و default) در سطح پکیج، میتوانید از دسترسیهای غیرمجاز به متدهای داخلی کلاسها جلوگیری کنید.
۳. ترکیب به جای وراثت (Composition over Inheritance)
وراثت (Inheritance) ابزار قدرتمندی است، اما استفاده بیش از حد از آن باعث ایجاد "زنجیرههای سفتوسخت" (Tight Coupling) میشود. در بسیاری از موارد، استفاده از ترکیب (داشتنِ یک شیء داخل شیء دیگر) راهحل منعطفتری برای گسترشِ کدهای شماست.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
در کلاس Account، متغیر balance را کپسوله کنید. یک متد setBalance بنویسید که فقط اگر عدد ورودی مثبت بود، مقدار را ذخیره کند.
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());
}
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.