অ্যাবস্ট্রাকশন (Abstruction)
অর্থ অবাস্তব। প্রোগ্রামিং এ অ্যাবস্ট্রাকশন বলতে বোঝায়, প্রোগ্রামের কমপ্লেক্সিটি কে আড়াল করে ব্যবহার কারির সামনে শুধুমাত্র গুরুত্বপূর্ণ ফিচার গুলো উপস্থাপন করা। যেকোন সিস্টেমের পেছনের কাজ গুলো সাধারণ ব্যবহারকারীর জানার প্রয়োজন থাকে না। পেছনের কঠিন সব মেকানিজম লুকিয়ে ব্যবহারকারীর জন্য সহজতর উপায়ে সিস্টেম টাকে উন্মুক্ত করে দেওয়ার পদ্ধতি ই হল অ্যাবস্ট্রাকশন এখানে ব্যবহারকারী এমন একটা ইন্টারফেসের সাথে কমিনিকেশন করে যার মূল কাজ গুলো প্রকৃত পক্ষে হচ্ছে অন্য কোন নিয়মে-অন্য কোথাও। অর্থাৎ, ব্যবহারকারী একটা অবাস্তব মাধ্যমের সাহায্য সিস্টেম টা ব্যবহার করছে। তাই একে অ্যাবস্ট্রাকশন বলে।
অ্যাবস্ট্রাকশন ক্লাস হল এক বা একাধিক অ্যাবস্ট্রাক্ট মেথড নিয়ে গঠিত ক্লাস যার মেথড গুলো সম্পূর্ন রুপে ইমপ্লিমেন্টেড থাকে না। অ্যাবস্ট্রাক্ট ক্লাসের মেথড ইমপ্লিমেন্টেশনের জন্য ওই ক্লাসের সাব ক্লাস তৈরি করতে হয়। পাইথনে বিল্ট-ইন কোন অ্যাবস্ট্রাক্ট বেজ ক্লাস নেই তবে (Abstract Base Classes ) abc মডিউলের মাধ্যমে প্রোগ্রামে অ্যাবস্ট্রাকশন ব্যবহার করা যায়।
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def start_engine(self):
pass
class Car(Vehicle) :
def start_engine(self):
print('start car')
class Motorcycle(Vehicle) :
def start_engine(self):
print('start motorcycle')
car = Car()
motorcycle = Motorcycle()
car.start_engine()
motorcycle.start_engine()অ্যাবস্ট্রাকশন (Abstraction) একটি OOP (Object-Oriented Programming) কনসেপ্ট, যা জটিলতাকে লুকিয়ে রেখে একটি সিম্পল ইন্টারফেস প্রদান করে। সহজ ভাষায়, এটি এমন একটি পদ্ধতি যা প্রয়োজনীয় তথ্যকে প্রকাশ করে এবং অপ্রয়োজনীয় ডিটেইল বা ইমপ্লিমেন্টেশন লুকিয়ে রাখে।
গল্প: একটি ব্যাঙ্কিং সিস্টেম
ধরা যাক, আমরা একটি ব্যাঙ্কে কাজ করি যেখানে বিভিন্ন ধরনের অ্যাকাউন্ট আছে—Savings Account, Checking Account, এবং Loan Account। প্রতিটি অ্যাকাউন্টের কিছু সাধারণ বৈশিষ্ট্য এবং কার্যকলাপ আছে, যেমন:
- ব্যালেন্স চেক করা
- টাকা জমা করা
- টাকা তোলা
কিন্তু প্রতিটি অ্যাকাউন্টের জন্য কিছু কাজ আলাদা হতে পারে। আমরা এই ব্যাঙ্কের সিস্টেম তৈরি করতে চাই। এখানে আমরা অ্যাবস্ট্রাকশন ব্যবহার করে একটি Abstract Class তৈরি করবো, যা প্রতিটি অ্যাকাউন্টের জন্য একটি সাধারণ কাঠামো বা টেমপ্লেট দিবে।
অ্যাবস্ট্রাকশন ক্লাস: কি এবং কেন?
- Abstract Class এমন একটি ক্লাস যা নিজে ইন্সট্যান্সিয়েট করা যায় না, বরং এটি অন্যান্য ক্লাসের জন্য একটি টেমপ্লেট হিসেবে কাজ করে।
- এটি সাধারণত কিছু সাধারণ মেথড বা প্রোপার্টি ডিফাইন করে, কিন্তু এর মেথডগুলোর ইমপ্লিমেন্টেশন দেওয়া হয় না।
- এর উদ্দেশ্য হচ্ছে—এটি এমন একটি কাঠামো দেয় যেটি ডেরাইভড ক্লাসগুলোকে অনুসরণ করতে হয়।
উদাহরণ: ব্যাঙ্কিং সিস্টেমের অ্যাবস্ট্রাকশন ক্লাস
আমরা BankAccount নামে একটি অ্যাবস্ট্রাকশন ক্লাস তৈরি করবো যা প্রতিটি অ্যাকাউন্টের জন্য কমন ফাংশন্যালিটি রাখবে এবং কিছু মেথড ডিফাইন করবে যেগুলোর ইমপ্লিমেন্টেশন প্রতিটি ডেরাইভড ক্লাস আলাদাভাবে দিবে।
from abc import ABC, abstractmethod
# অ্যাবস্ট্রাকশন ক্লাস
class BankAccount(ABC):
def __init__(self, account_number, balance):
self.account_number = account_number
self.balance = balance
def check_balance(self):
print(f"অ্যাকাউন্ট নম্বর {self.account_number} এর ব্যালেন্স: {self.balance} টাকা")
@abstractmethod
def deposit(self, amount):
pass
@abstractmethod
def withdraw(self, amount):
pass
এখানে BankAccount একটি অ্যাবস্ট্রাকশন ক্লাস। এটি একটি সাধারণ মেথড check_balance() ডিফাইন করেছে, যা প্রতিটি ডেরাইভড ক্লাসে কাজ করবে। তবে deposit() এবং withdraw() মেথডগুলো abstract method, যেগুলোর ইমপ্লিমেন্টেশন এখানে দেওয়া হয়নি; বরং ডেরাইভড ক্লাসে এগুলো ইমপ্লিমেন্ট করতে হবে।
ডেরাইভড ক্লাস: SavingsAccount এবং CheckingAccount
এখন আমরা দুটি ডেরাইভড ক্লাস তৈরি করবো—SavingsAccount এবং CheckingAccount। এগুলো BankAccount ক্লাস থেকে ইনহেরিট করবে এবং deposit() ও withdraw() মেথডগুলো ইমপ্লিমেন্ট করবে।
# ডেরাইভড ক্লাস: SavingsAccount
class SavingsAccount(BankAccount):
def deposit(self, amount):
self.balance += amount
print(f"{amount} টাকা সেভিংস অ্যাকাউন্টে জমা হলো। বর্তমান ব্যালেন্স: {self.balance} টাকা")
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
print(f"{amount} টাকা সেভিংস অ্যাকাউন্ট থেকে তোলা হলো। বর্তমান ব্যালেন্স: {self.balance} টাকা")
else:
print("সেভিংস অ্যাকাউন্টে পর্যাপ্ত ব্যালেন্স নেই!")
# ডেরাইভড ক্লাস: CheckingAccount
class CheckingAccount(BankAccount):
def deposit(self, amount):
self.balance += amount
print(f"{amount} টাকা চেকিং অ্যাকাউন্টে জমা হলো। বর্তমান ব্যালেন্স: {self.balance} টাকা")
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
print(f"{amount} টাকা চেকিং অ্যাকাউন্ট থেকে তোলা হলো। বর্তমান ব্যালেন্স: {self.balance} টাকা")
else:
print("চেকিং অ্যাকাউন্টে পর্যাপ্ত ব্যালেন্স নেই!")
এখানে, SavingsAccount এবং CheckingAccount ক্লাসগুলো BankAccount ক্লাস থেকে ইনহেরিট করেছে এবং নিজেদের deposit() এবং withdraw() মেথডগুলো ইমপ্লিমেন্ট করেছে।
প্রজেক্ট উদাহরণ
# সেভিংস এবং চেকিং অ্যাকাউন্ট তৈরি করা
savings = SavingsAccount("SA123", 5000)
checking = CheckingAccount("CA456", 2000)
# ব্যালেন্স চেক করা
savings.check_balance()
checking.check_balance()
# টাকা জমা করা এবং তোলা
savings.deposit(2000)
savings.withdraw(3000)
checking.deposit(1000)
checking.withdraw(5000) # পর্যাপ্ত ব্যালেন্স নেই
আউটপুট:
অ্যাকাউন্ট নম্বর SA123 এর ব্যালেন্স: 5000 টাকা
অ্যাকাউন্ট নম্বর CA456 এর ব্যালেন্স: 2000 টাকা
2000 টাকা সেভিংস অ্যাকাউন্টে জমা হলো। বর্তমান ব্যালেন্স: 7000 টাকা
3000 টাকা সেভিংস অ্যাকাউন্ট থেকে তোলা হলো। বর্তমান ব্যালেন্স: 4000 টাকা
1000 টাকা চেকিং অ্যাকাউন্টে জমা হলো। বর্তমান ব্যালেন্স: 3000 টাকা
চেকিং অ্যাকাউন্টে পর্যাপ্ত ব্যালেন্স নেই!
গল্পের সারমর্ম
এই গল্পে আমরা দেখেছি কিভাবে BankAccount নামে একটি অ্যাবস্ট্রাকশন ক্লাস ব্যবহার করে সাধারণ মেথড এবং অ্যাবস্ট্রাক্ট মেথড তৈরি করা যায়। এরপর, আমরা SavingsAccount এবং CheckingAccount নামে ডেরাইভড ক্লাস তৈরি করেছি, যারা এই অ্যাবস্ট্রাকশন ক্লাসের মেথডগুলো ইমপ্লিমেন্ট করেছে।
এটি হলো অ্যাবস্ট্রাকশনের মূল উদ্দেশ্য—একটি সাধারণ ইন্টারফেস বা টেমপ্লেট তৈরি করা, যাতে করে ডেরাইভড ক্লাসগুলো নিজেদের মতো করে ফাংশন্যালিটি ইমপ্লিমেন্ট করতে পারে। এটি কোডকে আরও গুছানো এবং রিইউজেবল করে তোলে, যা বড় এবং জটিল সিস্টেমে অনেক উপকারী।