OOP - সহজে বুঝি Abstraction

Photo from Unsplash

OOP-র প্রিন্সিপাল গুলোর মধ্যে অন্যতম গুরুত্বপূর্ণ হল Abstraction

একটা কাজ করতে অনেকক্ষেত্রেই কিন্তু আমাদের পুরো কাজটার নাড়ি-নক্ষত্র জানা জরুরী হয়ে পড়ে না, অর্থাৎ ওই কাজের জন্য একদম প্রয়োজনীয় জ্ঞান জেনে, বাকিটা না জেনেও সহজেই আমরা সেই কাজটা সেরে ফেলতে পারি। এই যে অভ্যন্তরীণ জটিল প্রক্রিয়াগুলোর উপর কোন নির্ভরতা ছাড়াই, পুরো কাজের সবটা না জেনেও, আমরা কাজটা করে ফেলার সক্ষমতা অর্জন করতে পারি, এটাই Abstraction

উদাহরণস্বরূপ, ধরা যাক, একজন user একটি sms পাঠাচ্ছে। user হিসেবে তিনি শুধুমাত্র জানেন, মেসেজটি লিখে সেন্ডারের নাম্বারে পাঠিয়ে দিতে হবে। কিন্তু মেসেজটি সেন্ডারের কাছে যাওয়ার পিছনে যে অনেক কমপ্লেক্স কাজ ইন্টারনালি সম্পাদন হয় সেটা তার জানা প্রয়োজন হয় না অথবা তার কাছ থেকে hide করে রাখা হয়।

এক্ষেত্রে, ইউজারের কাছ থেকে রিসিভারের কাছে এসএমএস যাওয়ার পদ্ধতি অনেকরকম হতে পারে। ধরা যাক, পদ্ধতিগুলো A, B, এবং C। পদ্ধতিগুলোতে ভিন্নতা এলেও তা কোনভাবে user এর sms পাঠানোর প্রক্রিয়াতে কোন প্রভাব ফেলবে না। আগে যদি অভ্যন্তরীণ ইমপ্লিমেন্টেশান A পদ্ধতিতে হয়ে থাকে, এবং পরবর্তীতে সেটি পরিবর্তন করে B কিংবা C পদ্ধতিতে নেয়া হয়, তার কিছুই কিন্তু একজন sms সেন্ডার জানবেন না। sms পাঠানোর ইন্টার্নাল ইমপ্লিমেন্টেশান ইউজার দেখছে না, সেটাতে ভিন্নতা এলেও, ইউজার সেটা বুঝতে পারবে না কারণ সেই অভ্যন্তরীণ ইমপ্লিমেন্টেশানটুকু পুরোপুরিভাবে ইউজারের কাছ থেকে লুকিয়ে রাখা হয়েছে।

এভাবে ইমপ্লিমেন্টেশানের উপরে কোন নির্ভরতা না রেখে , ইমপ্লিমেন্টেশান হাইডিং করাটাই Abstraction।

বাস্তব জীবনে Abstraction

Abstraction আরো ভালোভাবে বুঝার জন্য আমরা কিছু বাস্তব উদাহরণের কথা চিন্তা করতে পারি।

সকালে নাস্তার পর আপনি যখন এক কাপ গরম কফির স্বাদে চাঙ্গা হওয়ার জন্যে কফি মেশিনে কফির প্রয়োজনীয় উপকরণগুলো নিশ্চিন্তমনে ঢালতে থাকেন, তখন কি একবার আসলে ভাবা হয়, এই যে আমি কিছু উপকরণ দিয়ে দিলাম, এরপর একটা সুন্দর কফি আমার মাগে চলে আসল, এর মাঝামাঝি পর্যায়ে মেশিনটার ভেতরে ঠিক কি কি জটিল প্রক্রিয়া গুলো হল? কিংবা, ওয়াশিং মেশিনে গাদা গাদা কাপড়গুলো কিভাবে পরিষ্কার হয়ে চলে আসে আমাদের কাছে?

মাঝখানের এই প্রক্রিয়াগুলোর উপর নির্ভরশীল না হয়েও, না জেনেও কিন্তু আমরা এই কাজগুলো খুব সুন্দরভাবে করে ফেলতে পারি। এই যে, অভ্যন্তরীণ বেশ কিছু জটিল প্রক্রিয়াগুলোতে নির্ভরশীল না হয়েও, কিছু ন্যূনতম ধারণা দিয়েই কফি বানিয়ে ফেলা যায়, কিংবা ওয়াশিং মেশিন ব্যবহার করে ফেলা যায়, এটাই ওই কফি মেশিন কিংবা ওয়াশিং মেশিনের জন্যে আপনার Abstraction!

আমাদের দৈনন্দিন জীবনে মূলত Abstraction এর ব্যবহার প্রচুর। এই লেখাটি আপনি হয়ত যে ডিভাইস থেকে পড়ছেন, সেই ডিভাইসে কিভাবে কত কত প্রসেস এর পর আপনি এই লিখাটি দেখতে পাচ্ছেন, সেগুলোও কিন্তু আপনার চোখের আড়ালেই চলছে। কিন্তু সেসব আপনার ডিভাইস থেকে লিখাটি পড়ার জন্যে মোটেও প্রয়োজনীয় কিছু নয়। অর্থাৎ ঠিক যতটুকু প্রয়োজন ততটুকু ডেটাকে প্রকাশ করে অপ্রয়োজনীয় ডেটাগুলোকে সরিয়ে রাখা। এ কারণেই Abstraction কে “Shows Necessary” দ্বারা ডিফাইন করা হয়।

OOP তে Abstraction

এবার, আমরা OOP তে Abstraction ঠিক কিভাবে ব্যবহার করা যায় তা জানব। তবে সেটা জানার আগে, আমাদেরকে দেখতে হবে ঠিক কিভাবে আমরা Abstraction এর ধারণা পেয়ে থাকি!

ধরা যাক, একজন শিক্ষার্থীর কিছু তথ্য আমাদের কাছে দেয়া আছে। তথ্যগুলোর একটি চিত্র নিচে দেয়া হলঃ

  • Name
  • Roll
  • Class
  • Section
  • Height
  • Weight
  • Hobby

একজন শিক্ষার্থী সম্পর্কে বলতে গেলে প্রাথমিক ভাবে আমরা Name, Roll, Class ইত্যাদির ধারণা পাই। উপরোক্ত তথ্যগুলোতে খেয়াল করলে দেখব, একজন শিক্ষার্থী সম্পর্কে প্রাথমিক ধারণা লাভের জন্য তার Height, Weight কিংবা Hobby সম্পর্কে জানার প্রয়োজন নেই। একারণেই Abstraction-কে “Concept for Design Level” বলে।

আরও সহজভাবে বললে, Abstraction এর ধারণা একটি অবজেক্ট ঠিক কি করছে তাতে ফোকাস করে, কিভাবে করছে তাতে নয় কারণ কিভাবে করছে, সে বিষয়ে আমরা নির্ভরশীল নই।

দুটি অংশে Abstraction

Abstraction নিয়ে অনেক গল্প হল, এবার আরেকটু বিস্তারিত জানা যাক। Abstraction-কে জানতে দুটো ধারনা সম্পর্কে জানতে হবে। এগুলো হলঃ

  1. Know The Context
  2. Expose Only Important Things

Know The Context

আমাদের দৈনন্দিন জীবনে সবক্ষেত্রেই আমরা “Context” টার্মটির উপর নির্ভরশীল। এই বিষয় নিয়ে বিস্তারিত বুঝতে আমরা দুটি দৃশ্যপট কল্পনা করতে পারি। ধরা যাক, একজন যাত্রী একটি নির্দিষ্ট গন্তব্যস্থল থেকে অন্য একটি গন্তব্যস্থলে ট্রেন এর মাধ্যমে যাতায়াত করতে চাচ্ছেন। ট্রেনের টিকেট এর জন্যে তিনি একটি “Train Ticket Booking App” এর সাহায্য নিলেন।

এরপর যাত্রার সময়, ট্রেনটি বর্তমানে কোন জায়গায় আছে, তা ট্র্যাক করার জন্য তিনি একটি “Train Tracking App” এর সাহায্য নিলেন। লক্ষ্য করি, “ট্রেন” অবজেক্টটি এখানে দুটি অ্যাপের ক্ষেত্রেই কমন অবজেক্ট হলেও, দুটি ক্ষেত্রে অবজেক্টটির জন্য প্রয়োজনীয় তথ্যের ধরণ দুরকম।

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

Photo from Unsplash

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

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

মূলত আমরা ঠিক কোন কনটেক্সটে এগিয়ে যাচ্ছি, তার উপরে ভিত্তি করেই Abstraction এর ধারণাটি তৈরি হয়। Abstraction এর যে ধারণাটি আমরা পেলাম সেটার ইমপ্লিমেন্টেশানের ক্ষেত্রে আসে “কতটুকু expose” করতে হবে, তার ধারণা।

Expose Only Important Things

আমরা আমাদের পুরনো উদাহরণে ফিরে যাই। কফি মেকার দিয়ে কফি বানানোর ক্ষেত্রে আমাদের Abstraction গুলো ঠিক কি কি হতে পারে? পর্যাপ্ত পানি, কফি বীন, ইত্যাদি সরবরাহ করা এবং প্রসেসিং শেষে এক মাগ কফি হাতে পাওয়া। এক্ষেত্রে কিন্তু আমাদেরকে কফি মেকার মেশিনের ভেতরকার জটিল ইমপ্লিমেন্টেশানগুলো জানার প্রয়োজন হয়নি। কতটুকু পানির সাথে কতটুকু কফি বীন মেশিনটিতে ব্যবহৃত হয়েছে, কত টেম্পারেচার এ মেশিনটি কাজ করা শুরু করেছে, এসব প্রশ্ন কিন্তু আপনার কফি তৈরীর প্রক্রিয়ায় মোটেও প্রয়োজনীয় নয়।

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

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

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

এবার, একটি জিপ ফাইল-কে আনজিপ করার ক্ষেত্রেই ধরা যাক।

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

অর্থাৎ যত ভিন্ন ভিন্ন ইমপ্লিমেন্টেশানই দেই না কেন, প্রত্যেকটি ইমপ্লিমেন্টেশানের জন্য জিপ ফাইলটি এবং ডিরেক্টরি ইনফোটি এক্সপোস করলাম। এখন যেকোনও ইমপ্লিমেন্টেশানে একটি জিপড ফাইল এবং একটি ডিরেক্টরি দিলে ঐ ইমপ্লিমেন্টেশানটি ঐ ডিরেক্টরিতে ঐ জিপড ফাইলকে আনজিপ করে দিবে।

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

ইমপ্লিমেন্টেশান হাইড করার মাধ্যমে ইমপ্লিমেন্টেশানের উপর নির্ভরতা না রাখার কারণেই Abstraction-কে এক কথায় বলা হয় ইমপ্লিমেন্টেশান হাইডিং

এভাবেই, কোন context এর উপর ভিত্তি করে কতটুকু expose করতে হবে, এ দুটোর উপর ভিত্তি করেই Abstraction তৈরি হয়।

Abstraction এর প্রয়োজনীয়তা

এতক্ষণ পর্যন্ত আমরা যা যা জানলাম, তার ভিত্তিতে আমরা খুব সহজেই Abstraction এর প্রয়োজনীয়তা অনুধাবন করতে পারি।

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

--

--