ডেকোরেটরস TypeScript-এ একটি শক্তিশালী ফিচার, যা আপনাকে ক্লাস, মেথড, প্রপার্টি বা প্যারামিটারগুলোর আচরণ পরিবর্তন করতে বা এগুলোর ওপর অতিরিক্ত ফিচার অ্যাড করতে সক্ষম করে। ডেকোরেটর একটি ফাংশন যা একটি কন্টেক্সট (যেমন ক্লাস, মেথড, প্রপার্টি) নেয় এবং সেটি পরিবর্তন করতে সাহায্য করে। এটি মূলত প্রোগ্রামিং এপ্রোচ যা ক্লাসের বা মেথডের উপরে অ্যাডিশনাল লজিক বা অ্যাট্রিবিউট যোগ করতে ব্যবহার হয়।
ডেকোরেটরের ব্যবহার
ডেকোরেটর ব্যবহার করতে হলে প্রথমে experimentalDecorators অপশনটি TypeScript কনফিগারেশন ফাইলে (tsconfig.json) সক্রিয় করতে হয়। এটি সক্রিয় করতে, আপনার tsconfig.json ফাইলে নিচের অপশনটি যোগ করুন:
{
"compilerOptions": {
"experimentalDecorators": true
}
}
ডেকোরেটর মূলত বিভিন্ন জায়গায় ব্যবহার করা যায়, যেমন:
- ক্লাস ডেকোরেটর
- মেথড ডেকোরেটর
- প্রপার্টি ডেকোরেটর
- প্যারামিটার ডেকোরেটর
১. ক্লাস ডেকোরেটর (Class Decorator)
ক্লাস ডেকোরেটর একটি ফাংশন যা ক্লাসের ডিফিনিশনকে মডিফাই করতে সাহায্য করে। এটি একটি ক্লাসের ডিফিনিশনে যোগ করা হয় এবং সেই ক্লাসের আচরণ পরিবর্তন করতে পারে।
উদাহরণ:
function LogClass(target: Function) {
console.log(`Class ${target.name} is being created`);
}
@LogClass
class Person {
constructor(public name: string) {}
}
const person = new Person("John");
এখানে LogClass একটি ক্লাস ডেকোরেটর যা Person ক্লাসের উপরে ব্যবহৃত হয়েছে। ক্লাসটি তৈরি করার সময় ডেকোরেটর একটি লগ মেসেজ প্রদর্শন করবে।
ক্লাস ডেকোরেটর:
- এটি একটি ফাংশন যা প্রথম আর্গুমেন্ট হিসেবে ক্লাসের কনস্ট্রাকটর ফাংশন পায়।
- এর মাধ্যমে আপনি ক্লাসের ইনস্ট্যান্স বা প্রোপার্টি পরিবর্তন করতে পারেন।
২. মেথড ডেকোরেটর (Method Decorator)
মেথড ডেকোরেটর একটি ফাংশন যা মেথডের ওপর কার্যকরী হয়। এটি একটি মেথডের কাজ পরিবর্তন বা তার উপর অতিরিক্ত লজিক যোগ করতে সাহায্য করে।
উদাহরণ:
function LogMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Method ${propertyKey} was called with arguments: ${args}`);
return originalMethod.apply(this, args);
};
}
class Calculator {
@LogMethod
add(a: number, b: number): number {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3);
এখানে, LogMethod মেথড ডেকোরেটরটি add মেথডের উপরে ব্যবহৃত হয়েছে। এটি মেথডটি কল হওয়ার সময় আর্গুমেন্টগুলি লগ করবে।
মেথড ডেকোরেটর:
- এটি মেথডের নাম, প্রপার্টি কিজ (property key) এবং ডিসক্রিপ্টর পায়।
- মেথডের আগের কার্যকারিতা পরিবর্তন বা পরবর্তী লজিক যোগ করতে ব্যবহার করা হয়।
৩. প্রপার্টি ডেকোরেটর (Property Decorator)
প্রপার্টি ডেকোরেটর ক্লাসের প্রপার্টির ওপর প্রয়োগ করা হয় এবং এর মাধ্যমে আপনি প্রপার্টির আচরণ পরিবর্তন করতে পারেন।
উদাহরণ:
function ReadOnly(target: any, propertyKey: string) {
const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey) || {};
descriptor.writable = false;
Object.defineProperty(target, propertyKey, descriptor);
}
class Person {
@ReadOnly
name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person("John");
person.name = "Jane"; // Error: Cannot assign to read only property 'name'
এখানে ReadOnly ডেকোরেটর name প্রপার্টির ওপর প্রয়োগ করা হয়েছে, যা প্রপার্টির মান পরিবর্তন করতে নিষিদ্ধ করে।
প্রপার্টি ডেকোরেটর:
- এটি ক্লাসের প্রপার্টি ডিক্লেয়ারেশনে প্রভাব ফেলে।
- প্রপার্টির আচরণ, যেমন রিডওয়েবল বা রাইটওয়েবল, পরিবর্তন করতে সাহায্য করে।
৪. প্যারামিটার ডেকোরেটর (Parameter Decorator)
প্যারামিটার ডেকোরেটর মেথডের প্যারামিটারগুলোর ওপর প্রয়োগ করা হয়। এটি মেথড কল করার সময় প্যারামিটারগুলোর তথ্য অ্যাক্সেস করতে সাহায্য করে।
উদাহরণ:
function LogParameter(target: any, methodName: string, parameterIndex: number) {
console.log(`Parameter at index ${parameterIndex} in method ${methodName} is being accessed`);
}
class Person {
greet(@LogParameter name: string) {
console.log(`Hello, ${name}`);
}
}
const person = new Person();
person.greet("John");
এখানে, LogParameter প্যারামিটার ডেকোরেটর greet মেথডের প্যারামিটার name এর উপর প্রয়োগ হয়েছে।
প্যারামিটার ডেকোরেটর:
- এটি মেথড প্যারামিটারকে লক্ষ্য করে কাজ করে।
- প্যারামিটার ইনডেক্স এবং মেথডের নাম সম্পর্কে তথ্য সংগ্রহ করতে সাহায্য করে।
৫. ডেকোরেটর ব্যবহার করার উপকারিতা
- কোড ক্লিনার এবং পুনঃব্যবহারযোগ্য: ডেকোরেটর ব্যবহারে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায় এবং কোড আরো পরিষ্কার ও সহজ হয়।
- অপটিমাইজেশন: ক্লাস এবং মেথডের আচরণ পরিবর্তন করে আপনি নির্দিষ্ট লজিকের সাথে কোডকে অপটিমাইজ করতে পারেন।
- অতিরিক্ত কার্যকারিতা যোগ করা: সহজেই কাস্টম ফাংশনালিটি (যেমন লগিং, অথেন্টিকেশন) যোগ করতে পারেন।
ডেকোরেটরগুলি ব্যবহার করে আপনি TypeScript-এ আরও ডাইনামিক এবং শক্তিশালী অ্যাপ্লিকেশন তৈরি করতে পারবেন, তবে এগুলি JavaScript এপর্যন্ত কিছু সীমাবদ্ধতা থাকতে পারে, কারণ এটি একটি experimental ফিচার।
Read more