Header Ads

এনক্যাপসুলেশন(Encapsulation)

শুরু করছি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের ২য় পর্ব Encapsulation। আপনি যদি ১ম পর্ব পড়ে থাকেন তাহলে Encapsulation খুব বেশি নতুন লাগবে না আপনার কাছে। Encapsulation অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের ৪ টি পিলারের ১টি। কিন্তু Encapsulation খুবই সহজ এবং প্রথম পর্ব বুঝলে আপনি Encapsulation ও বুঝে গিয়েছেন। আমি শুধু ২/১ টা উদাহরণ দিয়ে আরো পরিষ্কার করার চেষ্টা করব Encapsulation কি? সুতরাং এই পর্ব পড়ার আগে অবশ্যই ১ম পর্ব পড়া জরুরী। নতুন দের সিরিয়াল অনুযায়ী শিখে যাওয়া উচিৎ নাহলে বুঝতে হয়ত অনেক সমস্যা হবে।

প্রথমেই ডেফিনিশন, "Encapsulation হচ্ছে একটি প্রসেস যার মাধ্যমে attributes (ডাটা মেম্বারস) এবং methods (ফাংশনস) কে একটি সিঙ্গেল ইউনিটে রাখা হয় যাকে আমরা class নামে চিনি"। আশাকরছি বুঝতে পেরেছেন কেনো বলেছি ১ম পর্ব পড়ে থাকলে আপনি Encapsulation বুঝে ফেলেছেন। 

আসলে একটি ক্যাপসুলে যেমন ওষুধ রাখা হয় তেমনি একটি ক্লাসেও বিভিন্ন ডাটা ও মেথড রাখা হয় তাই একে Encapsulation বলে।


Encapsulation আমাদের ডাটা হাইডিংয়ের আরেকটি সুবিধা প্রদান করে access modifier এর মাধ্যমে। আমাদের কে বিভিন্ন কারণে attributes গুলো private বা protected করতে হয় যেন ক্লাসের বাইরে থেকে নির্দিষ্ট মেথড ছাড়া এদের কে এক্সেস না করা যায়। যেমন ধরে নিতে পারেন আমাদের কাছে youtubeChannel নামে একটি ক্লাস আছে যেটি দিয়ে নতুন youtube channel তৈরি করা যায়। এখানে attributes হিসেবে name থাকতে হবে, videos থাকতে হবে এবং subscriber থাকতে হবে। নিচে উদাহরণ হিসেবে কোড দেওয়া হলো।

class youtubeChannel {

// attributes or data members

public:

  int totalSubscriber;

  string name;

  vector <string> videoTitles;


  // constructors and methods

  youtubeChannel(string Name) { // constructor

    name = Name;

    totalSubscriber = 0;

  }


  void subscribe() { // subscribe method

    totalSubscriber++;

  }

  void unsubscribe() { // unsubscribe method

    totalSubscriber--;

  }


  void printTotalSubscriber() { // method to print total subscribers

    cout << totalSubscriber << endl;

  }

};


int main()

{

  youtubeChannel myChannel("tetat"); // create new channel

  myChannel.subscribe();

  myChannel.subscribe();


  myChannel.printTotalSubscriber();


  return 0;

}


উপরের কোডে আমরা tetat নামে একটু নতুন চ্যানেল খুলেছি এবং subscriber মেথড ২বার ব্যবহার করায় আমাদের subscriber এখন ২ জন। কিন্তু totalSubscriber attributes টি public, মানে এটি subcriber(); মেথড ছাড়াও ক্লাসের বাইরে থেকে এক্সেস করা যাবে। এখন যদি আপনি myChannel.totalSubscriber = 1000000; করে দেন তাহলে মুহূর্তেই আপনার চ্যানেলে ১ মিলিয়ন subscriber হয়ে যাবে :') এর জন্য আমরা attributes গুলো private বা protected রাখব যেন এমন ঘটনা না ঘটে যায়।

class youtubeChannel {

// attributes or data members

private:

  int totalSubscriber;

  string name;

  vector <string> videoTitles;


// constructors and methods

public:

  youtubeChannel(string Name) { // constructor

    name = Name;

    totalSubscriber = 0;

  }


  void subscribe() { // subscribe method

    totalSubscriber++;

  }

  void unsubscribe() { // unsubscribe method

    totalSubscriber--;

  }


  void printTotalSubscriber() { // method to print total subscribers

    cout << totalSubscriber << endl;

  }

};


int main()

{

  youtubeChannel myChannel("tetat"); // create new channel

  myChannel.subscribe();

  myChannel.subscribe();


  myChannel.printTotalSubscriber();


  return 0;

}


এবার আমরা attributes গুলো private এবং methods গুলো public করে দিয়েছি। এখন আর ক্লাসের বাইরে থেকে totalSubscriber এর ভ্যালু পরিবর্তন করে দেওয়া যাবে না। subscribe() মেথড আছে কিন্তু সেটি শুধু Youtube ব্যবহারকারী দের জন্য প্রযোজ্য।

আশাকরছি encapsulation বা class এর বিষয় টি এই লেখা পড়ে আরো ভালো করে পরিষ্কার হয়ে গেছে আপনার কাছে। এখন আপনার কাজ হচ্ছে videoTitles এর জন্য মেথড লিখবেন যেটি ব্যবহার করে কি কি কি ভিডিও চ্যানেলে আপলোড করা হবে তার টাইটেল গুলো videoTitles এ রাখা যাবে। এবং আরেকটি মেথড লিখবেন যা চ্যানেলের নাম ও ভিডিও টাইটেলস গুলো প্রিন্ট করবে।

এখন উপরের ক্লাসে একটু সমস্যা আছে। বর্তমান subscriber শুন্য থাকার পরেও যদি unsubscribe মেথড কল করা হয় তাহলে ত totalSubscriber এর ভ্যালু নেগেটিভ হয়ে যাবে! সেটি কি সম্ভব? এটি একটি সমস্যা এবং আমি মনে করি খুব সহজেই এই সমস্যার সমাধান করে ফেলতে পারবেন। কিন্তু প্রশ্ন হচ্ছে, এটি কি আসলেই সমস্যা? মানে আপনি হয়ত কন্ডিশন দিয়েছেন, totalSubscriber = 0 থাকলে unsubscribe(); মেথডের ভিতরে totalSubscriber ডিক্রেজ হবে না। কিন্তু ইউজার যদি একটা চ্যানেলে subscribe ই না করে তাহলে সে ত unsubscribe মেথডের এক্সেস পাওয়ার কথা নয়।

No comments

Powered by Blogger.