ওহে! আসুন আজকের পাঠটি এনক্যাপসুলেশনের জন্য উত্সর্গ করি এবং এখনই উদাহরণ দিয়ে শুরু করি :) এখানে আপনার কাছে একটি সাধারণ সোডা মেশিন রয়েছে । আমি আপনার জন্য একটি প্রশ্ন আছে: এটা কিভাবে কাজ করে? একটি বিশদ উত্তর দেওয়ার চেষ্টা করুন: কাপটি কোথা থেকে আসে, অভ্যন্তরীণ তাপমাত্রা কীভাবে বজায় থাকে, বরফ কোথায় সংরক্ষণ করা হয়, মেশিনটি কীভাবে জানে কোন সিরাপ যোগ করতে হবে ইত্যাদি? এই প্রশ্নগুলোর উত্তর সম্ভবত আপনার কাছে নেই। যথেষ্ট ন্যায্য, যেহেতু সবাই এই ধরনের মেশিন ব্যবহার করে না। তারা আজকাল তেমন জনপ্রিয় নয়। আরেকটি উদাহরণ দেওয়ার চেষ্টা করা যাক। এমন কিছু যা আপনি প্রতিদিন অনেকবার ব্যবহার করেন। ওহ, এখানে একটি ধারণা! কিভাবে গুগল সার্চ ইঞ্জিন আমাদের বলুনকাজ করে আপনার লেখা শব্দগুলির সাথে সম্পর্কিত তথ্যের জন্য এটি ঠিক কীভাবে অনুসন্ধান করে? কেন নির্দিষ্ট ফলাফল উচ্চ র্যাঙ্ক করা হয় এবং অন্যদের নয়? যদিও আপনি প্রতিদিন Google ব্যবহার করেন, সম্ভাবনা আছে, আপনি জানেন না। কিন্তু এটা কোন ব্যাপার না. আপনার এটা জানার দরকার নেই। এটি কীভাবে কাজ করে সে সম্পর্কে চিন্তা না করে আপনি অনুসন্ধান ইঞ্জিনে প্রশ্নগুলি প্রবেশ করতে পারেন৷ আপনি এটি কিভাবে কাজ করে তা না জেনে একটি মেশিন থেকে সোডা কিনতে পারেন। একটি অভ্যন্তরীণ দহন ইঞ্জিন কীভাবে কাজ করে তা না বুঝেই, এমনকি প্রাথমিক বিদ্যালয়ের স্তরেও পদার্থবিদ্যা না জেনেই আপনি গাড়ি চালাতে পারেন। অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের অন্যতম প্রধান নীতির জন্য এই সব সম্ভব: এনক্যাপসুলেশন. অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর উপর বিভিন্ন নিবন্ধ পড়ে আপনি নিশ্চয়ই বুঝতে পেরেছেন যে প্রোগ্রামিং-এ দুটি সাধারণ ধারণা জড়িত: এনক্যাপসুলেশন এবং লুকানো । এবং লেখকরা "এনক্যাপসুলেশন" শব্দটি একটি জিনিস এবং তারপরে অন্যটি বোঝাতে ব্যবহার করেন। আমরা উভয় পদই অন্বেষণ করব যাতে আপনি একটি সম্পূর্ণ বোধগম্যতা লাভ করেন। প্রোগ্রামিং-এ, এনক্যাপসুলেশনের মূল অর্থ হল ডেটা বান্ডেল করা, সেই সাথে সেই ডেটার উপর কাজ করে এমন পদ্ধতিগুলিকে একক ইউনিটে (যেমন "ক্যাপসুল")। জাভাতে, ক্লাস হল এনক্যাপসুলেশনের একক। একটি ক্লাসে এই ডেটার সাথে কাজ করার জন্য ডেটা (ক্ষেত্র) এবং পদ্ধতি উভয়ই রয়েছে।এটি আপনার কাছে স্পষ্টতই সঠিক পদ্ধতির মতো মনে হতে পারে, তবে অন্যান্য প্রোগ্রামিং দৃষ্টান্তে, সবকিছু আলাদাভাবে সাজানো হয়েছে। উদাহরণস্বরূপ, কার্যকরী প্রোগ্রামিংয়ে, ডেটা কঠোরভাবে এটির অপারেশন থেকে আলাদা করা হয়। ওওপি-তে, প্রোগ্রামগুলি ক্যাপসুল বা ক্লাস নিয়ে গঠিত, যা সেই ডেটার সাথে কাজ করার জন্য ডেটা এবং ফাংশন উভয়ই নিয়ে গঠিত। এখন আড়াল সম্পর্কে কথা বলা যাক . এটা কিভাবে হয় যে আমরা সব ধরণের জটিল ডিভাইস ব্যবহার করি তারা কিভাবে সংগঠিত বা কিভাবে কাজ করে তা না বুঝেই? এটা সহজ: তাদের নির্মাতারা আমাদের একটি সহজ এবং সুবিধাজনক ইন্টারফেস প্রদান করেছেন. একটি সোডা মেশিনে, ইন্টারফেসটি প্যানেলের বোতামগুলি। একটি বোতাম টিপে, আপনি কাপের আকার চয়ন করুন। অন্য টিপে, আপনি স্বাদ নির্বাচন করুন. এক তৃতীয়াংশ বরফ যোগ করার জন্য দায়ী। এবং যে সব আপনি কি করতে হবে. মেশিনের অভ্যন্তরীণ সংগঠন কোন ব্যাপার না। কী গুরুত্বপূর্ণ তা হল এটি এমনভাবে ডিজাইন করা হয়েছে যাতে ব্যবহারকারীকে সোডা পেতে তিনটি বোতাম টিপতে হয় । গাড়ির ক্ষেত্রেও একই কথা। ভিতরে কি ঘটছে এটা কোন ব্যাপার না. যেটা গুরুত্বপূর্ণ তা হল আপনি যখন ডান প্যাডেল টিপবেন, গাড়িটি সামনের দিকে এগিয়ে যাবে এবং আপনি যখন বাম প্যাডেল টিপবেন, তখন এটি ধীর হয়ে যাবে।. যে পরিমাণ লুকানো কি. একটি প্রোগ্রামের সমস্ত "ভিতরে" ব্যবহারকারীর কাছ থেকে লুকানো হয়। ব্যবহারকারীর জন্য, এই অপ্রয়োজনীয়, অপ্রয়োজনীয় তথ্য. ব্যবহারকারীর শেষ ফলাফল প্রয়োজন, অভ্যন্তরীণ প্রক্রিয়া নয়।
Auto
আসুন একটি উদাহরণ হিসাবে ক্লাস দেখুন :
public class Auto {
public void go() {
/* Some complicated things happen inside the car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside the car.
As a result, it slows down. */
}
public static void main(String[] args) {
Auto auto = new Auto();
// From the user's perspective,
// one pedal is pressed and the car accelerates.
auto.gas();
// The other is pressed, and the car slows down.
auto.brake();
}
}
জাভা প্রোগ্রামে লুকানো বাস্তবায়ন কেমন দেখায় তা এখানে। এটি বাস্তব জীবনের মতোই: ব্যবহারকারীকে একটি ইন্টারফেস (পদ্ধতি) দেওয়া হয়। যদি ব্যবহারকারীর একটি কর্ম সঞ্চালনের জন্য একটি প্রোগ্রামে একটি গাড়ির প্রয়োজন হয়, তবে তিনি কেবল পছন্দসই পদ্ধতিটি কল করেন। এই পদ্ধতিগুলির ভিতরে যা ঘটে তা অপ্রয়োজনীয়। যেটা গুরুত্বপূর্ণ তা হল সবকিছু যেমন উচিত তেমন কাজ করে। এখানে আমরা বাস্তবায়ন লুকানোর কথা বলছি । তা ছাড়া, জাভাতে ডেটা লুকানোও রয়েছে । আমরা গেটার এবং সেটারের পাঠে এটি সম্পর্কে লিখেছি , তবে ধারণাটি পর্যালোচনা করলে ক্ষতি হবে না। উদাহরণস্বরূপ, আমাদের একটি Cat
ক্লাস আছে:
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Meow!");
}
}
সম্ভবত আপনি শেষ পাঠ থেকে এই ক্লাস সঙ্গে সমস্যা মনে আছে? যদি না হয়, এখন এটা মনে রাখা যাক. সমস্যা হল যে এর ডেটা (ক্ষেত্রগুলি) সবার জন্য উন্মুক্ত — অন্য একজন প্রোগ্রামার সহজেই 0 এবং -1000 বছর বয়সের একটি নামহীন বিড়াল তৈরি করতে পারে:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
হয়তো আপনি আপনার সহকর্মীদের মধ্যে একজন অবৈধ অবস্থার সাথে বস্তু তৈরি করেছেন কিনা তা ঘনিষ্ঠভাবে নজর রাখতে পারেন, তবে এই ধরনের "অবৈধ বস্তু" তৈরি করার সম্ভাবনাও বাদ দেওয়া অনেক ভালো হবে। নিম্নলিখিত প্রক্রিয়াগুলি আমাদের ডেটা লুকিয়ে রাখতে সাহায্য করে:
- অ্যাক্সেস মডিফায়ার ( ব্যক্তিগত , সুরক্ষিত , প্যাকেজ ডিফল্ট )
- গেটার এবং সেটার্স
- একটি বস্তুর সঠিক অবস্থা নিয়ন্ত্রণ. উপরে এই উদাহরণ ছিল. একটি সেটার এবং ব্যক্তিগত সংশোধক নিশ্চিত করে যে আমাদের প্রোগ্রামে এমন বিড়াল থাকবে না যার ওজন 0।
- একটি ইন্টারফেসের মাধ্যমে ব্যবহারকারী-বন্ধুত্ব। শুধুমাত্র পদ্ধতিগুলিকে বাইরের বিশ্বের কাছে "উন্মুক্ত" করা হয়। ফলাফল পাওয়ার জন্য কলিং পদ্ধতিই যথেষ্ট — তারা কীভাবে কাজ করে তার বিশদ বিবরণে অনুসন্ধান করার একেবারেই দরকার নেই।
- কোড পরিবর্তন ব্যবহারকারীদের প্রভাবিত করে না। আমরা পদ্ধতিগুলির ভিতরে যে কোনও এবং সমস্ত পরিবর্তন করি। এটি পদ্ধতির ব্যবহারকারীকে প্রভাবিত করে না: গ্যাস প্যাডেল প্রয়োগ করার জন্য যদি সঠিক কোডটি আগে "auto.gas()" ছিল, তাহলে এটি চলতে থাকবে। আমরা গ্যাস() পদ্ধতির ভিতরে কিছু পরিবর্তন করেছি তা ব্যবহারকারীর কাছে অদৃশ্য থেকে যায়: আগের মতো, কলকারী কেবল পছন্দসই ফলাফল পায়।
GO TO FULL VERSION