Lesson ১২৭ মিনিট পড়া

ক্লাস এবং ওওপি (Classes & OOP)

অবজেক্ট তৈরি করার জন্য ব্লুপ্রিন্ট (blueprint) বা নকশা তৈরি করুন — এরপর যখন খুশি যত ইচ্ছে অবজেক্ট তৈরি করুন

ক্লাস কী? (What Are Classes?)

কল্পনা করুন আপনি একটি পোষা প্রাণীর দোকান বা পেট শপ (pet shop) চালাচ্ছেন। প্রতিটি প্রাণীরই একটি নাম, ধরন ও বয়স আছে, এবং তারা খাওয়া বা ঘুমানোর মতো কাজগুলো করতে পারে। আপনি চাইলেই নিজ হাতে প্রতিটি প্রাণীর জন্য আলাদা আলাদা অবজেক্ট লিখতে পারেন, কিন্তু এভাবে একঘেয়েমি চলে আসবে। একটি ক্লাস (class) হলো কুকি কাটারের (cookie cutter) বা ছাঁচের মতো — আপনি এর ধরন বা আকার একবার ঠিক করে রাখলে, সেটি দিয়ে যত খুশি কুকি (বা অবজেক্ট) তৈরি করতে পারবেন।

কোনো ক্লাস থেকে তৈরি করা প্রতিটি অবজেক্টকে বলা হয় ইনস্ট্যান্স (instance)। ক্লাসটি মূলত নির্ধারণ করে দেয় যে একটি ইনস্ট্যান্স দেখতে কেমন হবে এবং সেটি কী কী কাজ করতে পারবেnew ব্যবহার করে যখন আপনি নতুন কোনো ইনস্ট্যান্স তৈরি করেন, তখন স্বয়ংক্রিয়ভাবেই constructor মেথডটি রান বা এক্সিকিউট হয়।

ক্লাস তৈরি করা (Creating a Class)

class Pet {
constructor(name, type, age) {
this.name = name;
this.type = type;
this.age = age;
this.energy = 100;
}
// Method
eat(food) {
this.energy += 20;
console.log(`${this.name} eats ${food}. Energy: ${this.energy}`);
}
sleep() {
this.energy += 50;
console.log(`${this.name} takes a nap. Energy: ${this.energy}`);
}
info() {
return `${this.name} is a ${this.age}-year-old ${this.type}`;
}
}
// Create instances with 'new'
const cat = new Pet("Mochi", "cat", 3);
const dog = new Pet("Pixel", "dog", 5);
console.log(cat.info());
cat.eat("tuna");
dog.sleep();
console.log(cat instanceof Pet); // true
Output
Mochi is a 3-year-old cat
Mochi eats tuna. Energy: 120
Pixel takes a nap. Energy: 150
true

গেটার, সেটার এবং স্ট্যাটিক মেথড (Getters, Setters & Static Methods)

গেটার (Getters) এবং সেটার (setters) আপনাকে এমন প্রপার্টি তৈরি করার সুযোগ দেয় যেগুলো দেখতে সাধারণ ডেটার মতোই, কিন্তু ভেতরে ভেতরে এদের পেছনে কোড কাজ করতে থাকে। কোনো প্রপার্টি পড়ার বা রিড (read) করার সময় গেটার নিজের মতো করে একটি ভ্যালু বা মান গণনা করে। অন্যদিকে কোনো প্রপার্টির মান নির্ধারণ বা সেট (set) করার সময় সেটার বিভিন্ন ভ্যালিডেশন (validation) বা লজিক রান করে।

স্ট্যাটিক মেথডগুলো (Static methods) সরাসরি ক্লাসের সাথেই যুক্ত থাকে, এর কোনো ইনস্ট্যান্সের সাথে নয়। আপনি এগুলোকে সরাসরি ক্লাসের নাম ধরেই কল করতে পারবেন (যেমন Math.random())। ক্লাস সম্পর্কিত বিভিন্ন দরকারি বা ইউটিলিটি ফাংশনের (utility function) ক্ষেত্রে এগুলো দারুণ কাজ করে।

গেটার, সেটার এবং স্ট্যাটিক (Getters, Setters & Static)

class Temperature {
#celsius; // private field (starts with #)
constructor(celsius) {
this.#celsius = celsius;
}
// Getter — access like a property, runs like a function
get fahrenheit() {
return this.#celsius * 9/5 + 32;
}
// Setter — validates when you assign
set celsius(value) {
if (value < -273.15) {
throw new RangeError("Below absolute zero!");
}
this.#celsius = value;
}
get celsius() {
return this.#celsius;
}
// Static method — called on the class, not instances
static fromFahrenheit(f) {
return new Temperature((f - 32) * 5/9);
}
}
const water = new Temperature(100);
console.log(water.fahrenheit); // 212 (getter, looks like a property)
console.log(water.celsius); // 100
water.celsius = 0; // setter runs validation
console.log(water.fahrenheit); // 32
// Static method — called on the CLASS
const body = Temperature.fromFahrenheit(98.6);
console.log(body.celsius.toFixed(1)); // 37.0
Output
212
100
32
37.0

ইনহেরিটেন্স — extends এবং super (Inheritance — extends & super)

ইনহেরিটেন্স (Inheritance) বা উত্তরাধিকারের মাধ্যমে আপনি একটি বিদ্যমান ক্লাসের বিশেষায়িত ভার্সন (specialized version) তৈরি করতে পারেন। এটি অনেকটা এমন বলার মতো — "একটি কুকুর হলো একটি পোষা প্রাণী, তবে এটি কিছু অতিরিক্ত কৌশল জানে।" চাইল্ড ক্লাসটি (child class) তার প্যারেন্ট বা পিতৃস্থানীয় ক্লাসের সব প্রপার্টি এবং মেথড উত্তরাধিকার সূত্রে (inherits) পেয়ে থাকে, তবে সে চাইলে এর সাথে নতুন কিছু যোগ করতে বা পুরোনো মেথডগুলোকে ওভাররাইড (override) করতে পারে।

চাইল্ড ক্লাস তৈরি করার জন্য extends এবং প্যারেন্টের কনস্ট্রাক্টর বা মেথড কল করার জন্য super ব্যবহার করা হয়।

ইনহেরিটেন্সের ব্যবহার (Inheritance in Action)

class Character {
constructor(name, health) {
this.name = name;
this.health = health;
}
describe() {
return `${this.name} (HP: ${this.health})`;
}
takeDamage(amount) {
this.health -= amount;
console.log(`${this.name} takes ${amount} damage! HP: ${this.health}`);
}
}
class Warrior extends Character {
constructor(name, health, weapon) {
super(name, health); // call parent constructor FIRST
this.weapon = weapon;
}
attack(target) {
let damage = Math.floor(Math.random() * 20) + 10;
console.log(`${this.name} swings ${this.weapon}!`);
target.takeDamage(damage);
}
}
class Mage extends Character {
constructor(name, health, mana) {
super(name, health);
this.mana = mana;
}
// Override parent method
describe() {
return `${super.describe()} | Mana: ${this.mana}`;
}
castSpell(target) {
if (this.mana < 10) {
console.log(`${this.name} is out of mana!`);
return;
}
this.mana -= 10;
target.takeDamage(30);
console.log(`${this.name} casts fireball! Mana left: ${this.mana}`);
}
}
const knight = new Warrior("Roland", 100, "greatsword");
const wizard = new Mage("Elara", 70, 50);
console.log(knight.describe());
console.log(wizard.describe());
wizard.castSpell(knight);
Output
Roland (HP: 100)
Elara (HP: 70) | Mana: 50
Roland takes 30 damage! HP: 70
Elara casts fireball! Mana left: 40
Note: জাভাস্ক্রিপ্টে ক্লাসগুলো মূলত এর পুরোনো প্রোটোটাইপ-ভিত্তিক (prototype-based) সিস্টেমের ওপর একটি "সিনট্যাকটিক সুগার (syntactic sugar)" বা সুন্দর আবরণ ছাড়া আর কিছুই নয়। এর ভেতরে জাভা বা C++ এর মতো প্রচলিত কোনো ক্লাসের অস্তিত্ব নেই — এটি আগাগোড়াই প্রোটোটাইপের মাধ্যমেই চলে। তবে ক্লাস সিনট্যাক্সটি দেখতে অনেক পরিষ্কার এবং বুঝতেও বেশ সুবিধা হয়, তাই এটিই ব্যবহার করুন!
চ্যালেঞ্জ

ছোট কুইজ

কোনো ক্লাসের ভেতর 'constructor' মেথডটি কী করে?
Error HandlingModules & Imports