Encapsulation


Encapsulation হলো Object-Oriented Programming (OOP)-এর একটি মূল ধারণা, যার মাধ্যমে একটি অবজেক্টের ডাটা (fields) এবং সেই ডাটার উপর কাজ করা মেথডগুলো (methods) একটি একক ইউনিট বা Class এর মধ্যে সংগঠিত থাকে।


মূল ধারণা

Encapsulation এর মূল উদ্দেশ্য হলো —
ডাটাকে লুকিয়ে রাখা (data hiding) এবং নিয়ন্ত্রিতভাবে অ্যাক্সেস প্রদান করা। অর্থাৎ, একটি অবজেক্টের অভ্যন্তরীণ ডাটা বাইরের কোড থেকে সরাসরি পরিবর্তন করা যাবে না; বরং শুধুমাত্র নির্দিষ্ট মেথডের মাধ্যমে অ্যাক্সেস করা যাবে।


উদাহরণ: Bank Account ক্লাস

public class BankAccount {

    private double balance; // private field

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    // Getter method - Controlled access
    public double getBalance() {
        return balance;
    }

    // Business logic methods
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
        }
    }
}


ব্যাখ্যা

- এখানে balance ভ্যারিয়েবলটি private, অর্থাৎ এটি ক্লাসের বাইরে থেকে সরাসরি পরিবর্তন করা যাবে না।

- শুধুমাত্র deposit() এবং withdraw() মেথডের মাধ্যমে নিরাপদভাবে অ্যাক্সেস ও পরিবর্তন করা সম্ভব।

- এভাবে ডাটাকে অবৈধ বা ভুল পরিবর্তন থেকে রক্ষা করা যায়।


Encapsulation এর সুবিধা

সুবিধা ব্যাখ্যা
Data Protection বাইরের ক্লাস সরাসরি অবজেক্টের অভ্যন্তরীণ ডাটা পরিবর্তন করতে পারে না।
Controlled Access Getter/Setter এর মাধ্যমে সীমিতভাবে ডাটা অ্যাক্সেস ও পরিবর্তন করা যায়।
Easier Maintenance কোড পরিবর্তন করা ও ডিবাগ করা সহজ হয়, কারণ ডাটা এক জায়গায় নিয়ন্ত্রিত।
Code Reusability একই ক্লাস বিভিন্ন স্থানে নিরাপদভাবে ব্যবহার করা যায়।


বাস্তব উদাহরণ

ধরা যাক, তুমি একটি ব্যাংক অ্যাপ তৈরি করছো যেখানে ব্যবহারকারী অ্যাকাউন্ট ব্যালেন্স দেখতে বা টাকা উত্তোলন করতে পারে।
যদি balance ফিল্ডটা public হতো, তাহলে যে কেউ কোডের মাধ্যমে সেটাকে পরিবর্তন করতে পারত — যা বড় নিরাপত্তা ঝুঁকি।

Encapsulation ব্যবহার করলে এই ঝুঁকি দূর হয়, কারণ ব্যালেন্স পরিবর্তনের নিয়ন্ত্রণ থাকবে নির্দিষ্ট মেথডের মাধ্যমে।


Setter ও Getter দিয়ে নিয়ন্ত্রিত অ্যাক্সেস

যদি কোনো ডাটা সেট করার প্রয়োজন হয়, তাহলে set মেথড ব্যবহার করা যায়:

public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name != null && !name.isEmpty()) {
            this.name = name;
        }
    }
}

এভাবে তুমি নির্ধারণ করতে পারবে — কবে এবং কীভাবে ডাটা পরিবর্তন করা যাবে।


Best Practices

- সবসময় ক্লাসের ফিল্ডগুলো private রাখো।

- শুধুমাত্র প্রয়োজনীয় মেথডগুলো public রাখো।

- Getter/Setter ব্যবহারের সময় validation logic যুক্ত করো।

- Encapsulation এর মাধ্যমে immutable objects তৈরি করাও সম্ভব (যেখানে ফিল্ড একবার সেট হলে আর পরিবর্তন করা যায় না)।


-------------

এনক্যাপসুলেশন এর আইডিয়া হচ্ছে একটা অবজেক্ট এর ফিল্ড এবং মেথডকে একটা সিঙ্গেল ইউনিট এর মধ্যে রাখা।  এই সিঙ্গেল উনিটকে ক্লাস বলা হয়।  

সুবিধা 

  • ফিল্ড  এবং মেথড এর অ্যাক্সেস সহজেই  নিয়ন্ত্রণ করা যায়
  • কোড পরিবর্তন করা সহজ হয় 
  • কোড মেইনটেইন করা সহজ হয় 


class BankAccount {
    private double balance;  // private field

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    // Encapsulated access
    public double getBalance() {
        return balance;
    }

    public void deposit(double amount) {
        if (amount > 0) balance += amount;
    }

    public void withdraw(double amount) {
        if (amount > 0 && balance >= amount) balance -= amount;
    }
}