TypeScript এ ডেকোরেটরস একটি শক্তিশালী ফিচার যা ক্লাস, মেথড, প্রোপার্টি বা প্যারামিটারগুলোর আচরণকে পরিবর্তন করার জন্য ব্যবহার করা হয়। ডেকোরেটরস ক্লাসের মেটাডেটা প্রদান করে এবং কোডের রিফ্লেকশন এবং অ্যাঙ্কোটেশন (annotations) সিস্টেম তৈরি করতে সাহায্য করে। এই ডেকোরেটরস TypeScript-এ মূলত ক্লাসের প্রোপার্টি, মেথড এবং অ্যাক্সেসরের জন্য ব্যবহৃত হয়।
১. ডেকোরেটরস (Decorators) পরিচিতি
ডেকোরেটর একটি বিশেষ ধরনের ফাংশন যা ক্লাসের সদস্য (প্রোপার্টি, মেথড, অ্যাক্সেসর বা প্যারামিটার) এর আগে প্রয়োগ করা হয়। ডেকোরেটর TypeScript এবং ECMAScript-এ experimental ফিচার হিসেবে যুক্ত রয়েছে, এবং এটি ব্যবহার করতে আপনি --experimentalDecorators ফ্ল্যাগটি দিয়ে TypeScript কম্পাইলার চালাতে হবে।
ডেকোরেটর ব্যবহার করার জন্য TypeScript ফ্ল্যাগ:
{
"compilerOptions": {
"experimentalDecorators": true
}
}
এই ফ্ল্যাগটি tsconfig.json ফাইলে থাকতে হবে, যাতে ডেকোরেটরগুলো কাজ করে।
২. প্রোপার্টি ডেকোরেটর (Property Decorators)
প্রোপার্টি ডেকোরেটর ব্যবহার করে আপনি ক্লাসের প্রোপার্টির আচরণ কাস্টমাইজ করতে পারেন। একটি প্রোপার্টি ডেকোরেটর হলো একটি ফাংশন যা প্রোপার্টি ডিক্লারেশন সনাক্ত করে এবং তার উপর কিছু পরিবর্তন করে।
উদাহরণ: প্রোপার্টি ডেকোরেটর
function log(target: any, key: string) {
let value = target[key];
const getter = () => {
console.log(`Getting value of ${key}: ${value}`);
return value;
};
const setter = (newValue: any) => {
console.log(`Setting value of ${key} to ${newValue}`);
value = newValue;
};
Object.defineProperty(target, key, {
get: getter,
set: setter,
});
}
class Person {
@log
name: string;
constructor(name: string) {
this.name = name;
}
}
let person = new Person("Alice");
person.name = "Bob"; // Output: Setting value of name to Bob
console.log(person.name); // Output: Getting value of name: Bob
এখানে:
@logডেকোরেটরটিnameপ্রোপার্টির গেটার এবং সেটার ফাংশনালিটি কাস্টমাইজ করেছে।- যখনই প্রোপার্টি
nameসেট বা গেট করা হয়, তখন ডেকোরেটর কনসোলে মেসেজ প্রিন্ট করবে।
৩. মেথড ডেকোরেটর (Method Decorators)
মেথড ডেকোরেটর মেথডের আচরণ পরিবর্তন করার জন্য ব্যবহৃত হয়। এটি মূলত মেথডের আগে প্রয়োগ করা হয় এবং মেথডের target, key, এবং descriptor অ্যাট্রিবিউটগুলির উপর কাজ করে। এই ডেকোরেটরটি সাধারণত মেথডের কার্যকারিতা পরিবর্তন করতে বা নতুন ফিচার যোগ করতে ব্যবহৃত হয়।
উদাহরণ: মেথড ডেকোরেটর
function logMethod(target: any, key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method ${key} with arguments: ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${key} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calculator = new Calculator();
calculator.add(2, 3);
// Output:
// Calling method add with arguments: 2,3
// Method add returned: 5
এখানে:
@logMethodডেকোরেটরটিaddমেথডের কার্যকারিতা পরিবর্তন করে এবং মেথডের আর্গুমেন্ট এবং রিটার্ন ভ্যালু কনসোলে লগ করে।
৪. অ্যাক্সেসর ডেকোরেটর (Accessor Decorators)
অ্যাক্সেসর ডেকোরেটর ব্যবহার করা হয় ক্লাসের গেটার বা সেটার মেথডের আচরণ পরিবর্তন করতে। এর মাধ্যমে আপনি গেট বা সেট অপারেশনের সময় লগিং, ভ্যালিডেশন, অথবা অন্যান্য কাস্টম লজিক যোগ করতে পারেন।
উদাহরণ: অ্যাক্সেসর ডেকোরেটর
function logAccessor(target: any, key: string, descriptor: PropertyDescriptor) {
const originalGet = descriptor.get;
const originalSet = descriptor.set;
descriptor.get = function () {
console.log(`Getting value of ${key}`);
return originalGet && originalGet.apply(this);
};
descriptor.set = function (newValue: any) {
console.log(`Setting value of ${key} to ${newValue}`);
if (originalSet) {
originalSet.apply(this, [newValue]);
}
};
return descriptor;
}
class Person {
private _name: string;
constructor(name: string) {
this._name = name;
}
@logAccessor
get name() {
return this._name;
}
@logAccessor
set name(value: string) {
this._name = value;
}
}
const person = new Person("Alice");
person.name = "Bob"; // Output: Setting value of name to Bob
console.log(person.name); // Output: Getting value of name
এখানে:
@logAccessorডেকোরেটরটিnameগেটার এবং সেটার মেথডের আচরণ পরিবর্তন করেছে।- যখনই
nameগেট বা সেট করা হয়, তখন কনসোলে লগ হবে।
৫. ডেকোরেটর ব্যবহার করার সুবিধা
- কোড রিফ্লেকশন এবং অ্যানোটেশন: ডেকোরেটর ব্যবহার করে আপনি ক্লাস, মেথড, এবং প্রোপার্টির মেটাডেটা পরিচালনা করতে পারেন, যা কোডের রিফ্লেকশন এবং অ্যানোটেশন সিস্টেম তৈরি করতে সাহায্য করে।
- ফাংশনালিটি পরিবর্তন: ডেকোরেটরদের মাধ্যমে আপনি মেথডের কার্যকারিতা কাস্টমাইজ করতে পারেন, যেমন লোগিং, ভ্যালিডেশন, বা অন্যান্য অতিরিক্ত ফিচার যোগ করা।
- ক্লিন কোড: ডেকোরেটরগুলো ক্লাসের মেম্বারগুলোর উপরে প্রয়োগ করা সহজ এবং কোডের পুনরাবৃত্তি কমায়, ফলে কোড পরিষ্কার এবং maintainable থাকে।
সারাংশ
TypeScript এ প্রোপার্টি, মেথড, এবং অ্যাক্সেসর ডেকোরেটরস ফিচারগুলো কোডের কার্যকারিতা পরিবর্তন করার জন্য ব্যবহৃত হয়। ডেকোরেটরগুলি কোডকে আরো ডাইনামিক, রিফ্লেকটিভ এবং ক্লিন করে তোলে, এবং TypeScript এর experimentalDecorators ফিচার ব্যবহার করে এগুলো সহজে প্রয়োগ করা যায়।