OOPs ! অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কনসেপ্ট এবং তার সূচনা :D


অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং নিয়ে আলোচনার ক্ষেত্রে আমার এই পোস্টের অবতারণা । আগেই বলে রাখি শিখতে শিখতে আমি যা বুঝি তা পোস্ট হিসেবে লিখে রাখতে ভালবাসি যাতে পরে দরকারের সময় কাজে লাগে । তো সেই শিখতে গিয়েই এই পোস্টটা লিখে ফেলা ।

যাই হোক প্রথমেই ধরে নেই এই লিখার উদ্দ্যেশ্য সম্পর্কেঃ আমরা সাধারণত ফাংশনাল প্রোগ্রামিং নিয়ে যেমনঃ সি তে একটা সময় কাজ করি, কিন্তু বৃহৎ আকারের কোনো সফটওয়্যার বানাতে গেলে আমার লিখা কোডগুলো যেন আরেকজনের কাছে বোধগম্য হয় এবং কোনো ঝামেলা ছাড়াই আরেকজন যেন সেটা নিয়ে কাজ করতে পারে(Resuability) এবং ছোটো ছোটো ভাগে ভাগ(Modularity) করা যায় সেই সুবিধা গুলো থাকা দরকার। তাছাড়া ইচ্ছা হলেই যেন তাতে একদম নতুন কিছু বৈশিষ্ট্য (Extensibility) জুড়ে দেয়া যাবে কিংবা ডিবাগ করা যাবে সেই অপশন রাখাটাও জরুরী। তাছাড়া স্পর্শকাতর কোনো ইনফরমেশন চাইলেই সফটওয়্যার ডেভেলপিং এর সময় আরেকজনের কাছে শো করবেনা এই ব্যাপারটাও(Information Hiding) নিশ্চিত করা জরুরী ।

সেই তাড়না থেকেই অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কনসেপ্টটার সৃষ্টি ।তানাহলে প্রোসিডিউরাল বা ফাংশনাল প্রোগ্রামিং দিয়েই কিন্তু কাজ চলে যেত 🙂

নিচের ছবিটাতে পার্থক্য দেখানো হল স্ট্রাকচারাল/প্রোসিডিউরাল এবং অব্জেক্ট ওরিয়েন্টেড প্রোগ্রামিং প্যারাডাইম সম্পর্কেঃ

যাই হোক ছবি দেখে হয়ত সব কিছু পরিস্কার হবে না তাই আমি চাচ্ছি নিচে এর সম্পর্কে কিছুটা আলোচনা করতে।

তো প্রথমেই প্রশ্ন রইল যে অবজেক্ট কি ?…আসলে অবজেক্ট হচ্ছে বস্তুগত ভাবে আমাদের আশেপাশে আমরা যা কিছুই দেখতে পাই কিংবা অনুভব করতে পারি তাইই অব্জেক্ট। ধরা যাক, আমি এই পোস্টটা লিখতে গিয়ে কি-বোর্ড, মাউস ইত্যাদি ব্যবহার করছি। সুতরাং, এই কি-বোর্ড, মাউস আলাদা আলাদা ভাবে অবজেক্ট কিংবা আমি যেই কিবোর্ড দিয়ে লিখছি সেই কিবোর্ডের রং কালো অথবা সাদা, এই রং এর ব্যাপারটা অবজেক্ট এর একটা অংশ বলা যায়(Property)। কিংবা আমাকে এই কি-বোর্ডটা আইডিবি ভবন থেকে কিনে আনতে কিছু আর্থিক ট্রাঞ্জাকশন করতে হয়েছে যেখানে আমি ছিলাম একজন ক্রেতা আর বিক্রেতা সেটা সেল করেছেন আমার কাছে অর্থের বিনিময়ে তো এখানে এই সেলস ট্রাঞ্জাকশান টাকেও এক প্রকারের অবজেক্ট বলে আমরা ধরে নিতে পারি।আবার হয়তবা আমি কি-বোর্ড দিয়ে চ্যাট করছি অথবা কোড করছি এই যে বিভিন্ন ধরনের কাজ সম্পন্ন হচ্ছে কি-বোর্ডটা দিয়ে এটাও অবজেক্ট এর একটা অংশ(Functionality)। আসলে একটা সমস্যার সমাধানে আমরা যেই একক বৈশিষ্ট্যগুলো নিয়ে কাজ করি তাকেই অবজেক্ট বলা যায়।  এখানে তাই বৈশিস্ট্য(Attribute) এর পাশাপাশি কি ধরনের কাজে লাগছে(Functionality) সেটা জানাটাও জরূরী।

 

যাইহোক প্রথমেই আমি কোড করব না । আমি চেস্টা করব যে কনসেপ্ট আমি শিখছি তা আগে শেয়ার করতে । আমার ব্যক্তিগত অভিজ্ঞতা থেকে আমি দেখেছি আগে কনসেপ্ট ক্লিয়ার করে পরে কোড করলে সেটা  পরবর্তিতে ভাল মনে থাকে । কিন্তু কনসেপ্ট না জেনে আগে ওওপি এর কোড করে ফেললে নিজের বুঝার ক্ষেত্রে একটু গ্যাপ হয়তবা থেকে যায় ।

তাহলে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কাকে বলে ?
অবজেক্ট জিনিসটাকে আমরা একটা সুন্দর র‍্যাপিং পেপার দিয়ে মোড়ানো একটা গিফট বাক্স হিসেবে চিন্তা বা কল্পনা করতে পারি যার বিভিন্ন ধরনের বৈশিস্ট্য বা Property বিদ্যমান। তবে এর ভেতরের অবস্থা সম্পর্কে আমরা বাইরে থেকে অবগত নই।

কিন্তু অবজেক্টগুলো একটার সাথে আরেকটা যোগাযোগ  রক্ষা করতে পারবে মেসেজের মাধ্যমে । মেথড নামক একটা সিস্টেম থাকবে যা এই মেসেজগুলো নিয়ে কাজ করবে। আর প্রতিটা অবজেক্ট এরই কিছু ব্যাক্তিগত নির্দিস্ট দায়িত্ব/Functionality থাকবে যা কেউ প্রোগ্রাম করে দিলে সে অনুযায়ী তার দায়িত্ব পালন করবে(Method)।

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

আরো বিষদ বিবরণে আমরা পরে যাচ্ছি কারণ বেসিক কনসেপ্টগুলার সম্পর্কে একটা আইডিয়া পেতে এটা একটি সূচনামূলক পোস্ট।
তো যাই হোক এভাবে অনেকটা বলা যায়ঃ

অবজেক্ট = ডাটা(যা অবজেক্ট এর প্রপার্টি/Attribute গুলা স্টোর করতে ভূমিকা রাখে) + মেথড(যোগাযোগ রক্ষা জাতীয় কিছু করা/Functionality/অবজেক্ট এর Behavior হিসেবে কাজ করে)

আর এই OOP কিন্তু কোনো ল্যাঙ্গুয়েজ স্পেসিফিক কিছু না মানে এটা আসলে একটা মডেল বা প্যারাডাইম(Paradigm) যার সুবিধা মোটামুটি সবধরনের হাইলেভেল প্রোগ্রামিং ল্যাঙ্গুয়েজেই(Java, C#, PHP, C++, Python ইত্যাদি) বিদ্যমান। এবং ইমপ্লিমেন্টেশান এর কনসেপ্ট গুলি সব ল্যাঙ্গুয়েজের ক্ষেত্রেই মোটামুটি একই ধরনের প্যাটার্ন ফোলো করে।

যাই হোক নিচে C++ দিয়ে একটি ছোটো উদাহারণ দেখা যাকঃ

#include<string>
#include<iostream>
class Person{ //এটা ক্লাস
    char name[20];  // এই টুকু প্রাইভেট, বাইরে থেকে এক্সেস করা যাবে না
    int yearOfBirth; // এই টুকু প্রাইভেট, বাইরে থেকে এক্সেস করা যাবে না
public: // এই টুকু পাবলিক, এই অংশ এর ভেতর বাইরে থেকে এক্সেস করা যাবে
    void displayDetails(){ //এটা মেথড
        cout<<name<<"born in"<<yearOfBirth<<endl; //এটা মেথডের ভেতরের অংশ
    }

}

বিহেভিয়ার এবং মেসেজঃ একটা অবজেক্ট সাধারণত কাজ করে তাঁর মেথড এর মাধামে এবং কিছু প্যারামিটার মেথড টাতে থাকতে পারে আবার নাও থাকতে পারে। যদি থাকে তবে সেইটার কাজ হচ্ছে সেই প্যারামিটারযুক্ত মেথডটা যেন অন্য কোনো মেথডের সাথে তথ্য আদান প্রদান করে। এবং এই মেথড টা কি কাজে ব্যবহার হচ্ছে সেটাকে অবজেক্টটার বিহেভিয়ার বলে। আমরা যাকে রিয়েল লাইফে Verb দিয়ে বুঝাই সেটাই সাধারণত অবজেক্ট এর Behavior যা পরে Method নেম হিসেবে ব্যবহার করা হয়। যেমনঃ doChat(), doEat(), doType() ইত্যাদি। অনেকটা Functional Programming Language এর ফাংশন এর মতন কাজ হয় OOP এর মেথডে।

তাছাড়া, আমি যদি রিয়েল লাইফে কাউকে জিজ্ঞেস করি How are you? সে যদি রিপ্লাইয়ে রিটার্ন করে বলেন “I am fine”, মেথড দিয়েও ব্যাপার টা আসলে অনেকটা এমনই হয় যখন মেসেজ পাসিং এর কাজ করে। মেথডের এর মাধ্যমে মেসেজটা পাস হয় রিয়েল লাইফের উপরের উদাহারণটার মতন।

আমরা যখন অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং নিয়ে কাজ করব, তখন আমাদের মাথায় দুইটা জিনিস রাখতে হবে,

এক, ক্লাস তৈরিঃ আমাদের আগে ক্লাস তৈরী করে ফেলতে হবে OOP নিয়ে কাজ করতে গেলে ।
দুই, অবজেক্ট ইন্ট্যার‍্যকশনঃ আমাদের অবজেক্টগুলো তৈরী করতে হবে ক্লাস থেকে। বিভিন্ন অবজেক্ট এর ব্যবহার ও উদ্দ্যেশ্য বিভিন্ন হতে পারে।

অবজেক্ট ওরিয়েন্টেড কনসেপ্টের অন্যান্য বেসিক বা মূল টার্মিনোলোজি গুলা অনেকটা এরকম যেঃ

ক্লাসঃ ক্লাসের কথা যখন আসলই তখন বলা যায় যে একটা অবজেক্ট কে যা দিয়ে ডিফাইন করা যায় সেটাই ক্লাস।তাহলে দেখি কিভাবে তা করা যায়ঃ নিচের উদাহারণে আমরা Keyboard নামের একটা ক্লাস লিখে ফেললাম যার কিছু বৈশিষ্ট্য আছে যেমনঃ প্রাইস, মডেল, ব্র্যান্ড ইত্যাদি বিভিন্ন কি বোর্ডের জন্য বিভিন্ন রকম। আর কি বোর্ড দিয়ে কিছু স্পেসিফিক কাজও করার আছে যেমনঃ এটা দিয়ে আমি চাইলে মেসেঞ্জার এর নির্দিস্ট টেক্সট বক্সে লিখে চ্যাট করতে পারি তাই DoChat() মেথড, চাইলে ওয়ার্ডে টাইপ করতে পারি যেমনঃ DoTypeInMsWord() মেথড অথবা চাইলে কোডব্লক্সে কোড লিখতে পারি তাই DoCode() মেথড ইত্যাদি।

class Keyboard{

 int price;
 int model;
 int brand;
static int DoChat(){
}

static int DoTypeInMsWord(){
}

void DoCode{
}

}

তো এই Keyboard ক্লাস থেকে আমরা চাইলেই একটা অবজেক্ট তৈরি করে ফেলতে পারব যার নাম দিলাম Ke । নিচে তা দেখালামঃ

Keyboard Ke; //here Ke is an object of the class Keyboard. We can say that object is an instance of a class

এরকম করে এখান থেকে আমরা একটা ক্লাস থেকে প্রয়োজন অনুসারে অসংখ্য অবজেক্ট তৈরী করতে পারি। যার ফলে বলা যায় ক্লাস হচ্ছে অবজেক্টের একটা ছাচ বা টেমপ্লেট(“Class is a blueprint/template of an Object or An object is an instance of a Class”)। 🙂

অ্যাবস্ট্রাকশানঃ

প্রয়োজনীয় এবং অপ্রয়োজনীয় তথ্যের ভীড়ে অপ্রয়োজনীয় তথ্য বাদ দিয়ে কেবল কাজের এবং দরকারী তথ্য নিয়ে কাজ করাকেই অ্যাবস্ট্রাকশন বলে যেমনঃ ধরেন আমার একটা বাইসাইকেল আছে এখন সেই সাইকেলটা চালানোর সময় আমি যদি ব্রেক চাপ দেই সেটা থেমে যাবে তো সেক্ষেত্রে আমার কিন্তু জানলেই হচ্ছে কোনটায় চাপ দিলে ব্রেক কাজ করে কিংবা কোনটায় চাপ না দিলে ব্রেক কাজ করবে না…আমার কিন্তু এখানে জানা লাগছে না যে ব্রেকের ভেতরের মেকানিজম টা কি….এই যে প্রয়োজনীয় অংশ টা জানলেই কাজ হয়ে যাচ্ছে ভেতরের ব্যপার জানা লাগছে না এই ধর্মটাকেই বলে আবস্ট্রাকশন ইন OOP. এভাবে বলা যায় যে, Hiding internal details and showing functionality is known as abstraction.

উদাহারণ হিসেবে আরো দেয়া যায় যে ধরূন একটা এটিএম বুথে গেলে এটিএম মেশিন থেকে আমরা টাকা তুলতে পারি, টাকা জমা দিতে পারি কিন্তু আমরা জানিনা যে এটিএম মেশিন আসলে কিভাবে কাজ করছে কিন্তু তা না জানা সত্তেও আমরা কিন্তু কয়েকটা বাটন প্রেস করেই এর সুবিধা নিতে পারছি সুতরাং এই ব্যাপারটাই আসলে Abstraction. নিচের ছবিটা দেয়া হল ভিজুয়ালি বুঝার সুবিধার জন্য 🙂


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

ক্যাপসুল শব্দটা থেকে এনক্যাপসুল শব্দটা আসা ।এর কারণ হচ্ছে ক্যাপসুল হিসেবে আমরা যেই ঔষধ খাই তার দুইটা প্রকোষ্ঠে দুই ধরনের কেমিক্যাল থাকে যা একটা থেকে আরেকটা মিশে যায় না তাছাড়া এর ভিতরে কি উপাদান আছে তা আমরা ক্যাপসুল এর বাইরে থেকে জানতে পারিনা অর্থাৎ OOP এ আমাদের কাছে তথ্য বা ডাটা হাইড করা আছে বা এনক্যাপসুলেটেড অবস্থায় আছে ঠিক যেরকম ভাবে ক্যাপসুলে থাকে।

ছোটো একটা উদাহারণ দেখি নিচের কোড এবং কমেন্টস এর মাধ্যমেঃ

class Keyboard{

 private int price;
 private int model;
 private int brand;

static public int DoChat(){
   // can access the properties in the same class
}

static private int DoTypeInMsWord(){
   //they can access the properties but nobody can call this method as it is private
}

}

interface DoCode{
    //OOP নিয়ে আলোচনায় interface এর অনেক মূল্যবান ভূমিকা আছে যেটা পরে আলোচনা করা হবে
}

ইন্টারফেস ব্যাপারটা আমরা পরে আরো বিস্তারিত আলোচনা করব তবে এতটুকু জেনে রাখা দরকার যে এটা আলাদা একটা ক্লাস হিসেবে কাজ করে এবং যা অন্যান্য ক্লাসের/মেথডের কাজ শুরু করার জন্য এক ধরনের অনুমতি/ভূমিকা হিসেবে কাজ করে । মালটিপল ইনহেরিট্যান্স এর কাজেও সি# এ এই interface ব্যবহার করা হয়।

যাই হোক এখানে আমাদের মনে প্রশ্ন আসতে পারে যে , উপরে উল্লেখিত  Abstraction আর Encapsulation এর কাজ তো দেখা যাচ্ছে মোটামুটি একই রকম তাহলে তাদের মধ্যে পার্থক্য কোথায় ? ব্যাপারটা বোঝার জন্য StackOverFlow এর এই লিংক দুটা দেখা যেতে পারে।

https://stackoverflow.com/a/13589763/3957530
https://stackoverflow.com/a/31243756/3957530

এই লিংকগুলো থেকে ঘেটে যা বোঝা যাচ্ছে তা হল অ্যাবস্ট্রাকশনের(Abstraction) একটা সাবসেট হচ্ছে এনক্যাপ্সুলেশান(Encapsulation)। নিচের ছবিটা দেখলে ব্যাপারটা আরো স্পষ্ট হবে।

ইনহেরিট্যান্সঃ এটাকে বলা যায় অনেকটা উত্তরাধিকার বা পৈত্রিক সম্পত্তি পাওয়ার মতন.. যেমনঃ একজন সন্তান হয়ত উত্তরাধিকার সূত্রে তার বাবা-মার সম্পত্তি অটোমেটিকালি পেয়ে যাবে তার বাবা-মা হয়ত সেই সম্পত্তি পেয়েছিল তার দাদা-দাদিমার থেকে। সেক্ষেত্রে আমরা বলতে পারি চাইল্ড ইনহেরিটেড প্রপার্টিজ ফ্রম হিজ প্যারেন্টস।

অবজেক্ট ওড়িয়েন্টেড প্রোগ্রামিং(OOP) এ পাবলিক কিংবা প্রোটেক্টেড  করে রাখা সব প্রপার্টি একজন চাইল্ড তার প্যারেন্টের থেকে অটোমেটিকালি পেয়ে যাবে (কিন্তু কেবল প্রাইভেট বা ব্যাক্তিগত জিনিস অটোমেটিকালি সে তার প্যারেন্টস এর থেকে পাবে না)

আমাদের আসলে এসব ক্ষেত্রে রিয়েলওয়ার্ল্ড এক্সামপল দিয়ে চিন্তা করা উচিৎ। যেমন ঃ একজন পিতা বা মাতা তাদের নিজেদের সম্পত্তির একটা অংশ হয়ত তার সন্তানের জন্য রেখে যেতে পারেন…তবে তারা তাদের নিজেদের ব্যাক্তিগত ব্যবহারে লাগে এমন জিনিস যেমন ঃ জামাকাপড়, মোবাইল ফোন, ল্যাপটপ, চলার মতন সম্বল(যেমনঃ অর্থ) ইত্যাদি তার সন্তান কে হয়ত উত্তরাধিকার সূত্রে নাই দিতে পারেন সেক্ষেত্রে এই ব্যাপারটা হয়ে গেল প্রাইভেট(private) আর সম্পদের যেই অংশটুকু সন্তানের রেখে দিয়েছেন জন্য সেই অংশটুকু হতে পারে পাবলিক অথবা প্রোটেক্টেড। Public, Private, Protected, Internal এইগুলোকে access specifier বলে। এই Specifier গুলা নিয়ে আরো বিস্তারিত সামনে লিখব ইনশাল্লাহ।

তো যাই হোক Inheritance এর এই ব্যাপারটাকে “is a” রিলেশানশিপ দিয়ে প্রকাশ করা হয়।
যেমনঃ
A teacher is a person এখানে টিচার পারসন কে ইনহেরিট করছে
A dog is an animal এখানে ডগ এনিমেল কে ইনহেরিট করছে কারন এখানে এনিমেল হচ্ছে প্যারেন্ট আর ডগ হচ্ছে তার চাইল্ড
A car is a vehicle এখানে কার ভেহিকল কে ইনহেরিট করছে আবার mortorcycle কিংবা truck ও vehicle কে ইনহেরিট করতে পারে। সুতরাং vehicle হচ্ছে প্যারেন্ট ক্লাস আর car, motorcycle, truck হচ্ছে চাইল্ড ক্লাস।

উপরের এই ছবি দেখে আমরা আবার বলতে পারি, A station wagon is a car, A jeep is a car ইত্যাদি।

তো আমরা অনেকটা এভাবে বলতে পারি যে, প্যারেন্ট ক্লাসটাকে ধরে নিলাম Class A এবং তা হচ্ছে Superclass আর চাইল্ড ক্লাস টাকে ধরলাম Class B আর সেটা হচ্ছে Subclass বা Derived class। তাহলে এভাবে বলা যেতেই পারে Class B extends/inherits Class A।

পলিমরফিজমঃ

Poly=অনেক + Morph = রূপ এই দুই গ্রিক শব্দের ব্যবহার এই Polymorphism ব্যাপারটাকে নাম করনের মাধ্যমেই আরো স্পস্ট ভাবে তুলে ধরেছে ।

পলিমরফিজম হচ্ছে অব্জেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর একটা কনসেপ্ট বা বৈশিষ্ট্য যা ইমপ্লিমেন্ট করা যায় স্ট্যাটিক পলিমরফিজম(যা কম্পাইল টাইম পলিমরফিজম নামেও পরিচিত বা Early binding,  ইহাকে ফাংশন/মেথড ওভারলোডিং বলে) এবং ডাইনামিক পলিফরজিম(যা রানটাইম পলিমরফিজম নামেও পরিচিত বা Late Binding যা মেথড/ফাংশান ওভাররাইডিং ও বলে) এর মাধ্যমে

Polymorphism implemented by function overloading or function overriding.Where function/method overloading is compile time polymorphism and Function overriding is runtime polymorphism.

এখানে ফাংশান ওভারলোডিং(Function Overloading) নিয়ে আলোচনা করা হলঃ

এটাকে বলা যায় বহুরূপী আচরণ, যেমন একজন পুরুষ মানুষ ধরলাম তার নাম Rahim সাহেব । তিনি শিক্ষাজীবনের পড়ালেখার পার্ট শেষে হাসপাতালে একজন ডাক্তার হিসেবে কাজ করতে পারেন আবার তিনি তাঁর নিজের বাসাতে তাঁর সন্তানের একজন বাবা/টিচার হিসেবেও কাজ করতে পারেন। কিন্তু দিনশেষে তিনি কিন্তু একই নামে সব জায়গায় পরিচিত সেটা হচ্ছে তার নাম Rahim সাহেব। সুতরাং, এই যে একটা মানুষের নাম একই আছে কিন্তু ভিন্ন ভিন্ন কাজের ক্ষেত্রে বহুরুপতা এই ব্যাপারটাকেই পলিমরফিজম এর ওভারলোডিং মেকানিজম বলে। যাকে Function/Method ওভারলোডিং ও বলে।

অর্থাৎ, When an object performs multiple task in the same name we call it function overloading

পরবর্তিতে ফাংশান ওভাররাইডিং(Overriding) নিয়েও আলোচনা করা হবে আর আমরা উদাহারণ দিয়ে পলিমরফিজমের অন্যান্য বিস্তারিতও দেখব।

অ্যাসোসিয়েশানঃ

Association হচ্ছে একটা অবজেক্ট এর সাথে আরো অনেকগুলা অবজেক্ট এর সম্পর্ক(One to many), অনেকগুলা অবজেক্ট এর সাথে একটা অব্জেক্ট এর সম্পর্ক(many to one), অনেকগুলা অবজেক্ট এর সাথে অনেকগুলা অবজেক্ট এর সম্পর্ক(Many to Many) ইত্যাদি । UML diagram এ একে Arrow সাইন দিয়ে প্রকাশ করা হয়। অবজেক্ট গুলোর মধ্যে Multiplicity সম্পর্ক ব্যাখ্যা করতে Association ধারনাটার উৎপত্তি।

অ্যাসোসিয়েশান কে আরো সূক্ষ্মভাবে ব্যাখা করতে আরো কিছু জিনিস জানা প্রয়োজন। তাই Association এর  একটা অংশ হচ্ছে Aggregation। আর Aggregation এর একটা অংশ হচ্ছে Composition।

 উপরোক্ত ছবিটা দেখলে ব্যাপারগুলা স্পস্ট হয়ে যাবে Association, Aggregation and Composition

উপরোক্ত ছবিটাতে দেখানো হয়েছে Association, Aggregation and Composition এর প্রকাশ করতে ব্যবহৃত Object Notation

এগ্রিগেশন ও কম্পোজিশানঃ দুইটা অবজেক্ট আছে তাদের মধ্যে  যদি একটা অবজেক্ট এর স্থায়িত্ব বা জীবনকাল আরেকটা অবজেক্টের ওপর নির্ভরশীল না হয় তখন তাদের মধ্যে সেই সম্পর্কটাকে বলে এগ্রিগেশান(Aggregation)। এটাকে “has a” রিলেশনশীপ দিয়ে প্রকাশ করা যায়।
যেমনঃ A classroom has students এক্ষেত্রে একটা ক্লাস রুমে অনেকজন ছাত্র ছাত্রী আছে এটা aggregation। কারণ যদি একটা ক্লাস রুম এ জায়গা নাও থাকে তবুও student রা থাকতে পারে। অন্য কোনো জায়গায় হয়ত ক্লাস করতে পারে। যদিও Student রা Classroom এর ওপর কিছুটা নির্ভরশীল কিন্তু দিনশেষে Classroom এবং Student উভয়ই স্বাধীন সত্ত্বা।

আবার একটা Document এ অনেকগুলো Page থাকতে পারে সেক্ষেত্রে যদি আমি Document টাকেই না রাখি তাতে কিন্তু Page গুলোরও কোনো অস্তিত্ব থাকবে না কারণ পেজ গুলা Document টারই একটা অংশ ছিল। সেক্ষেত্রে এই অবস্থাটা কে আমরা বলতে পারি Composition। Composition implies ownership and one object is part of another object.

Composition কে একধরনের Aggregation ও বলা যাবে যা আবার সামগ্রিক ভাবে Association এরও একটা অংশ। এদের সম্পর্কে আরো বিস্তারিত জানতে হলে এই লিংকে গিয়ে দেখা যেতে পারে।
http://www.c-sharpcorner.com/UploadFile/ff2f08/association-aggregation-and-composition/

আমরা ইনহেরিটেন্স(Is-A) রিলেশান এবং এগ্রিগেশান(Has-A) রিলেশান অবজেক্ট গুলার মধ্যে সম্পর্ক বুঝাতে অবস্থা খাতিরে ব্যবহার করি, যখন যেখানে যেটার প্রয়োজন হয় এবং দুইটার কাজ কিন্তু আলাদা।

Inheritance vs Aggregation:

Inheritance আর Aggregation এই দুইটা যে আলাদা জিনিস উপরোক্ত ছবির মাধ্যমে তা দেখানো হল।

সবশেষে, এখন কেউ যদি জিজ্ঞেস করে যে OOP এর Fundamental Principles গুলো কি কি ? তাহলে আমরা উপরে উল্লেখিত ব্যাখ্যা গুলো থেকে বলতে পারি যে OOP এর Fundamental Principles গুলো হচ্ছে।
1. Encapsulation
2. Inheritance
3. Abstraction
4. Polymorphsim

তো এই ৪ টা পিলার এর ওপরই মূলত অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কনসেপ্টটা দাঁড়িয়ে আছে। যাই হোক এই ছিল আমার OOP এর মূল বিষয়গুলা নিয়ে সূচনামূলক পোস্ট। আজকে এখানেই শেষ করি।

বিভিন্ন রেফারেন্স অনুসরণ করে আমার নিজের ভাষাতেই এই পোস্টটা লিখার চেস্টা করলাম। হয়তবা সেভাবে গুছিয়ে লিখতে পারিনাই তাই ভুল ত্রটি থাকলে ক্ষমা সুন্দর দৃষ্টিতে দেখবেন আর আমার ইচ্ছা আছে এটাকে একটা পূর্ণাঙ্গ সিরিজ হিসেবে দাড় করানোর । ইনশাল্লাহ্‌  সময় পেলে হয়তবা লিখে ফেলব একদিন।

ধন্যবাদ আপনাকে পোস্টটি সময় নিয়ে পড়ার জন্য ও সাথে থাকার জন্য। পোস্টটি কারো উপকারে আসলে কিংবা ভাল লাগলে অবশ্যই তা শেয়ার করতে ভুলবেন না কারণ শেয়ারিং করা মানেই হল অপরের জন্য কেয়ারিং করা আর পুরো লিখাটা পড়ার পর কমেন্ট বক্সে আপনার গঠনমূলক মন্তব্য স্বাগতম।  🙂


আমি যেসব লিংক থেকে এ বিষয় গুলো জানার চেস্টা করেছি তা নিচে দিলামঃ

http://jompesh.com/videos/1/1143/oop-lesson-1-introduction-to-object-oriented-programming

https://en.wikipedia.org/wiki/Object-oriented_programming
https://www.youtube.com/watch?v=5SWKbS87p98  ইত্যাদি এবং আরো কিছু ব্লগ ও ওয়েবসাইট
*পোস্টে উল্লেখিত ছবি গুলোর জন্য গুগল ইমেজ এর সাহায্য নেয়া হয়েছে

It would be a great help, if you support by sharing :)
Author: zakilive

2 thoughts on “OOPs ! অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কনসেপ্ট এবং তার সূচনা :D

Leave a Reply

Your email address will not be published. Required fields are marked *