Object Oriented Programming(OOP): Part-1 (Data Hiding and Abstraction)
প্রোগ্রামিং দুনিয়ায় খুব গুরুত্বপূর্ণ একটি কন্সেপ্ট হচ্ছে OOP. একজন প্রোগ্রামারের যে বিষয়গুলো না জানলেই নয় সেগুলোর মধ্যে অন্যতম হচ্ছে OOP. তাই OOP সম্পর্কে খুব ভাল মত জানা খুব জরুরী। প্রথম পর্বে আমরা জানবো OOP এর খুব গুরুত্বপূর্ণ ফিচার Data Hiding এবং Abstraction নিয়ে।
Data Hiding কী?
নাম দেখেই বুদ্ধিমানরা অনুমান করে ফেলছেন নিশ্চয়ই যে এটা ডাটা লুকিয়ে রাখা সংক্রান্ত। হ্যাঁ বিষয়টা একদম তাই। কিন্তু ডাটা লুকিয়ে রাখবো কাদের কাছে থেকে? ডাটা লুকিয়ে রাখার দরকারটাই বা কি? লুকিয়ে রাখবোই বা কিভাবে?
Data Hiding এর মূল ব্যাপারটা হচ্ছে Data যেন বাইরের কেউ এক্সেস করতে না পারে এবং ডেটা কেউ সরাসরি এক্সেস করতে না পারে; পর্যাপ্ত validation/authentication এর পরেই যেন ডেটার এক্সেস পাওয়া যায়।
বলা হচ্ছে Data is the new oil. এ থেকে অনুমান করা যায় বর্তমানে Data ঠিক কতটা গুরুত্বপূর্ণ এবং মহামূল্যবান। আর তাই এই মহামূল্যবান জিনিসের প্রয়োজন নিরাপত্তা। এই নিরাপত্তার খাতিরেই প্রয়োজন- Data Hiding.
Data Hiding বলতে বুঝায় ডেটাকে সুরক্ষিত রাখার জন্য লুকিয়ে রাখা।
একটা উদাহরণ দিলে ব্যাপারটা আরো পরিষ্কার হবে। আমরা সবাই বিকাশ-এর সাথে পরিচিত। বিকাশের মাধ্যমে টাকা লেনদেন করা যায়। বিকাশে আমাদের সকলের একটা ব্যক্তিগত পাসওয়ার্ড থাকে যা খুব ই গোপনীয়। এই পাসওয়ার্ড দিয়ে আমারা আমদের একাউন্টে এক্সেস পাই। পাসওয়ার্ড মূলত এখানে একাউন্ট validation
এর কাজটা করে দেয়। যেহেতু আমার পাসওয়ার্ড শুধু আমি জানি। সেক্ষেত্রে সঠিক পাসওয়ার্ড দেয়ার পর প্রমাণিত হবে যে একাউন্টটা আমার এবং একাউন্টের তথ্যের এক্সেস পাওয়ার অধিকার আমার আছে। যেহেতু আমার পাসওয়ার্ড যেহেতু অন্য কেউ জানে না সেক্ষেত্রে বাইরের কেউ আমার একাউন্টের ইনফরমেশন জানতে পারবে না বা টাকা হাতিয়েও নিতে পারবে না। যদি বিকাশের একাউন্টে এই সুবিধা না থাকতো, যদি যে কেউ যে কারো তথ্য জানতে পারতো তবে কি কেউ বিকাশ একাউন্ট খুলতো? অবশ্যই না। এই যে আমাদের ডেটা গুলোকে নিরাপদ রাখার খাতিরে বাহিরের মানুষের কাছে থেকে আমার ডেটা লুকিয়ে রাখার ব্যাপারটা। এটাই হচ্ছে Data Hiding!
Data Hide করবো কীভাবে?
Data Hiding ব্যাপারটা তো বুঝলাম কিন্তু ডেটা হাইড করবো কীভাবে? ডেটা হাইড করতে হলে আমাদের কোডে যেই Data Member (variable) গুলো আছে সেগুলোর সামনে একটি “private” keyword বসাতে হবে।
এতে করে আমদের ডেটা গুলো private হয়ে যাবে এবং সেগুলো আর কেউ সরাসরি এক্সেস করতে পারবে না।
Data Hide হয়ে গেল। এখন এই Data এক্সেস পাওয়ার জাদুমন্ত্রটা কী? খুব সহজ। এ জন্য আমদের getter ফাংশন ইউজ করতে হবে। একটি সিম্পল কোডিং example দেখা যাকঃ
এখানে balance variable টি private করে দেয়া হয়েছে। ফলে এটি সরাসরি এক্সেস করা যাবে না। এই variable এর value জানতে হলে আমদের getBalance() ম্যাথডটি ব্যবহার করতে হবে।
getBalance() মেথডের ভিতরে আমরা validation কোড লিখতে পারি যেটা verify করে দেখবে আমি একাউন্টের মালিক কিনা। যদি আমার সঠিক পাসওয়ার্ড জানা থাকে সেক্ষত্রে মেথডটি আমদের balance রিটার্ন করবে। getBalance() এর মত এমন মেথডগুলোকে আদর করে getter বলে ডাকা হয়।
এইভাবে ডেটা হাইড করার পদ্ধতিকেই বলা হয় Data Hiding.তো নেক্সট টাইম কোড লেখার সময় আমরা সবসময় প্রতিটি variable কে অবশ্যই private করে দিব এবং variable এর data পেতে getter(যেমন getBalance)
method ব্যবহার করবো । তবেই আমদের কোডের data গুলো
সুরক্ষিত থাকবে এবং OOP এর খুব চমৎকার ফিচার Data Hiding আমরা আমদের কোডে implement করতে পারবো।
একটি কুইজঃ উপরের কোডে আমরা getBalance() মেথদের মাধ্যমে balance কত সেটা জানতে পেরেছি। প্রশ্ন হচ্ছে আমরা যদি balance এ কোন সংখ্যা এসাইন বা সেট করতে চাই সেক্ষেত্রে আমরা কি করবো? যেহেতু balance একটি private variable তাই সরাসরি আমরা এক্সেস করতে পারবো না। সেক্ষেত্রে আমরা balance এ ডেটা সেট করতে হলে আমদের কি করতে হবে?
Abstraction
এবার আমরা আলোচনা করবো OOP এর আর একটি কন্সেপ্ট abstraction নিয়ে। কোডিং এর ভারি ভারি কথা বলার আগে আমরা খুব সিম্পলভাবে abstraction নিয়ে একটু ভেবে দেখি। abstraction আসলে কি বোঝায়? একটা আইডিয়া নিয়ে আমরা যখন চিন্তা করি তখন ওই আইডিয়াটা একদম শুরুর দিকে বাস্তবে রূপ নেয়ার আগে যে অবস্থায় থাকে তাকে আমরা abstract আইডিয়া বলতে পারি। ধরুন আপনার মাথায় একটা চিন্তা আসলো আপনি ছুটিতে বন্ধুদের সাথে কোথাও ঘুরতে যাবেন। কোথায় ঘুরতে যাবেন, কি কি খাবেন, কিভাবে যাবেন, কবে যাবেন, কতদিন থাকবেন সেটা আপনি জানেন না। আপনি শুধু এতটুকুই চিন্তা করেছেন যে আপনি ঘুরতে যাবেন। সেক্ষেত্রে আমরা বলতে পারি আপনার চিন্তাটা একটি abstract আইডিয়া। কেননা এটার implementation আপনার অজানা।
বাংলাদেশে আমরা দালাল শব্দটার সাথে খুব বেশি পরিচিত। টাকার বিনিময়ে তারা আমাদের অনেক কঠিন কাজ সহজে করে দেয়। এক্ষত্রে আপনি জানেন না সে কিভাবে কাজটি করে দিবে। আপনি শুধু তার সার্ভিস জানেন যে সে টাকার বিনিময়ে আপনাকে কি কি সার্ভিস দিতে পারবে। কিভবে কাজটা করবে সেটা তার internal ব্যাপার। সে কিভাবে কাজ করবে এটা আপনি জানতে চাইলেও সে আপনাকে বলবে না। এটা তার ব্যবসাকে টিকিয়ে রাখার জন্য একটা সিকিউরিটি বলতে পারেন। এই যে সে তার কাজের internal ব্যাপার গোপণ রেখে আপনার সামনে শুধুমাত্র তার সার্ভিস গুলো পেশ করছে। এটাকেই আমরা Abstraction বলতে পারি।
আরো একটা উদাহরণ আমরা দেখে আসি। আপনারা সবাই ATM মেশিনের সাথে পরিচিত। টাকা উত্তলনের সহজ একটি মাধ্যম এই ATM মেশিন।
ATM মেশিনে কার্ড পাঞ্চ করার পর আপনি GUI স্ক্রিনে অনেকগুলো অপশন দেখতে পারবেন। তাদের সার্ভিস গুলো দেখতে পারবেন। টাকা উত্তলোনের জন্য, ব্যালেন্স চেক করার জন্য, রিসিপ্ট নেয়ার জন্য এমন কয়েকটা সার্ভিস আপনি দেখতে পারবেন। আপনি যে সার্ভিসটি নিতে ইচ্ছুক আপনি নিতে পারবেন। কিন্তু আপনি চাইলে তারা কিভাবে এই সার্ভিসটি দিচ্ছে, কোন সার্ভারে রিকুয়েস্ট যাচ্ছে, কোন ডেটাবেসে সেভ হচ্ছে, কোন ল্যাঙ্গুয়েজ ব্যবহার করে কোড লেখা আছে,কোন কোন লজিকে কাজটি হচ্ছে, আদৌ কোন লজিকে কাজটি হচ্ছে নাকি ইহা কোন জাদুমন্ত্র আপনি কিছুই দেখতে পারবেন না, জানতে পারবেন না। GUI স্ক্রিণে শুধুমাত্র আপনি সার্ভিস গুলোই দেখতে পারবেন। এই যে internal implementation গোপণ রেখে শুধু set of services গুলো দেখানো। এটাকেই বলে abstraction.
Internal implementation হাইড করে শুধুমাত্র Services গুলো হাইলাইট করার কন্সেপ্টটিই হচ্ছে Abstraction.
Abstraction এর প্রয়োজনীতাঃ
১)Abstraction এর সবথেকে বড় সুবিধা হচ্ছে সিকিউরিটি। যেখানেই hiding ব্যাপারটা থাকবে বুঝতে হবে সেখানেই সিকিউরিটির ব্যাপার আছে। Abstraction এ কি করা হচ্ছে? Internal implementation ইউজারদের কাছে থেকে লুকিয়ে রাখা হচ্ছে, গোপণ রাখা হচ্ছে। কাজেই Abstraction এর মাধ্যমে আমরা আমাদের ডেটার সিকিউরিটি পেতে পারি।
২) মনে করি ATM মেশিনের internal code JAVA দিয়ে লেখা আছে। এখন কোন ব্যাংক যদি মনে করে তারা JAVA থেকে shift করে Python বা C# এ internal কোড গুলো লিখবে। তারা অবশ্যই চাইবে না তাদের এই কাজের ফলে user দের কোন সমস্যা হোক। Abstraction এর মাধ্যমে এটা খুব সহজে সম্ভব। যেহেতু user শুধু GUI screen এ সার্ভিস গুলো দেখতে পারে, internal implementation দেখতে পারে না। সেক্ষত্রে তাদের কাছে সার্ভিস গুলো অপরিবর্তিত থাকবে।
৩) আচ্ছা যদি এমন হত যে ATM থেকে টাকা তোলা এত সহজ না হয়ে একটু কঠিন হত ?তখন কি হত? শুধু কার্ড পাঞ্চ করে টাকা তোলার এই সহজ পন্থা ছেড়ে টাকা তোলার জন্য যদি ইউজারদের প্রোগ্রামিং এর কোড পড়ে পড়ে বুঝে সে অনুযায়ি টাকা উঠাতে হত তবে কি হত? কতজন তবে এই ATM ইউজ করতো?সোজা উত্তর-কেউ করতো না। তাই আমরা বলতে পারি Abstraction আমাদের সিস্টেমের কাজ সহজ ও করে দেয়। ইউজারের কাছে শুধু মাত্র আমরা সার্ভিস গুলো পেশ করবো। Nothing more, nothing less.
৪) ধরুন বাংলাদেশ সরকার ভ্যাটের পরিমান বৃদ্ধি করলো বা ব্যাংক তাদের সার্ভিসে কোন পরিবর্তন আনতে চাইলো। সেক্ষেত্রে Abstraction এর মাধ্যমে তারা খুব সহজে internal code এ পরিবর্তন আনতে পারবে। Abstraction এর মাধ্যমে কোন সিস্টেম Maintain করা খুব সহজ হয়ে যায়।
Abstraction Implementation:
Abstraction দুই ভাবে implement করা যায়- Abstract Class এর মাধ্যমে এবং Interface এর মাধ্যমে।
Abstract Class কী?
Abstract class ডিক্লেয়ার করার জন্য “abstract” keyword ইউজ করতে হয়। Abstract class এর কোন object তৈরি করা যায় না। তবে অন্য subclass একে base class হিসেবে ইউজ করতে পারবে(Inheritance এর মাধ্যমে)। abstract ক্লাসে abstract method থাকতে পারে (আবার নাও পারে। তবে কোন ক্লাসে abstract method থাকলে তাকে অবশ্যই abstract class হতে হবে)। abstract method হচ্ছে যে মেথডের শুধু signature দেয়া থাকে, মেথডের বডি থাকে না অর্থাৎ implementation দেয়া থাকে না (implementation hide হচ্ছে। কন্সেপ্ট মিলে গেছে কিন্তু! )। abstract class এ কিছু method থাকতে পারে যেগুলার implementation থাকবে। এই কারণে abstract class এর মাধ্যমে ১০০% abstraction পাওয়া সম্ভব না।
Interfaces কী?
Interface class এর মতই। Interface কে বলা হয় blueprint of class. Interface এর মধ্যে যে method গুলো থাকবে সেগুলো by default abstract থাকে। Interface ডিক্লেয়ার করার জন্য “interface” keyword ইউজ করতে হয় এবং যে ক্লাসে implement করা হবে সেই ক্লাসে “implements” keyword ব্যবহার করতে হয়। সবথেকে চমৎকার ব্যাপার হচ্ছে আমরা জানি Java multiple inheritance সাপোর্ট করে না(যাতে ambiguity না ঘটে)। কিন্তু Interface এর মাধ্যমে আপনি multiple inheritance implement করতে পারবেন একটি ক্লাসে একের অধিক interface implement করার মাধ্যমে। Interface এর মাধ্যমে ১০০% abstraction সম্ভব। এখানে প্রতিটি method abstract থাকে।
এখন প্রশ্ন হচ্ছে, আমরা interface কেন use করবো যেখানে আমাদের abstract class আছেই। উত্তর হচ্ছে আমরা যদি চাই আমাদের variable গুলো final,public,static থাক এবং আমরা ১০০% abstraction চাই সেক্ষেত্রে আমরা interface ইউজ করবো। পক্ষান্তরে, আমরা চাইলে abstract class এ non-final, non-static ভ্যারিএবল ইউজ করতে পারবো।