লুয়া (Lua) ভাষা প্রাথমিকভাবে একটি স্ক্রিপ্টিং ভাষা হলেও এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণা সমর্থন করে। যদিও লুয়া ভাষায় বিল্ট-ইন ক্লাস এবং অবজেক্ট ব্যবস্থা নেই, তবুও টেবিল (tables) এবং মেটাটেবিল (metatables) ব্যবহার করে আপনি OOP কনসেপ্ট বাস্তবায়ন করতে পারেন। এটি লুয়া ভাষার নমনীয়তা এবং শক্তি প্রমাণ করে, যেখানে আপনি নিজের মতো কোডের কাঠামো তৈরি করতে পারেন।
OOP এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, ডেটা এনক্যাপসুলেশন, এবং ইনহেরিট্যান্সের সুবিধা পাওয়া যায়। এই টিউটোরিয়ালে আমরা লুয়া ভাষায় OOP ধারণা এবং তার প্রয়োগ নিয়ে আলোচনা করব।
১. OOP এর মৌলিক ধারণা
OOP এর প্রধান চারটি বৈশিষ্ট্য:
- এনক্যাপসুলেশন (Encapsulation): ডেটা এবং কার্যাবলী একত্রিত করে একক ইউনিট তৈরি করা।
- ইনহেরিট্যান্স (Inheritance): একটি অবজেক্ট অন্য অবজেক্ট থেকে বৈশিষ্ট্য এবং আচরণ ধারণ করে।
- পলিমরফিজম (Polymorphism): একই নামের ফাংশন বিভিন্ন ধরনের আর্গুমেন্ট নিয়ে কাজ করতে পারে।
- এবস্ট্র্যাকশন (Abstraction): জটিলতা লুকিয়ে রেখে সিস্টেমের সহজ ইন্টারফেস প্রদান করা।
লুয়া ভাষায় OOP কনসেপ্টগুলো মেটাটেবিল ও টেবিলের মাধ্যমে বাস্তবায়ন করা হয়।
২. এনক্যাপসুলেশন (Encapsulation) - অবজেক্ট তৈরি করা
লুয়া ভাষায় আপনি টেবিল ব্যবহার করে অবজেক্ট তৈরি করতে পারেন। টেবিলটি অবজেক্টের প্রপার্টি এবং মেথড ধারণ করে।
উদাহরণ:
-- Class definition: Person
Person = {}
Person.__index = Person
-- Constructor
function Person.new(name, age)
local self = setmetatable({}, Person) -- Create a new instance
self.name = name
self.age = age
return self
end
-- Method: greet
function Person:greet()
print("Hello, my name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
-- Create an object (instance of Person)
local john = Person.new("John", 25)
john:greet() -- Output: Hello, my name is John and I am 25 years old.এখানে:
Personএকটি ক্লাস (অবজেক্টের রূপরেখা) হিসেবে কাজ করছে।Person.new()একটি কনস্ট্রাক্টর ফাংশন, যা একটি নতুন অবজেক্ট তৈরি করে।greet()একটি মেথড, যা অবজেক্টের তথ্য ব্যবহার করে আউটপুট প্রদান করে।
৩. ইনহেরিট্যান্স (Inheritance) - বৈশিষ্ট্য উত্তরাধিকার
লুয়া ভাষায় ইনহেরিট্যান্স অর্জন করতে মেটাটেবিল ব্যবহার করা হয়। আপনি একটি ক্লাস থেকে আরেকটি ক্লাসের বৈশিষ্ট্য (প্রপার্টি ও মেথড) উত্তরাধিকার নিতে পারেন।
উদাহরণ:
-- Parent class: Person
Person = {}
Person.__index = Person
function Person.new(name, age)
local self = setmetatable({}, Person)
self.name = name
self.age = age
return self
end
function Person:greet()
print("Hello, my name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
-- Child class: Employee (inherits from Person)
Employee = setmetatable({}, Person) -- Employee inherits Person
function Employee.new(name, age, position)
local self = Person.new(name, age) -- call Person constructor
setmetatable(self, Employee) -- Set the metatable to Employee
self.position = position
return self
end
function Employee:greet()
Person.greet(self) -- call Person's greet method
print("I work as a " .. self.position)
end
-- Create an object of Employee
local jane = Employee.new("Jane", 30, "Engineer")
jane:greet() -- Output: Hello, my name is Jane and I am 30 years old. I work as a Engineer.এখানে:
Employeeক্লাসটিPersonক্লাস থেকে ইনহেরিট করেছে।Employeeক্লাসে নতুন একটি মেথডgreetযুক্ত করা হয়েছে, যাPersonক্লাসেরgreetমেথডকে কল করে এবং অতিরিক্ত তথ্য প্রদর্শন করে।
৪. পলিমরফিজম (Polymorphism) - একাধিক রূপের ফাংশন
লুয়া ভাষায় পলিমরফিজম অর্জন করা যায় একাধিক মেথডের মাধ্যমে, যেখানে একই নামের মেথড বিভিন্ন ধরনের আর্গুমেন্ট নিয়ে কাজ করতে পারে।
উদাহরণ:
-- Parent class: Animal
Animal = {}
Animal.__index = Animal
function Animal.new(name)
local self = setmetatable({}, Animal)
self.name = name
return self
end
function Animal:speak()
print(self.name .. " makes a sound")
end
-- Child class: Dog
Dog = setmetatable({}, Animal)
function Dog.new(name)
local self = Animal.new(name)
setmetatable(self, Dog)
return self
end
function Dog:speak()
print(self.name .. " barks")
end
-- Child class: Cat
Cat = setmetatable({}, Animal)
function Cat.new(name)
local self = Animal.new(name)
setmetatable(self, Cat)
return self
end
function Cat:speak()
print(self.name .. " meows")
end
-- Create objects of Dog and Cat
local dog = Dog.new("Rex")
local cat = Cat.new("Whiskers")
-- Demonstrate Polymorphism
dog:speak() -- Output: Rex barks
cat:speak() -- Output: Whiskers meowsএখানে, speak মেথডটি Dog এবং Cat ক্লাসে আলাদা আচরণ প্রদর্শন করে, যা পলিমরফিজমের উদাহরণ।
৫. অ্যাবস্ট্র্যাকশন (Abstraction) - জটিলতা লুকানো
অ্যাবস্ট্র্যাকশন হল কোডের জটিলতা লুকিয়ে রাখা এবং সহজভাবে ব্যবহারের জন্য একটি পরিষ্কার ইন্টারফেস প্রদান করা। লুয়া ভাষায় এটি মেটাটেবিল এবং মেথড ব্যবহার করে করা হয়।
উদাহরণ:
-- Class: BankAccount
BankAccount = {}
BankAccount.__index = BankAccount
function BankAccount.new(owner, balance)
local self = setmetatable({}, BankAccount)
self.owner = owner
self.balance = balance
return self
end
function BankAccount:getBalance()
return self.balance
end
function BankAccount:deposit(amount)
self.balance = self.balance + amount
end
function BankAccount:withdraw(amount)
if amount <= self.balance then
self.balance = self.balance - amount
else
print("Insufficient funds!")
end
end
-- Create a BankAccount object
local account = BankAccount.new("Alice", 1000)
account:deposit(500)
print("Balance: " .. account:getBalance()) -- Output: Balance: 1500
account:withdraw(2000) -- Output: Insufficient funds!এখানে, BankAccount ক্লাসটি ব্যাঙ্ক অ্যাকাউন্ট পরিচালনার জন্য কাস্টম মেথডগুলো প্রদান করে, যেখানে তার ভেতরের ডেটা সঠিকভাবে পরিচালিত হয় এবং বাইরে থেকে শুধু প্রয়োজনীয় ফাংশনগুলোর মাধ্যমে অ্যাক্সেস করা হয়।
সারসংক্ষেপ
লুয়া ভাষায় অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) একটি শক্তিশালী এবং নমনীয় কনসেপ্ট, যা এনক্যাপসুলেশন, ইনহেরিট্যান্স, পলিমরফিজম, এবং অ্যাবস্ট্র্যাকশন এর মতো গুরুত্বপূর্ণ বৈশিষ্ট্যগুলিকে বাস্তবায়ন করার জন্য টেবিল এবং মেটাটেবিল ব্যবহার করে। এর মাধ্যমে কোড আরও পুনঃব্যবহারযোগ্য, পরিষ্কার এবং পরিচালনাযোগ্য হয়।
- এনক্যাপসুলেশন: টেবিল ব্যবহার করে ডেটা এবং কার্যাবলী একত্রিত করা।
- ইনহেরিট্যান্স: মেটাটেবিল ব্যবহার করে এক ক্লাস থেকে আরেক ক্লাসের বৈশিষ্ট্য উত্তরাধিকার করা।
- **পলিমরফিজম
**: একাধিক ক্লাসে একই নামের মেথডের ভিন্ন আচরণ প্রদান।
- অ্যাবস্ট্র্যাকশন: কোডের জটিলতা লুকিয়ে রাখা এবং সঠিক ইন্টারফেস প্রদান করা।
এই ধারণাগুলো লুয়া ভাষায় OOP প্রোগ্রামিংকে সহজ, মডুলার এবং শক্তিশালী করে তোলে।
Read more