বস্তুগত ধারণা : পাঠ -২

Offline Version: download বস্তুগত ধারণা : পাঠ -২

Source Code: download source code

গত পর্বে বলেছিলাম যে পাঠ-২ তে সব কিছু আরো ডিটেইল-এ বলবো। সুতরাং আজকের পর্ব পাঠ-১ এক এ যা বলেছি, সেগুলোই আবার বলার চেষ্টা করবো কিন্তু ভেতর থেকে। সাথে আরো কিছু জিনিস বলার চেষ্টা করবো।

আর যেহেতু বস্তুগত ধারণা (Object oriented concept) একটা ধারণা মাত্র, এই ধারণার রূপায়ণ থাকতেই হবে, ধারণার রূপায়ণ হিসেবে আমি জাভা দিয়ে উদাহরণ দেবো।

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

কম্পিউটার প্রোগ্রাম মূলত দুটি জিনিসের সমন্বয়ে তৈরি। সেই জিনিস দুটি হলো- কোড এবং ডাটা। এইটি যে কো কম্পিউটার প্রোগ্রামের জন্য সত্য। তো যখন প্রোগ্রাম লেখা হয়, তখন দুইটি ব্যাপার হয়- এক, প্রোগ্রামে লেখা থাকে কি হচ্ছে- অর্থাৎ “What is happening” দুই, কে প্রভাবিত হচ্ছে অর্থাৎ- “who is being affected”.  প্রথম ব্যপারটিকে বলা হয় – “Process oriented”. অর্থাৎ প্রোগ্রামটিতে অনেক গুলো ধাপে কার্যধারা লেখা থাকে। এইটার পর এইটা হবে ইত্যাদি। যেমন- আমাদের সবার প্রিয়- সি। এখন এই প্রক্রিয়ার অসুবিধা কোথায়, ইনফ্যাক্ট ভালই তো ছিল। এটি খারাপ, এই কথাটি কেও বলবে না কিন্তু আমাদের নিজেদের সুবিধার জন্যে আমরা একটু অগ্রসর হবো। আমরা এখন যে ধরণের এপ্লিকেশান তৈরি করি সাধরাণত অনেক বড়ো হয়, কোড বেইস এতো বিশাল হয় যে, যদি আমরা Process oriented পদ্ধিতে করি, এক সময় হারিয়ে ফেলবো। এটি আসলে প্রধাণ সমস্যা। তুমি যখনি হ্যালো ওয়ার্ল্ড টাইপ থেকে একটু বড়ো, কমপ্লেক্স এপ্লিকেশান লিখবে, বুঝতে পারবে, তোমার সমস্যা গুলো কোথায় হচ্ছে।

অনেক বড়ো প্রোগ্রামের জটিলতা থেকে বের হওয়ার উপায় খুজতে গিয়ে দ্বিতীয় উপায়টি আমাদের ভাবতে হয়েছে। এবং দ্বিতীয় উপায়টি হলো – আমাদের কাঙ্খিত ‘Object Oriented Concept’ । এই উপায়ে ডাটা নিয়ে আমাদের প্রধান মাথাব্যথা থাকে। এবং অবজেক্ট ওরিয়েন্টেড কনসেপ্ট এ অনেক সুবিধা আছে, সেগুলো আমরা ধীরে ধীরে বুঝতে শুরু করবো।

বিমূর্তন

ইংরেজী “abstraction” এই শব্দটির সাথে সবাই কম বেশি পরিচিত। এই শব্দটি আসলে কি তাই বলবো এখন। “object oriented concept” এর মূলেই রয়েছে এই শব্দটি। আমরা সাধারণত কোন জটিল বিষয়কে abstraction এর মাধ্যমে পরিচালনা করে থাকি। উদাহরণ দেই, মনো করো একটি কার। আমরা নিশ্চয় জানি, একটা কার একটা বস্তু দিয়ে তৈরি না। এর ভেতর হাজার হাজার ছোট ছোট যন্ত্রাংশ আছে যেগুলো মিলেই একটি কার। কিন্তু আমরা যখন সহজ করে বলি , এটি একটি কার, এটি চলে, একে ড্রাইভ করা যায়, এর মাধ্যমে এক যায়গা থেকে অন্য যাগয়া চলাফেরা করা যায়। এইসব যখন বলি, তখন আমরা এর ভেতরকার সব জটিলতাকে ইগনোর করি। এই ইগনোর করাকেই বিমূর্তণ বলে হয়।

এই বিমূর্তণ পদ্ধতিতে আমরা যখন কোন জটিল বিষয় নিয়ে কাজ করি তখন সাধারণত আমরা যাযকতন্ত্র প্রতিষ্ঠা করে থাকি, একে বলে যাজকতন্ত্রে শ্রেণীবিভাগ – ‘hierarchical classification’। একটি কারকে আমার দ্বিধাহীনভাবে বলতে পারি একটি জটিল(complex) সিস্টেম। ইউজার এন্ড এ হয়তো এটি একটা কার, কিন্তু আমরা যখন কার তৈরি করতে যাবো, তখন আমাদের প্রত্যেকটি বিষয় নিয়েই কাজ করতে হবে, প্রত্যেকটি ছোট ছোট অংশ একটা একটা করে তৈরি করতে হবে, কিন্তু আমরা যদি একটা একটা ছোট এবং ইউনিক পার্ট নিয়ে কাজ করতে শুরু করি, আমরা আসলে হারিয়ে যাবো। সহজ সমাধান হলো যাযকতন্ত্র। আমরা একটি কারকে বিভিন্ন ছোট ছোট manageable ক্ষুদ্রাংশে বিভক্ত করে ফেলবো। যেমন- স্টিয়ারিং, ব্রেকস, সিট বেল্ট, হিটিং, বাম্পার, বনেট, রেডিয়েটর,ইগনাইট সিস্টেম, লাইটিং, সেনসর ইত্যাদি। এখন আমাদের চিন্তা করতে সুবিধা হলো। আমরা এখন তৈরি করার সময় আলাদা আলাদা করে একটা একটা করে যাযক তৈরি করে পরে তাদের খুব সহজেই এসেম্বল করে দিতে পারবো। রিয়েল লাইফ এ কিন্তু কার তৈরির প্রক্রিয়াটি এমনই। ছোট্ট ছোট্ট যন্ত্রাংশ গুলোকে আলাদা আলাদা করে তৈরি করা হয়, এবং পরে এদেরকে এসেম্বল করা হয়।

এখন আমাদের এই  বিমূর্তণ প্রক্রিয়াটি যদি কম্পিউটার প্রোগ্রামিং এ প্রয়োগ করি তাহলে সেই প্রয়োগকৃত প্রোগ্রামটি হবে অবজেক্ট ওরিয়েন্টেড প্রোগ্রাম।

অবজেক্ট ওরিয়েন্টেড কনসেপ্ট তিনটি ভিত্তির উপর প্রতিষ্ঠিত। এদেরকে সংক্ষেপে পাই (PIE) বলে।

  •   P – Polymorphism
  •   I – Inheritance
  •   E – Encapsulation

ইনক্যাপসুলেশান:

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

এনক্যপুসুলেশানের মূল কথাই হলো এটি। আমরা একটা অবজেক্ট এর ভেতরের বস্তু গুলো হাইড করবো, এবং কিছু ইন্টারফেইস প্রভাইড করবো যেগুলো দিয়ে অবজেক্টির সাথে কথা বলা যায়। এই ইন্টারফেইস গুলো অন্য নাম হলো মেথড বা ফাংশন।

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

শুরুতেই বলেছি, একটা প্রোগ্রামে দুইট উপাদান থাকে, কোড এবং ডাটা। এই ক্ষেত্রে আমাদের একটা অবজেক্ট এ থাকবে ডাটা এবং মেথড।

এখন যেহেতু বলেছি, আমারা একসেস গুলোকে রেসট্রিক্ট করবো অর্থাৎ যেগুলোকে আমরা বাইরে এক্সপোজ করবো সেগুলোর সামনে পাবলিক (public) কিওয়ার্ড বসাবো। আর যেগুলোকে আমরা হাইড করবো সেগুলোর সামনে পাইভেট (private) কিওয়ার্ড বসাবো। আর-একটি কিওয়ার্ড আছে, প্রটেকটেড(protected) আমি এখনি এটি নিয়ে বলতে চাচ্ছি না। পরে কোন সময় বলবো।

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

এই উদাহরণ এর জন্য আমি একটি অবজেক্ট তৈরি করবো , যার নাম দিয়েছি, কার (Car) কারের মধ্যে একটি ইঞ্জিন থাকবে। ইঞ্জিনের মধ্যে সিলিন্ডার থাকবে। এবং ইঞ্জিনের কিছু রেস্ট্রিকশান আছে যেমন, সিলিন্ডার ৪ থেকে ১২ পর্যন্ত হতে পারে।  সুতরাং আমার দেখছি দুইটা অবজেক্ট কার এবং ইঞ্জিন। কার ইঞ্জিন ব্যবহার করবে। সুতরাং শুরুতে আমরা একটি ইঞ্জিন তৈরি করি।


package org.codexplo.oop2;

public class Engine {
private int cylinderCount;
private boolean running;

public Engine(int numberOfCylinders) {
setCylinderCount(numberOfCylinders);
}

public void start() {
if (!running) {
running = true;
}
}

public void stop() {
if (running) {
running = false;
}
}

public int getCylinderCount() {
return cylinderCount;
}

private void setCylinderCount(int cylinderCount) {
this.cylinderCount = cylinderCount;
}

public boolean isRunning() {
return running;
}
}

আমাদের ইঞ্জিন ক্লাসটি তে খেয়াল করো, দুইটা ডাটা আছে, এক সিলিন্ডার কাউন্ট, অর্থাৎ কয়টা সিলিন্ডারের ইঞ্জিন হবে এবং ইঞ্জিন কি রানিং না রানিং না তার জন্যে একটা বুলিয়ান ডাটা। এবং এগুলো আমরা প্রাইভেট করে রেখেছি, তার মানে আমরা যখন ইঞ্জিন অবজেক্টটি তৈরি করবো, তখন বাইরে থেকে এই ডাটা গুলো দেখা যাবে না। কিন্তু আমরা ইচ্ছে করলে সেগুলো মেথড দিয়ে একসেস করতে পারবো। যেমন- আমাদের isRunning() একটা পাবলিক মেথড আছে, সেটা দিয়ে আমরা জানতে পারবো, ইঞ্জিন এখন রানিং কিনা। কোডটিতে একটা প্রাইভেট মেথড ও আছে সটি হলো – setCylinderCount(int cylinderCount) এর মানে হলো, অবজেক্ট ক্রিয়েট করার পর আমরা চাইলেই ইঞ্জিনের সিলিন্ডার পরিবর্তন করতে পারবো না। তোমরা খেয়াল করলে দেখতে পাবে আমরা যখন কনস্ট্রাকটর লিখেছি, তখন এই মেথডটি কল করেছি, তার মানে আমরা যখন ইঞ্জিন অবজেক্টটি ক্রিয়ট করবো তখনি বলে দিতে হবে আমাদের কতটা সিলিণ্ডারের ইঞ্জিন চাই। আরো দুটি মেথড আছে, start() এবং stop()। এগুলো দিয়ে আমার ইঞ্জিন স্টার্ট এবং স্টপ করতে পারবো।

এখন তাহলে আমাদের কার তৈরি করে ফেলি।


package org.codexplo.oop2;

public class Car {
private static final int MIN_CYL = 4;
private static final int MAX_CYL = 12;

private String engineType;
private Engine engine;

public Car(int numberOfCylinder) {
if (numberOfCylinder < MIN_CYL || numberOfCylinder > MAX_CYL) {
engine = new Engine(MAX_CYL);
engineType = "V" + MIN_CYL;
} else {
engine = new Engine(numberOfCylinder);
engineType = "V" + numberOfCylinder;
}
}

public void start() {
engine.start();
}

public void turnOff() {
engine.stop();
}

public String getEngineType() {
return engineType;
}

public boolean isRunning() {
return engine.isRunning();
}
}

দেখো কার ক্লাসটিতে কিছু ডাটা আছে, যেমন engineType এবং engine

এখানে ইঞ্জিন ক্লাসটির অবজেক্ট আসলে ডাটা হিসেব কাজ করছে। আমরা একে এই দুইটিকে প্রাইভেট করে রেখেছি। আমরা চাইনা এগুলো সরাসরি বাইরে থেকে একসেস করা যাক। তারপর আমরা যখন কারের কনস্ট্রাকটর লিখেছি, দেখো আমরা কিছু লজিক এপ্লাই করেছি, ক্লাসটি অবশ্যই ৪-১২ সিলিন্ডারের হতে হবে নতুবা সেটি মিনিমাম ৪ সিলিন্ডারের ইঞ্জিন তৈরি করে কারের সাথে এড করবো। কারের মধ্যেও স্টার্ট এবং টার্নঅফ মেথড আছে এবং এই মেথড গুলো ইঞ্জিনের মেথড গুলোকে কল করে।

উপরে কিছু প্রাইভেট স্টেটিক ফাইনাল ডাটা আছে, সেগুলো কি তার ব্যাখ্যা অন্য একদিন দেবো, আপতত তোমরা যারা সি করে এসেছো, তার ধরে নাও এগুলো কনস্ট্যান্ট, সি তে যেভাবে ডিফাইন করে, আমরা সেইরকম কিছু একটা করেছি।

এই হচ্ছে আমাদের সুপার সিম্পল কার। এখন কারের মধ্যে তুমি যদি নতুন একটা কম্পোনেন্ট এড করতে চাও, করে ফেলো কোন সমস্যা নেই, যেমন তুমি যদি ব্রেকস এড করত চাও, তাহলে ব্রেকস নামে একট ক্লাস তৈরি করে এড করে দাও।

চলো আমরা দেখি কার কিভাবে কাজ করে..


package org.codexplo.oop2;

public class Startup {
private static int SIX_CYLINDERS = 6;

public static void main(String[] args) {
Car car = new Car(SIX_CYLINDERS);
car.start();
System.out.println(car.isRunning());
System.out.println(car.getEngineType());

car.turnOff();

System.out.println(car.isRunning());
}
}

এইতো হয়ে গেলো আমাদের সুপার সিম্পল কার।

আজ এ পর্যন্তই, পাঠ-৩ তে ইনহেরিট্যন্স নিয়ে কথা বলার চেষ্টা করবো। আর তোমরা যারা এই টিউটো ফলো করছো, তারা এসাইনমেন্ট হিসেবে একটা কারের আরও কিছু কম্পোনেন্ট এড করে আমাকে মেইল করতে পারো।

মেইল: anm_brr@live.com

Advertisements

2 Comments

  1. অর্ধেক পড়ে হাপিয়ে গেলুম। এটা যদি বাচ্চাকাচ্চাদের জন্য হয়, তাহলে কোড বেইস,process oriented জাতীয় শব্দ দেখেই পালাবে। অন্ততঃ আমি পালাতুম।

    আর বাংলায় বলাটা খুব ভালো, কিন্তু বাংলায় হঠাৎ কার আসার পরে বেশ কিছুক্ষন আ-কার উ-কার ভাবছিলাম। পরে দেখি গাড়ি। যদি খুব ছোট ছোট যায়গায় শব্দ পরিবর্তন করা হয়, তাহলে আমার মনে হয় জিনিষ টা আরো অনেক বেশি সহজ হবে বুঝার জন্য।

  2. বাংলায় কমপিউটার সায়েন্স এর এইধরনের টিউটোরিয়াল লিখবার ভাবনাটা অভিনব।তবে ইংলিশ টার্ম গুলোকে অপরিবর্তিত রেখে লিখলে আরো ভাল বোধগম্য হত।তাই আমার রিকোয়েষ্ট সেভাবে আরো টিউটোরিয়াল পোষ্ট করতে।

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s