TypeScript এ ডেকোরেটরস (Decorators) হল একটি বিশেষ ফিচার যা আপনাকে ক্লাস, প্রপার্টি, মেথড বা প্যারামিটারগুলোর ওপর আনা কিছু অতিরিক্ত আচরণ বা মেটাডেটা অ্যাড করতে সাহায্য করে। এটি মূলত আধুনিক JavaScript বা ES7 এর একটি বৈশিষ্ট্য এবং TypeScript এর মাধ্যমে এটি ব্যবহার করা সম্ভব।
ডেকোরেটরগুলো ফাংশন হিসেবে কাজ করে, যা কোন নির্দিষ্ট ক্লাস, প্রপার্টি, মেথড বা প্যারামিটারের উপর কার্যকর হয় এবং তার আচরণ পরিবর্তন বা প্রসারিত করতে পারে।
ডেকোরেটরগুলি সাধারণত @ সিম্বল দিয়ে শুরু হয় এবং ক্লাস, মেথড, প্যারামিটার বা প্রপার্টির উপরে ব্যবহার করা হয়।
ডেকোরেটরস কি?
ডেকোরেটরস হল ফাংশন বা ক্লাস যা ক্লাস, মেথড, প্রপার্টি, প্যারামিটার বা এক্সপ্রেশনগুলোর সাথে যুক্ত হয়। এগুলি তাদের আচরণ পরিবর্তন করতে, লগিং করতে, বা যেকোনো ধরনের মেটাডেটা অ্যাটাচ করতে ব্যবহৃত হয়।
TypeScript এ ডেকোরেটর ব্যবহার করার জন্য experimentalDecorators ফিচারটি প্রথমে সক্রিয় করতে হয়। এটি সক্রিয় করার জন্য আপনার tsconfig.json ফাইলে নিচের সেটিংস যুক্ত করতে হবে:
{
"compilerOptions": {
"experimentalDecorators": true
}
}
ডেকোরেটরের ধরন
TypeScript এ বিভিন্ন ধরনের ডেকোরেটর ব্যবহার করা যায়:
- ক্লাস ডেকোরেটর (Class Decorators)
- প্রপার্টি ডেকোরেটর (Property Decorators)
- মেথড ডেকোরেটর (Method Decorators)
- প্যারামিটার ডেকোরেটর (Parameter Decorators)
১. ক্লাস ডেকোরেটর (Class Decorators)
ক্লাস ডেকোরেটর একটি ক্লাস ডিফাইনেশনের উপরে একটি ফাংশন হিসেবে ব্যবহার করা হয়, যা ক্লাসের বেস আচরণ পরিবর্তন করতে সাহায্য করে। এটি সাধারণত ক্লাসের মেটাডেটা অ্যাড বা ক্লাসের ইনস্ট্যান্সের বৈশিষ্ট্য পরিবর্তন করতে ব্যবহৃত হয়।
উদাহরণ:
function Logger(constructor: Function) {
console.log("Class Created:", constructor.name);
}
@Logger
class Person {
constructor(public name: string, public age: number) {}
}
const person = new Person("John", 30);
এখানে, Logger ডেকোরেটরটি Person ক্লাসের উপরে ব্যবহৃত হয়েছে। এটি ক্লাস তৈরি হওয়ার সময় কনসোল লগে ক্লাসের নাম প্রদর্শন করবে।
২. প্রপার্টি ডেকোরেটর (Property Decorators)
প্রপার্টি ডেকোরেটর ব্যবহার করে আপনি কোনো ক্লাসের প্রপার্টির আচরণ বা মান পরিবর্তন করতে পারেন। এটি মূলত ক্লাসের প্রপার্টি অথবা ক্ষেত্রগুলির উপর প্রভাব ফেলে।
উদাহরণ:
function ReadOnly(target: any, propertyName: string) {
const descriptor = Object.getOwnPropertyDescriptor(target, propertyName);
if (descriptor) {
descriptor.writable = false; // Make the property read-only
Object.defineProperty(target, propertyName, descriptor);
}
}
class Person {
@ReadOnly
name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person("John");
person.name = "Jane"; // This will throw an error because name is read-only
এখানে, ReadOnly ডেকোরেটরটি name প্রপার্টির উপর ব্যবহৃত হয়েছে, যা প্রপার্টিকে read-only করে দেবে, অর্থাৎ এর মান পরিবর্তন করা যাবে না।
৩. মেথড ডেকোরেটর (Method Decorators)
মেথড ডেকোরেটর ব্যবহার করে আপনি কোনো ক্লাসের মেথডের আচরণ পরিবর্তন করতে পারেন। এটি মেথডে লগিং, ক্যাচিং, টাইমিং ইত্যাদি যোগ করতে সাহায্য করে।
উদাহরণ:
function Log(target: any, propertyName: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Method ${propertyName} called with arguments: ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyName} returned: ${result}`);
return result;
};
}
class Person {
constructor(public name: string) {}
@Log
greet(message: string) {
return `${message}, ${this.name}!`;
}
}
const person = new Person("John");
person.greet("Hello");
এখানে, Log ডেকোরেটরটি greet মেথডে ব্যবহৃত হয়েছে এবং এটি মেথড কলের আগেই ও পরে লগিং করবে, যাতে মেথডের আর্গুমেন্ট এবং রিটার্ন ভ্যালু দেখতে পাওয়া যায়।
৪. প্যারামিটার ডেকোরেটর (Parameter Decorators)
প্যারামিটার ডেকোরেটর ব্যবহার করে আপনি কোনো মেথডের প্যারামিটারের উপর মেটাডেটা অ্যাটাচ করতে পারেন। এটি কম্পাইলার বা রানটাইমে প্যারামিটারগুলোর গঠন বা আচরণ পরিবর্তন করতে সাহায্য করে।
উদাহরণ:
function Param(target: any, methodName: string, parameterIndex: number) {
console.log(`Parameter at index ${parameterIndex} in method ${methodName} has been decorated.`);
}
class Person {
greet(@Param message: string) {
console.log(message);
}
}
const person = new Person();
person.greet("Hello, world!");
এখানে, Param ডেকোরেটরটি greet মেথডের message প্যারামিটারকে ডেকোরেট করেছে, তবে এটি আসলে কোন পরিবর্তন ঘটাচ্ছে না, শুধু প্যারামিটার ডেকোরেট করার অবস্থানটি লগে দেখানো হচ্ছে।
সারাংশ
ডেকোরেটরস TypeScript-এ একটি শক্তিশালী এবং ইউটিলিটি ফিচার, যা ক্লাস, মেথড, প্রপার্টি, এবং প্যারামিটারগুলির আচরণ পরিবর্তন করতে সাহায্য করে। এটি সাধারণত ইনফ্রাস্ট্রাকচারাল কাজ, লগিং, মেটাডেটা অ্যাটাচ, ক্যাশিং, বা অন্যান্য এডভান্সড ফিচার তৈরি করতে ব্যবহৃত হয়। TypeScript এ ডেকোরেটর ব্যবহার করার জন্য experimentalDecorators ফিচারটি সক্রিয় করা আবশ্যক।
ডেকোরেটরস 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 ফিচার।
TypeScript এ ডেকোরেটরস একটি বিশেষ ধরনের ফাংশন যা ক্লাস, মেথড, প্রপার্টি বা প্যারামিটারকে কাস্টমাইজ বা এডিট করতে ব্যবহৃত হয়। ডেকোরেটরস মূলত মেটা-প্রোগ্রামিং টুল হিসেবে কাজ করে এবং এটি ক্লাস বা মেথডে অতিরিক্ত আচরণ বা বৈশিষ্ট্য যোগ করতে ব্যবহৃত হয়।
TypeScript এ ডেকোরেটরস ব্যবহার করতে হলে আপনাকে অবশ্যই experimentalDecorators অপশনটি tsconfig.json ফাইলে true করতে হবে। ডেকোরেটরস শুধুমাত্র TypeScript বা ESNext এর ক্ষেত্রে সাপোর্টেড।
১. ডেকোরেটরস কী?
ডেকোরেটরস এমন একটি ফাংশন যা একটি লক্ষ্য (target) গ্রহণ করে এবং তাকে পরিবর্তন বা সংশোধন করে। এই লক্ষ্য হতে পারে:
- ক্লাস
- মেথড
- প্রপার্টি
- প্যারামিটার
ডেকোরেটরস ব্যবহার করে আপনি এই লক্ষ্যগুলিতে অতিরিক্ত বৈশিষ্ট্য বা আচরণ যোগ করতে পারেন।
২. ডেকোরেটরসের ধরন
ডেকোরেটরসের প্রধান ধরনের মধ্যে রয়েছে:
- ক্লাস ডেকোরেটর
- মেথড ডেকোরেটর
- প্রপার্টি ডেকোরেটর
- প্যারামিটার ডেকোরেটর
৩. ক্লাস ডেকোরেটর (Class Decorators)
ক্লাস ডেকোরেটরটি একটি ক্লাসের উপর কাজ করে এবং সাধারণত ক্লাসের কন্সট্রাকটর ফাংশনকে পরিবর্তন বা প্রসারিত করে।
উদাহরণ:
function LogClass(target: Function) {
console.log(`Class ${target.name} has been created.`);
}
@LogClass
class Person {
constructor(public name: string, public age: number) {}
}
const person = new Person("Alice", 30);
এখানে @LogClass ডেকোরেটরটি Person ক্লাসের উপর প্রয়োগ করা হয়েছে। ক্লাস তৈরি হলে এটি কন্সট্রাকটরের মাধ্যমে লগ করবে।
আলোচনা:
@LogClassহল একটি ক্লাস ডেকোরেটর যাtargetহিসেবে ফাংশন প্যারামিটার গ্রহণ করে।- যখন আপনি
@LogClassব্যবহার করেন, তখন TypeScript এটিPersonক্লাসের কন্সট্রাকটর ফাংশনকে পাস করবে।
৪. মেথড ডেকোরেটর (Method Decorators)
মেথড ডেকোরেটর একটি ক্লাসের মেথডের উপর কাজ করে এবং মেথডের আচরণ পরিবর্তন করতে ব্যবহৃত হয়।
উদাহরণ:
function LogMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Called ${propertyKey} with arguments: ${args}`);
return originalMethod.apply(this, args);
};
}
class Person {
constructor(public name: string, public age: number) {}
@LogMethod
greet(message: string) {
console.log(`${this.name} says: ${message}`);
}
}
const person = new Person("Alice", 30);
person.greet("Hello"); // লগ করবে মেথড কলের তথ্য
এখানে @LogMethod ডেকোরেটরটি greet মেথডের উপরে প্রয়োগ করা হয়েছে। মেথডটি কল করার সময় ডেকোরেটরটি সেই মেথডের আর্গুমেন্ট এবং তার রিটার্ন ভ্যালু লগ করবে।
আলোচনা:
target: ক্লাসের প্রোটোটাইপ বা কন্সট্রাকটর ফাংশন।propertyKey: মেথড বা প্রপার্টির নাম।descriptor: মেথডের ডেসক্রিপ্টর যা মেথডের আচরণ পরিচালনা করে।
৫. প্রপার্টি ডেকোরেটর (Property Decorators)
প্রপার্টি ডেকোরেটরগুলি প্রপার্টি অথবা ফিল্ডের উপর কাজ করে, তবে এটি সাধারণত ক্লাসের প্রপার্টির পরিবর্তে কোন অতিরিক্ত কাজ বা বৈশিষ্ট্য যোগ করতে ব্যবহৃত হয়।
উদাহরণ:
function ReadOnly(target: any, propertyKey: string) {
const descriptor: PropertyDescriptor = {
writable: false
};
Object.defineProperty(target, propertyKey, descriptor);
}
class Person {
@ReadOnly
name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person("Alice");
console.log(person.name); // "Alice"
person.name = "Bob"; // এর পরেও এই প্রপার্টি পরিবর্তন হবে না
console.log(person.name); // "Alice"
এখানে @ReadOnly ডেকোরেটরটি name প্রপার্টির উপরে প্রয়োগ করা হয়েছে, যাতে সেই প্রপার্টি আর পরিবর্তনযোগ্য না হয়।
আলোচনা:
target: প্রপার্টির মালিকানাধীন ক্লাস।propertyKey: প্রপার্টির নাম।
৬. প্যারামিটার ডেকোরেটর (Parameter Decorators)
প্যারামিটার ডেকোরেটর প্যারামিটারগুলির উপর কাজ করে এবং কিভাবে প্যারামিটারটি ব্যবহৃত হবে তা নির্ধারণ করে। এটি সাধারণত মেথডের প্যারামিটার গুলি কাস্টমাইজ করার জন্য ব্যবহৃত হয়।
উদাহরণ:
function LogParameter(target: any, propertyKey: string, parameterIndex: number) {
console.log(`Method ${propertyKey} parameter at index ${parameterIndex} has been decorated.`);
}
class Person {
greet(@LogParameter message: string) {
console.log(message);
}
}
const person = new Person();
person.greet("Hello");
এখানে @LogParameter ডেকোরেটরটি greet মেথডের প্যারামিটার message এর উপর প্রয়োগ করা হয়েছে। এটি সেই প্যারামিটারকে লগ করবে।
আলোচনা:
target: মেথড বা কন্সট্রাকটরের প্রোটোটাইপ।propertyKey: মেথড বা প্রপার্টির নাম।parameterIndex: প্যারামিটারটির ইনডেক্স।
৭. ডেকোরেটরস ব্যবহার করার কিছু গুরুত্বপূর্ণ বিষয়
experimentalDecorators: ডেকোরেটরস ব্যবহারের জন্যtsconfig.jsonএexperimentalDecoratorsঅপশনটিtrueহতে হবে।- ডেকোরেটর অর্ডার: ডেকোরেটরগুলো প্রযোজ্য হবে যেভাবে আপনি সেগুলো কোডে লিখেছেন।
- অপেক্ষিত আচরণ: ডেকোরেটরটি ব্যবহারের সময় কোনও নির্দিষ্ট আচরণ তৈরির জন্য কাস্টম লগিক ব্যবহার করা যেতে পারে।
ডেকোরেটরস TypeScript এ কোডের শক্তিশালী কাস্টমাইজেশন ক্ষমতা প্রদান করে এবং কোডকে আরও পরিষ্কার ও পুনঃব্যবহারযোগ্য করতে সহায়তা করে।
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 ফিচার ব্যবহার করে এগুলো সহজে প্রয়োগ করা যায়।
ডেকোরেটরস TypeScript এবং ECMAScript-এর একটি শক্তিশালী বৈশিষ্ট্য যা ক্লাস, মেথড, প্রোপার্টি, প্যারামিটার এবং এক্সপ্রেশনদের উপর কাস্টম আচরণ যোগ করতে সাহায্য করে। ডেকোরেটরস মূলত এডভান্সড কনসেপ্ট এবং মেটা-প্রোগ্রামিং এর একটি অংশ, যা ক্লাস এবং তার উপাদানগুলোর আচরণ পরিবর্তন বা প্রসারিত করার জন্য ব্যবহৃত হয়।
TypeScript-এ ডেকোরেটরস ব্যবহার করার জন্য কিছু কনফিগারেশন এবং সেটিংস প্রয়োজন হয়, এবং এগুলো মূলত একটি কোডের মেটা-ডেটা সংযুক্ত করে, যা পরে প্রোগ্রামের আচরণ পরিবর্তন বা প্রসারিত করার জন্য ব্যবহৃত হতে পারে।
১. ডেকোরেটরস কী?
ডেকোরেটরস হল একধরনের ফাংশন যা ক্লাসের প্রপার্টি বা মেথডে বিশেষ কার্যকলাপ যোগ করে। ডেকোরেটরস সাধারণত একটি ক্লাস বা তার উপাদানগুলোর ওপরে আংশিক বা পুরোপুরি পরিবর্তন করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, মেথড বা প্রপার্টির জন্য লোকালাইজেশন, লগিং, অথেন্টিকেশন, বা ভ্যালিডেশন যোগ করা হতে পারে।
২. ডেকোরেটরস এর ধরন
TypeScript-এ ডেকোরেটরস কয়েকটি ধরণের হতে পারে। মূলত, ডেকোরেটরস ব্যবহার করা হয়:
- ক্লাস ডেকোরেটর (Class Decorators)
- প্রপার্টি ডেকোরেটর (Property Decorators)
- মেথড ডেকোরেটর (Method Decorators)
- প্যারামিটার ডেকোরেটর (Parameter Decorators)
এখানে প্রতিটি ধরন বিস্তারিতভাবে আলোচনা করা হয়েছে:
৩. ক্লাস ডেকোরেটর
ক্লাস ডেকোরেটর একটি ফাংশন, যা ক্লাস ডিফিনিশনের উপরে ব্যবহৃত হয়। এটি ক্লাসের এক্সটেনশন বা আচরণ পরিবর্তন করার জন্য ব্যবহৃত হয়।
উদাহরণ:
function logClass(target: any) {
console.log(`Class ${target.name} created.`);
}
@logClass
class Person {
constructor(public name: string) {}
}
const person = new Person('John'); // এটি "Class Person created." মুদ্রণ করবে।
এখানে @logClass একটি ক্লাস ডেকোরেটর যা Person ক্লাসের ইনস্ট্যান্স তৈরি হওয়ার সময় একটি মেসেজ লগ করবে।
৪. প্রপার্টি ডেকোরেটর
প্রপার্টি ডেকোরেটর কোনো প্রপার্টি অথবা ফিল্ডের উপর কাজ করে। এটি ফিল্ডের জন্য কাস্টম আচরণ যোগ করতে পারে। সাধারণত প্রপার্টি ডেকোরেটর একটি ফাংশন যা প্রপার্টি এবং তার ক্লাস কনটেক্সট প্যারামিটার হিসেবে গ্রহণ করে।
উদাহরণ:
function logProperty(target: any, propertyKey: string) {
let value = target[propertyKey];
const getter = () => {
console.log(`Getting value of ${propertyKey}: ${value}`);
return value;
};
const setter = (newValue: any) => {
console.log(`Setting value of ${propertyKey}: ${newValue}`);
value = newValue;
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
});
}
class Person {
@logProperty
name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person('John');
person.name = 'Alice'; // এটি "Setting value of name: Alice" মুদ্রণ করবে।
console.log(person.name); // এটি "Getting value of name: Alice" মুদ্রণ করবে।
এখানে @logProperty একটি প্রপার্টি ডেকোরেটর যা প্রপার্টি সেট এবং গেট করার সময় কাস্টম লগিং ফাংশন প্রয়োগ করে।
৫. মেথড ডেকোরেটর
মেথড ডেকোরেটর একটি ফাংশন যা ক্লাসের মেথডে কাস্টম আচরণ যোগ করতে ব্যবহৃত হয়। এটি সাধারণত মেথডের ইনপুট এবং আউটপুট পরিবর্তন করতে পারে।
উদাহরণ:
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Result of ${propertyKey}: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3); // এটি "Calling add with arguments: [2, 3]" এবং "Result of add: 5" মুদ্রণ করবে।
এখানে @logMethod একটি মেথড ডেকোরেটর যা add মেথডের ইনপুট এবং আউটপুট লগ করবে।
৬. প্যারামিটার ডেকোরেটর
প্যারামিটার ডেকোরেটর একটি ফাংশনের প্যারামিটারগুলির উপর কাজ করে। এটি মূলত একটি নির্দিষ্ট প্যারামিটার নিয়ে কাজ করে এবং তার কাস্টম আচরণ সেট করতে সাহায্য করে।
উদাহরণ:
function logParameter(target: any, propertyKey: string, parameterIndex: number) {
console.log(`Parameter at index ${parameterIndex} in method ${propertyKey} is being logged.`);
}
class User {
greet(@logParameter message: string): void {
console.log(message);
}
}
const user = new User();
user.greet('Hello'); // এটি "Parameter at index 0 in method greet is being logged." মুদ্রণ করবে।
এখানে @logParameter একটি প্যারামিটার ডেকোরেটর যা greet মেথডের প্যারামিটার লগ করবে।
৭. ডেকোরেটরস ব্যবহার করার কনফিগারেশন
ডেকোরেটরস ব্যবহারের জন্য TypeScript-এ একটি কনফিগারেশন সেটিং পরিবর্তন করতে হয়। tsconfig.json ফাইলে experimentalDecorators অপশনটি true করতে হবে।
{
"compilerOptions": {
"experimentalDecorators": true,
"target": "es6"
}
}
এটি ডেকোরেটরস ব্যবহারের জন্য TypeScript কম্পাইলারকে সক্ষম করবে।
সারাংশ
ডেকোরেটরস TypeScript-এ একটি শক্তিশালী টুল যা কোডের বিভিন্ন অংশে কাস্টম আচরণ যোগ করার জন্য ব্যবহৃত হয়। এটি কোডের রক্ষণাবেক্ষণ, পুনঃব্যবহারযোগ্যতা, এবং পাঠযোগ্যতা উন্নত করে। তবে, ডেকোরেটরস ব্যবহারের জন্য আপনাকে experimentalDecorators কনফিগারেশন সক্রিয় করতে হবে, যা TypeScript-এ ডেকোরেটরের বৈশিষ্ট্য সক্ষম করবে।
Read more