Tag Archives: বাংলা

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



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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

এরকম করে এখান থেকে আমরা একটা ক্লাস থেকে প্রয়োজন অনুসারে অসংখ্য অবজেক্ট তৈরী করতে পারি। যার ফলে বলা যায় ক্লাস হচ্ছে অবজেক্টের একটা ছাচ বা টেমপ্লেট(“Class is a blueprint 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 এ পাবলিক কিংবা প্রোটেক্টেড সব প্রপার্টি একজন চাইল্ড তার প্যারেন্টের থেকে অটোমেটিকালি পেয়ে যাবে (কিন্তু কেবল প্রাইভেট বা ব্যাক্তিগত জিনিস অটোমেটিকালি সে তার প্যারেন্টস এর থেকে পাবে না)

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

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

পলিমরফিজমঃ

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

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

Polymorphism implemented by function overloading or function overriding.

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

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

when an object performs multiple task in the same name we call it function overloading আমরা উদাহারণ দিয়ে দেখব কোডে এই লিংকে।

যেমনঃ উপরের ১ম C++ কোড টায় Person  ক্লাসে displayDetails() টিচার হিসেবে একধরনের মেসেজ দিবে আবার হয়ত ডাক্তার হিসেবে আরেকধরনের মেসেজ দিবে যদিও দুজনেই একই person.

 

এগ্রিগেশনঃ একটা অবজেক্ট আরেকটা অবজেক্টের অংশ বিশেষ হলে তাকে বলে এগ্রিগেশান। এটাকে “has a” রিলেশনশীপ দিয়ে প্রকাশ করা যায়।
যেমনঃ A car has wheels এক্ষেত্রে একটা গাড়ীর অনেকগুলা চাকা আছে এটা composite aggregation
আবার অনেক গুলা চাকা অনেক গুলা গাড়ির অংশ হলে সেটাকে আমরা বলতাম shared aggregation অর্থাৎ একের চেয়ে বেশী অবজেক্ট এটা শেয়ার করতেসে

বিহেভিয়ার এবং মেসেজঃ একটা অবজেক্টে সাধারণত কাজ করে তাঁর মেথড এর মাধামে এবং ত থ্য আদান প্রদান করে। এবং এটা কি কাজ করে সেটা তাঁর বিহেভিয়ার।
যেমনঃ আমি যদি কাউকে জিজ্ঞেস করি How are you? সে যদি রিপ্লাইয়ে রিটার্ন করে “i am fine” ব্যাপার তা আসলে এমনই।

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

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

আমি যে লিংক থেকে এ বিষয় গুলো লিখার চেস্টা করেছি তা নিচে দিলামঃ
http://jompesh.com/videos/1/1143/oop-lesson-1-introduction-to-object-oriented-programming

https://www.youtube.com/watch?v=5SWKbS87p98

বাংলা



এখানে বাংলাতে লিখব

Algorithmic Thoughts : বাহিরের চাকচিক্য ভিতরের মন



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

‪#‎Thoughts‬