এতদিন ধরে যে প্রোগ্রামিং ভাষা নিয়ে কথা বলছি, কাজ করছি তার ভিতরের কিছু বৈশিষ্ট নিয়ে আলোচনা করা হয়নি যা খুব গুরুত্বপূর্ন। তেমন একটি হচ্ছে ক্লাস (class)। ক্লাস নিয়ে কথা বলার আগে কিছু কথা বলে নেয়া দরকার যা অনেক আগেই আলোচনা করা উচিত ছিল। কিন্তু ভুল বশত করা হয়নি।
অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং হল প্রোগ্রামিং করার সেই মেথড যেখানে প্রত্যেক প্রোগ্রাম কোন না কোন ক্লাসের অধীনে থাকে এবং সেই ক্লাসের নিজস্ব অবজেক্ট তৈরী করে নিজস্ব ফাংশন ব্যাবহার করে আমরা কাজ করতে পারি। আপনি যদি C কিছুটা জানেন, তাহলে লক্ষ করে দেখবেন যে C Non-Object Oriented Language কারন C তে আপনি ক্লাস তৈরী করে কাজ করতে পারবেন না।
অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর তিনটি বিশেষ বৈশিষ্ট্য রয়েছেঃ
Encapsulation হল এমন একটি বিশেষ ব্যবস্থা যার মাধ্যমে কোন ক্লাসের নিজস্ব ভ্যারিয়েবেল, ফাংশন এর উপর প্রবেশাধিকার আরোপ করা যায়। অর্থাৎ ঐ ক্লাসের বাইরে অন্য কেউ ক্লাসের অধীনস্থ কিছু ব্যাবহার করতে পারবে কি পারবেনা তা নির্ধারন করে দেয়া যায়। এরমাধ্যমে ক্লাসের অখন্ডতা ও নিরাপত্তা বজায় থাকে। প্রোগ্রামের নিজস্বতা অখুন্ন থাকে।
Inheritence হল একটি বিশেষ বৈশিষ্ট যার মাধ্যমে এক ক্লাস অন্য কোন ক্লাস থেকে কোন বিষয়বস্তু উত্তরাধিকার সুত্রে পায়। অর্থাৎ এক ক্লাস অন্য ক্লাসের ভ্যরিয়েবেল ও ফাংশন নিয়ে কাজ করতে পারে।
একই ফাংশন (মেথড) বিভিন্ন ভাবে ব্যাবহার করার উপায় কে Polymorphism বলে। অর্থাৎ একটি মাত্র ফাংশন যার অনেকগুলো কপি থাকবে যারা একি হলেও এদের কাজ এক নয়। এরা বিভিন্ন সময় বিভিন্ন কাজ করবে। কখন এই ফাংশনের কোন কপি কল করা হবে তা নির্ধারিত হবে প্রোগ্রাম ফ্লো এর উপর।
উদাহরন স্বরুপঃ আপনি দুইটি সংখ্যার যোগফল বার করতে চান। এখন আপনার কাছে একটা ফাংশন আছে
private int add(int m,int n) { int s; s=m+n; return s; }
এখন এই ফাংশন শুধু দুইটি int নাম্বার যোগ করতে পারবে। যদি float যোগ করতে চান তাহলে float এর জন্য একি ফাংশন তৈরী করতে হবে যা float সংখ্যা প্যারামিটার হিসেবে নিবে। এখন আপনি যখন মেইন থেকে ফাংশন কল করবেন তখন কোনটি কল হবে? ১মটি না ২য়টি? এটা নির্ভর করবে আপনি কি ধরনের প্যারামিটার পাঠাচ্ছেন তার উপর।
ক্লাস হল একটি স্ট্রাকচার যা সকল অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর মূল ধারনা। ক্লাস কোড এবং ডাটার মধ্যে সংযোগ স্থাপন করে। একটি ক্লাসের মধ্যে নিজস্ব ভ্যারিয়েবেল, ফাংশন ও অন্যান্য ডাটা অবজেক্ট থাকে যা ঐ ক্লাসের জন্য ব্যবহৃত হবে। আমরা কোন ক্লাসের অবজেক্ট তৈরী করে সেই ক্লাসের ডাটা অবজেক্ট ও ফাংশন ব্যাবহার করতে পারব। ক্লাস সাধারনত কোন বিশেষ কাজের জন্য সাজানো হয়ে থাকে। ক্লাস ডিক্লেয়ার করার জন্য class কিওয়ার্ড ব্যবহার করা হয়। একটি ক্লাস ডেফিনিশন নিচে দেখানো হলঃ
class MyClass { //Data Object Declarations Access_Specifier Data_Type data_objectName //Constructor</em> Access_Specifier MyClass()</em> { //Initialization Tasks to be done</em> } ~</em><em>MyClass() { } Access_Specifier MethodName(Parameter)</em> { //Tasks to be done</em> } }
এখানে MyClass নামে একটি ক্লাস ডিক্লেয়ার করা হয়েছে। এই ক্লাসের মধ্যে প্রথম অংশে ডাটা ভ্যারিয়েবেল গুলোর Declaration দেয়া হয়েছে। এর পরের অংশে ক্লাসের কন্সট্রাক্টর (Constructor) ঘোষনা দেয়া হয়েছে এবং শেষ অংশে এই ক্লাসের যদি নিজস্ব কোন ফাংশন/মেথড থেকে থাকে তাহলে তা লেখা হয়েছে। এক্ষেত্রে কিছু নতুন বিষয়ের পরিচয় পাইঃ
i. private: ক্লাস মেম্বার/ডাটা অবজেক্ট/ফাংশন কে ক্লাসের বাইরে থেকে প্রবেশ করা যাবেনা, কোন ডাটা ভ্যারিয়েবেল পরিবর্তন করা যাবেনা। কেবল মাত্র সেই ক্লাসের অবজেক্ট ঘোষনা করে ঐ অবজেক্টের মাধ্যমে ফাংশন করে ডাটা ভ্যারিয়েবেল-এ প্রবেশ করা যেতে পারে তবে তা সম্পূর্ন রূপে ক্লাস ডেফিনিশনের উপর নির্ভর করবে।
ii. public: ক্লাস মেম্বার কে ঐ ক্লাস ও ক্লাসের বাইরে থেকে প্রবেশ করা যাবে।
iii. protected: ক্লাস মেম্বার অনেকটা private এর মত আচরন করবে তবে পার্থক্য এই যে ঐ ক্লাস থেকে যে ক্লাস ইনহেরিট (Inherit) করবে সেই inherited ক্লাসের মেম্বার রা সরাসরি protected মেম্বার কে প্রবেশ করতে পারবে।
iv. internal: কেবল মাত্র ঐ ক্লাস মেম্বার যেখানে ডিক্লেয়ার করা হয়েছে তার অবজেক্টের মাধ্যমে প্রবেশ করা যাবে।
কন্সট্রাক্টর হল কোন ক্লাসের সকল ডাটা অবজেক্ট কে initialize করে। প্রত্যেক ক্লাসের কন্সট্রাক্টর-ডেস্ট্রাক্টর থাকে। Constructor যেমন ক্লাসের মেম্বারদের initialize করে তেমনি Destructor কাজ শেষে সকল ক্লাস মেম্বারদের ধংস করে দেয় এবং তাদের জন্য বরাদ্দকৃত মেমরি ফ্রি করে দেয়। এই কাজ করার জন্য একটি বিশেষ মেথড রয়েছে যা Java এবং C# এ দেখা যায় এবং তা হল Grabage Collection। পরবর্তিতে এটা নিয়ে আলোচনা করব।
Constructor এবং Destructor উভয়ের ক্ষেত্রে এদের নাম ক্লাসের নামের অনুরূপ হবে। সাধারনত Constructor এর জন্য private ব্যাবহার করা হয়।
Destructor এর ক্ষেত্রে কোন Access Specifier দরকার হয়না। কেবল নামের আগে (~) চিহ্ন ব্যাবহার করা হয় (উদাহরন দেখুন)।
Garbage Collection হল একটি বিশেষ মেকানিজম বা পদ্ধতি যা কোন প্রোগ্রাম বা ক্লাসের মধ্যে কোন ভ্যারিয়েবেল, অবজেক্ট, মেমরি স্পেস ফ্রি করে থাকে। অনেকসময়, কোন অবজেক্ট তৈরী করলে সেই অবজেক্ট ধ্বংশ করার সময় করা যায়না। এক্ষেত্রে মেমরি স্পেস ফ্রি করার জন্য এই পদ্ধতি ব্যবহার করা হয়। আবার এমনো হয় যে, কোন অবজেক্ট তৈরী করা হল কিন্তু সেটা যে মেমরি লোকেশন রেফার করে সেটি আর উপস্থিত নেই সেক্ষেত্রে অবজেক্ট একটি নাল রেফারেন্স অবজেক্ট হিসেবে পরিগনিত হবে কিন্তু এটি প্রোগ্রাম চলাকালে মেমরি স্পেস এলোকেট করে রাখবে। প্রোগ্রামারের তখন এই ধরনের অবজেক্ট সনাক্ত করে ধ্বংশ করার ব্যবস্থা করতে হবে যা অনেকসময় ঝামেলা সাধ্য। তাই Garbage Collection পদ্ধতি ব্যাবহার করা হয় যা একটি আধুনিক স্বয়ংক্রিয় মেমরি ও রিসোর্স ম্যানেজমেন্ট পদ্ধতি।
Method হল ফাংশনের সমার্থক শব্দ। অনেকসময় কোন একটি বিশেষ বিশেষ কাজ বিভিন্ন ক্ষেত্রে বারবার করার প্রয়োজন হয়। এক্ষেত্রে প্রত্যেকবার এই একি কাজের জন্য কোড এতবার লেখা ঝামেলাপূর্ন বলেই ফাংশন বা মেথড ব্যাবহার করা হয়। যেমন কোন প্রোগ্রামে যোগ-বিয়োগের কাজ বার-বার করার প্রয়োজন হতে পারে। এক্ষেত্রে সুবিধাজনক হল যোগ বিয়োগের জন্য আলাদা দুইটি ফাংশন বা Method তৈরী করে তা প্রয়োজন অনুসারে কল করে কাজ করতে পারি। এক্ষেত্রে বারবার যোগ বিয়োগের কোড লেখার ঝামেলা থেকে মুক্তি পাওয়া গেল। মেথড প্রধানত দুই ধরনেরঃ
class Program { private int Sum(int a, int b) { int s = a + b; return s; } static void Main(string[] args) { int m = 10, n = 20; double j=2,k=3; String sum = ""; Program p = new Program(); sum = Convert.ToString(p.Sum(m, n)); Console.WriteLine(sum); String Pow = ""; Pow = Convert.ToString(Math.Pow(j, k)); Console.WriteLine(Pow); } }
এখানে, একটি ইউজার ডিফাইন ফাংশন Sum যা দুইটি সংখ্যার যোগফল রিটার্ন করে আর একটি সিস্টেম ফাংশন Pow ব্যবহার করা হয়েছে যা বিল্ট-ইন ক্লাস Math এর অন্তর্গত এবং যা প্রথম সংখ্যার দ্বিতীয় সংখ্যার সাপেক্ষে ঘাত বার করে।
ধন্যবাদ সবাইকে।
আমি জ্যোতি। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 13 বছর 11 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 17 টি টিউন ও 98 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 2 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
আমি জ্যোতি চৌধুরী। কম্পিউটার সাইন্স এন্ড ইঞ্জিনিয়ারিং এর ছাত্র। মিলিটারি ইন্সটিটিউট অফ সাইন্স এন্ড টেকনোলজি, মিরপুর ক্যান্টনমেন্ট এ পড়াশোনা করছি। ভাল লাগে বন্ধুদের সাথে আড্ডা দিতে, কম্পিউটার প্রযুক্তি সম্পর্কে জানতে। আগ্রহ আছে সফটওয়্যার ডেভেলপমেন্ট, প্রোগ্রামিং ও ওয়েব ডেভেলপমেন্টের প্রতি। স্বপ্ন দেখতে ভালবাসি। স্বপ্ন কে বাস্তবে রুপায়ন করতে পছন্দ করি।
ভাই অনেক সুন্দর করে বুজালেন
থেংকু….