Ukieweb

Diary

I write here what I learn

Data Encapsulation [Bangla]

Data Encapsulation [Bangla]

আসসালামুআলাইকুম, সবাই কেমন আছেন? যেমনই থাকেন ব্যাপার না, আজকের বিষয় হলো OOP এর Encapsulation. অর্থাৎ Data Encapsulation. শুনতেই কেমন যেন একটা জটিল জটিল বিষয় মনে হচ্ছে। হয়তো ভাবছেন এহেন কম্ম আমার দ্বারা সম্ভব নহে। কিন্তু সত্যি কথা বলতে বিষয়টা মোটেই জটিল কিছু নয় বরং একটু মনোযোগ দিয়ে খেয়াল করলে দেখবেন এটির মতো সহজ বিষয় খুব কমই আছে। তাহলে চলুন একটু যেনে নেই এনক্যাপসুলেশন কি?

Encapsulation

আমি কোনো বইয়ের সঙ্গা দিবো না। বইতো অনেক পড়লাম এবার নাহয় একটু নিজের মতো করে বাস্তবিক বিষয় থেকে বোঝার চেষ্টা করি। উপরের ছবিটা দেখেই হয়তো বুঝতে পারছেন Encapsulation কি? হুম এনক্যাপসুলেশন হলো ডাটার উপরে একটি কাল্পনিক আবরন যাতে বাহির থেকে একে সরাসরি ব্যবহার না করা যায়। এখনো বুঝেন নাই? অকা, প্রবলেম নাই আরো খুলে বলছি, আহা অন্য কিছু মিন করি নাই অর্থাৎ বুঝিয়ে বলছি :D ।
ধরুন আপনার কাছে কিছু চিনি আছে, [তার মানে আপনাকে চা খেতে বলি নাই] তো এই চিনি আপনি বিভিন্নভাবে রাখতে পারেন। কিভাবে রাখবেন সেটা নির্ভর করে আপনার কাছে চিনির প্রয়োজনীয়তা কিরকমের তার উপরে। ধরুন আপনি চাচ্ছেনঃ

  • চিনি টেবিলের উপরে একটা খোলা বাটিতে থাকবে যাতে যেকোনো সময় যেকেউ সেটা ব্যবহার করতে পারে
  • অথবা আপনি চাচ্ছেন চিনি একটা বাটিতেই রাখবেন কিন্তু সেটা ঠেকে রাখবেন যাতে পোকা মাকড়ে না খেতে পারে
  • অথবা আপনি চাইলে আপনার চিনি একটা জারে রাখলেন এবং সেটা আলমারির ভিতর তালা বন্ধ করে রাখলেন যাতে আপনি ছাড়া সেটি অন্য কেউ না ব্যবহার করতে পারে

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

আর class এর Properties ও Method কে সকলের এক্সেসের উপর সিকিউরিটি প্রদান করাকেই বলা হয় Encapsulation . অর্থাৎ ফার্মাসিটিউক্যাল কম্পানিগুলো মেডিসিনকে ক্যাপসুলের মাধ্যমে যেভাবে সুরক্ষা দেয় ঠিক তেমনি একইভাবে Encapsulation ও class এর ডাটা কে সুরক্ষা প্রদান করে।

Data Access Level

Encapsulation ডাটাকে তিন ধরনের নিরাপত্তা প্রদান করে। আমি একে একে সবগুলোই বর্ননা করবো। শুধু একটু মনোযোগ দিয়ে পড়তে হবে। এনক্যাপসুলেশনের এক্সেস লেভেলগুলো হলো

  1. Private
  2. Protected
  3. Public

Private

Private শব্দটা শুনলেই ব্যক্তিগত ব্যক্তিগত ব্যপার মনে হয়। তাহলে class এর ক্ষেত্রে private জিনিসটা কি? চলুন তার আগে একটি উধাহরন দেখে নেই,

জমিজমা সম্পর্কে সবারই মোটামুটি ধারনা আছে, ধরুন আপনার বাবার ঢাকা শহরে ১০০ কাঠা জমি আছে [খুশি হবার কারন নাই, ইহা একটি উচ্চ বংশিয় কল্পনা মাত্র]। কিন্তু তিনি জীবনের এ পর্যায়ে এসে দেখলেন আপনারা তার খোজ খবর ঠিক মতো নেন না, তাই তিনি সিদ্ধান্ত নিলেন ১০০ কাঠা থেকে ২০ কাঠা তিনি তার নিজের নামে চূড়ান্তভাবে লিখে রাখবেন যাতে এ জমির উপর অন্য কারো কোনো অধিকার না থাকে বা অধিকার প্রয়োগ না করতে পারে। এটি শুধুই তার ব্যক্তিগত সম্পত্তি। যার উপর আপনাদের বা বাহিরের কারোই কোনো প্রকার অধিকার বা এক্সেস নাই। এবার এটিকে আমরা OOP Coding স্টাইলে দেখে নেই। আমি কোডিং এর সকল উধাহরনগুলো PHP তে দিবো, কোডিং এর উধাহরনটিও সম্পত্তি দিয়েই দেই

class FathersProperties
{
	private function personalProperties()
	{
		return '20 Katha of land is my personal properties';
	}
}

$property=new FathersProperties;
echo $property->personalProperties();

দেখুন আমাদের class হলো FathersProperties এবং এর একটি private method আছে personalProperties() নামে। আমরা যখন class টির object তৈরী করে বাহির থেকে এর private properties/method কে এক্সেস করতে যাচ্ছি তখন কিন্তু তাকে এক্সেস করা যাবে না। কারন এটি কেবল মাত্র FathersProperties class এর private method. একে কেবল মাত্র এ নিজেই ব্যবহার করতে পারবে অন্য আর কেউই এর এক্সেস পাবে না আর এটাই হলো private এক্সেস লেভেল। আপনি যখনই private method/properties কে বাহির থেকে এক্সেস করতে যাবেন PHP আপনাকে এরকম একটি Error দেখাবে

Fatal error: Call to private method FathersProperties::personalProperties() from context

অর্থাৎ private method অথবা properties শুধুমাত্র ঐ class নিজেই ব্যবহার করতে পারবে অন্য কেউই এমনকি এর চাইল্ড ক্লাস ও এর এক্সেস পাবে না। আর এই সিকিউরিটি যে কিওয়ার্ডের মাধ্যমে দেয়া হয় তাই হলো private

Protected

Private তো দেখলাম তাহলে protected কি জিনিস? এবার আপনার বাবার জমিটিকে আরেকটু ভাগ করি। ধরে নিলাম তিনি তার বাকি ৮০ কাঠা জমির ২০ কাঠা তার পরিবারের জন্য লিখে দিছেন। তারমানে কি দাড়ালো? এ জমির দাবিদার এখন কে কে? এ ২০ কাঠা জমি আপনার বাবা, মা, ভাই ও বোন সকলেরই অধিকার আছে। অর্থাৎ আপনার প্যারেন্ট ও তার চাইল্ড সকলেই এ জমির দাবিদার। কিন্তু এ জমিতে কি বাহিরের লোক এসে দাবি করতে পারবে যে এ জমির মালিক সে? এখানে বাহিরের অর্থাৎ জনসাধারনের কোনো এক্সেস নাই। class এ এই কাজটিকেই বলা হয় protected

//parent
class FathersProperties
{
	private function personalProperties()
	{
		return '20 Katha of land is my personal properties';
	}

	protected function familyProperties()
	{
		return '20 Katha of land is allocate for my family';
	}
}

//child
class NewFamily extends FathersProperties
{
	public function myProperties()
	{
		return $this->familyProperties();
	}
}

$property=new NewFamily;
echo $property->myProperties();

Output

20 Katha of land is allocate for my family

খেয়াল করে দেখুন, familyProperties() মেথডটি parent class এ declare করা হয়েছে কিন্তু আমি এটিকে child class এও ব্যবহার করতে পারছি, কিন্তু যদি familyProperties() আমরা পাবলিকলি ব্যবহার করতে চাইতাম তাহলে কি হতো? চলুন দেখি

$property=new NewFamily();
echo $property->familyProperties();

আমরা কখনোই protected মেথড অথবা প্রোপার্টিজকে কখনোই পাবলিকলি ব্যবহার করতে পারবো না। পাবলিকলি ব্যবহার করলে নিচের মতো ইরর পাবেন

Fatal error: Call to protected method FathersProperties::familyProperties() from context

যে বিষয়টি খুব ভালো করে মনে রাখতে হবে তাহলো protected method অথবা properties কে আপনি প্যারেন্ট ক্লাস ও তার চাইল্ড ক্লাস অর্থাৎ inherited class এ ব্যবহার করতে পারবেন কিন্তু বাহির থেকে অর্থাৎ পাবলিকলি এর এক্সেস পাবেননা। protected class এর মেথড ও প্রোপার্টিজ কে পাবলিকলি এক্সেস থেকে বিরত রাখে।

Public

শুনেই বোঝা যাচ্ছে এর কাজ কি। যাই হোক আপনার বাবার জমিতে ফিরে যাই, তার জমির বাকি রইলো ৪০ কাঠা। তো সে ভাবলো এলাকার পোলাপাইন খেলাধুলার যায়গা পায় না তাদের খেলাধুলার জন্য এই ৪০ কাঠা জমি লিখে দিবেন। যেই বলা সেই কাজ, সে তার বাকি ৪০ কাঠা জমি এলাকায় একটি মাঠের জন্য লিখে দিলো। এতে করে কি হলো? হ্যা জমিটি গন হয়ে গেলো অর্থাৎ এ জমিটি এখন public প্রোপার্টিজ। এখানে সবার এক্সেস আছে। আর class এর ক্ষেত্রে এ পার্মিশানটিকেই বলে public.

class FathersProperties
{
	private function personalProperties()
	{
		return '20 Katha of land is my personal properties';
	}

	protected function familyProperties()
	{
		return '20 Katha of land is allocate for my family';
	}

	public function publicProperties()
	{
		return 'This properties is allocated for publicly use';
	}
}


$property=new FathersProperties;
echo $property->publicProperties();

Output

This properties is allocated for publicly use

দেখুন আমরা publicProperties() টিকে publicly declare করেছি যার ফলে আমরা এটিকে class এর বাহিরে ব্যবহার করতে পারছি। public মেথেড অথবা প্রোপার্টিজ যেকোনো জায়গায় ব্যবহার করা যায় অর্থাৎ এর এক্সেস যেকোনো জায়গায়ই পাওয়া যাবে, সেটি হোক প্যারেন্ট ক্লাস অথবা Inherited ক্লাস অথবা অন্য কোথাও সবখানেই এর এক্সেস আছে।

এটিই ছিলো মোটামুটি Encapsulation এর ধারনা, আমার জানায় হয়তোবা ভূল থাকতে পারে কমেন্টে ভূল সংশোধন করিয়ে দিলেই খুশি হবো :)

সবাই ভালো থাকবেন, অকা :D

0 Comments

To make a comment you have to login