অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং কী, সেটা তাত্ত্বিকভাবে বুঝাতে গেলে মাথার তার ছিড়ে ধোঁয়া বের হওয়া অতি স্বাভাবিক। তাই আমি তাত্ত্বিকভাবে কিছু বুঝানোর সেই চেষ্টায় যাব না। আমি বেসিক কিছু ধারণা দিয়ে বিভিন্ন বিষয়গুলো উদাহারণের সাহায্যে দেখার চেষ্টা করবো।

প্রথমেই বলে রাখি, আমরা আজ পর্যন্ত যা শিখেছি, তার সবই ছিল সি-এর দান। শুধু মাত্র ইনপুট-আউটপুট সিস্টেমটাই ছিল সি++ এর নিজস্ব। সি নিজেই একটা অনেক শক্তিশালী ল্যাঙ্গুয়েজ ছিল।  তবে এটি অবজেক্ট অরিয়েন্টেড ছিল না। এই সমস্যা সমাধানের জন্যই ১৯৭৯ সালে Murray Hill-এর Bell Labs-এ Bjarne Stroustrup সি ল্যাঙ্গুয়েজটার উন্নতি সাধনের কাজ করেন, এবং নাম দেন C with Classes, পরবর্তীতে ১৯৮৩ সালে যার নাম হয় C++.

এখন প্রশ্ন হল ক্লাস কী? সহজ কথায় ক্লাস হল অবজেক্ট তৈরির ব্লু-প্রিন্ট। ক্লাস ব্যবহার করে অনেকগুলো একই রকম অবজেক্ট তৈরি করা যায়। এখন আবার প্রশ্ন উঠে অবজেক্ট কী? অবজেক্ট হল এক ধরণের ডাটা স্ট্রাকচার। তবে সি-এর ডাটা স্ট্রাকচারের সাথে এর প্রধান পার্থক্য হল, সি-এর ডাটা স্ট্রাকচারের সব মেম্বার-ই বাইরের যে কারো দ্বারা এক্সেস করা সম্ভব ছিল। কিন্তু অবজেক্টের ক্ষেত্রে প্রয়োজনানুসারে ব্যবস্থা নেওয়া যায়, যাতে কিছু মেম্বার এক্সেস করা যায়, আবার কিছু মেম্বার থাকে অবজেক্টের একান্তই নিজস্ব! নিচের কোডটা দেখঃ

class Box{
   public:
        double length;   // Length of a box
        double breadth;  // Breadth of a box
        double height;   // Height of a box
    private:
        // data hidden from outside of the class
} boxNumber1, boxNumber2;

এটা অতি সাধারন একটা ক্লাসের ডিক্লারেশন। পরিচিত মনে হচ্ছে না? দেখতে ডাটা স্ট্রাকচার ডিক্লারেশনের মতই! শুধু পাবলিক, প্রাইভেট নামের কী-ওয়ার্ডগুলোই নতুন। এগুলো সম্পর্কে আমরা সামনে বিস্তারিত জানবো। আপাতত জেনে রাখি যে, এভাবে প্রাইভেট করে রাখতে পারার ধর্মটার নাম হল ডাটা অ্যাবস্ট্রাকশন (Data Abstraction), যা অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং-এর অন্নতম ভিত্তি!

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং-এর ভিত্তি সমূহ

  • Data Abstraction
  • Encapsulation
  • Polymorphism
  • Inheritance

প্রথমটি সম্পর্কে আমরা ইতোমধ্যেই জেনেছি। বাকি তিনটি সম্পর্কেও বেসিক ধারণা পাব নিচে!

পলিমরফিজম

আমাদের যাদের সি-এর সাথে পরিচয় রয়েছে, তারা হয়তো একটা জিনিসের মুখোমুখি হয়েছি। সি-তে যেসব ফাংশন আগে ডিফাইন করা (যেমন, sqrt, sin ইত্যাদি), সেসব নামে নতুন কোনো ফাংশন ডিফাইন করা যায় না। যেমন, নিচের সি কোডটা রান করতে চাইলে এরর দেখাবেঃ

#include <stdio.h>
#include <math.h>
int sqrt(int a, int b) {
    a = b;
    // iccha korche tai :p
    return 0;
}
int main() {
    printf("Muhahaha\n");
    return 0;
}

এরর মেসেজটা হলঃ
error message

অর্থাৎ, sqrt নামের একটি ফাংশন ইতোমধ্যে থাকার কারণে তুমি এই নামে নতুন একটা ফাংশন ডিক্লেয়ার করতে পারছো না। [তবে তুমি math.h ইনক্লুড না করলে ঠিকই প্রোগ্রামটা ঠিক মত কাজ করতো ;)]

আবার, তুমি একই নামে দুইটা ফাংশনও সি-তে ডিফাইন করতে পারবা না, যেমনঃ

#include <stdio.h>
#include <math.h>
int amarFunction(int a, int b) {
    printf("Function diye print korlam\n");
    return 0;
}
void amarFunction(int a) {
    printf("Eki naam dichi. Shomossha?\n");
}
int main() {
    amarFunction(1,2);
    amarFunction(1);
    return 0;
}

এক্ষেত্রেও একই ধরণের এরর দেখাবে। এবার তুমি একটা কাজ কর। তুমি ফাইলটা .c দিয়ে সেভ না করে .cpp দিয়ে সেভ করে দেখ। এবার খুব সুন্দর করে নিচের আউটপুট দেখাবে!

output

দেখ দুই ক্ষেত্রে কোড কিন্তু একই। কেবল একবার করা হয়েছে সি, আরেকবার সি++। অর্থাৎ, সি সাপোর্ট না করলেও, সি++-এ একই নামের একাধিক ফাংশন সাপোর্ট করে, যদি এবং কেবল যদি ফাংশনগুলোর প্যারামিটার ভিন্ন হয়। এখানে লক্ষ্য কর একটা ফাংশনের প্যারামিটার ছিল একটা ইন্টিজার, আরেকটার ক্ষেত্রে দুইটা ইন্টিজার! 

আর এই ব্যাপারটার নামই হল পলিমরফিজম। পলি=বহু, মরফ=রূপ। অর্থাৎ, পলিমরফিজম মানে হল একই নামে একাধিক রূপ! 😉

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

আগের দু’টির মত এনক্যাপসুলেশনের ব্যাপারটা এত সহজ উদাহারণ দিয়ে বুঝানো কঠিন! তবে আমরা ক্লাস, অবজেক্ট নিয়ে বিস্তারিত জানলে এটি সম্পর্কেও জানবো। আপাতত এটুকু জেনে রাখ যে, এনক্যাপসুলেশন বলতে বুঝায়, এমন একটা কনসেপ্ট যেটা সব ডাটা এবং ফাংশন(যেগুলা ডাটাগুলাকে বিভিন্ন ভাবে ব্যবহার করে) একত্রিত করে রাখে। এবং সেই সাথে এদের বাইরের ইন্টারফেস থেকেও নিরাপদ রাখে।  যেমন আমরা প্রাইভেট, পাবলিক করে রেখে কিছু ডাটা বাইরের থেকে আলাদা রেখেছিলাম! এনক্যাপসুলেশনের ধারণা থেকেই অ্যাবস্ট্রাকশনের ধারণার সৃষ্টি!

ইনহ্যারিটেন্স

ইনহ্যারিটেন্স ব্যাপারটা অ্যাপলিকেশন ডেভেলপমেন্টের ক্ষেত্রে খুব গুরুত্বপূর্ণ একটি ধারণা। ইনহ্যারিটেন্স হল এমন একটা কনসেপ্ট, যার মাধ্যমে আমরা একটা ক্লাসকে কাজে লাগিয়ে আরেকটা ক্লাস সৃষ্টি করতে পারি! যে ক্লাস থেকে আমরা নতুন ক্লাস সৃষ্টি করবো, সেটাকে বলে Base Class, আর যে ক্লাসটা সৃষ্টি করবো, সেটাকে বলে Derived Class.

Derived Class-টি Base Class-এর সকল নন-প্রাইভেট মেম্বার এক্সেস করতে পারে। বেস ক্লাসের সবগুলো মেথডও এটি পায়, শুধু কন্সট্রাক্টর, ডেসট্রাক্টর, ওভারলোডেড অপারেটর, ফ্রেন্ড অপারেটর ছাড়া (এগুলো নিয়েও আমরা জানবো সামনে!)। এছাড়াও, Derived Class-এ নতুন কিছু কাজও চাইলে করা যায়!

আজ এ পর্যন্তই। আগামী পর্বগুলোতে আমরা এগুলো সম্পর্কে আরো বিস্তারিত জানবো এগুলো নিয়ে কাজ করতে করতে। ততদিন পর্যন্ত ভাল থাকবেন, সুস্থ থাকবেন। 🙂

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed