हिन्दी

टाइपस्क्रिप्ट डेकोरेटर्स का अन्वेषण करें: कोड संरचना, पुन: प्रयोज्यता और रखरखाव को बढ़ाने के लिए एक शक्तिशाली मेटाप्रोग्रामिंग सुविधा। व्यावहारिक उदाहरणों के साथ उनका प्रभावी ढंग से लाभ उठाना सीखें।

टाइपस्क्रिप्ट डेकोरेटर्स: मेटाप्रोग्रामिंग की शक्ति का अनावरण

टाइपस्क्रिप्ट डेकोरेटर्स मेटाप्रोग्रामिंग क्षमताओं के साथ आपके कोड को बेहतर बनाने का एक शक्तिशाली और सुंदर तरीका प्रदान करते हैं। वे आपके कोड के मूल तर्क को बदले बिना व्यवहार और एनोटेशन इंजेक्ट करने की अनुमति देते हुए, डिज़ाइन समय पर कक्षाओं, विधियों, गुणों और मापदंडों को संशोधित और विस्तारित करने के लिए एक तंत्र प्रदान करते हैं। यह ब्लॉग पोस्ट टाइपस्क्रिप्ट डेकोरेटर्स की जटिलताओं में गहराई से उतरेगा, जो सभी स्तरों के डेवलपर्स के लिए एक व्यापक गाइड प्रदान करेगा। हम पता लगाएंगे कि डेकोरेटर्स क्या हैं, वे कैसे काम करते हैं, उपलब्ध विभिन्न प्रकार, व्यावहारिक उदाहरण और उनके प्रभावी उपयोग के लिए सर्वोत्तम अभ्यास। चाहे आप टाइपस्क्रिप्ट में नए हों या एक अनुभवी डेवलपर हों, यह गाइड आपको स्वच्छ, अधिक रखरखाव योग्य और अधिक अभिव्यंजक कोड के लिए डेकोरेटर्स का लाभ उठाने के ज्ञान से लैस करेगा।

टाइपस्क्रिप्ट डेकोरेटर्स क्या हैं?

अपने मूल में, टाइपस्क्रिप्ट डेकोरेटर्स मेटाप्रोग्रामिंग का एक रूप हैं। वे अनिवार्य रूप से ऐसे फ़ंक्शन हैं जो एक या अधिक तर्क लेते हैं (आमतौर पर वह चीज़ जिसे डेकोरेट किया जा रहा है, जैसे कि क्लास, मेथड, प्रॉपर्टी या पैरामीटर) और इसे संशोधित कर सकते हैं या नई कार्यक्षमता जोड़ सकते हैं। उन्हें एनोटेशन या विशेषताओं के रूप में सोचें जिन्हें आप अपने कोड से जोड़ते हैं। इन एनोटेशन का उपयोग तब कोड के बारे में मेटाडेटा प्रदान करने, या इसके व्यवहार को बदलने के लिए किया जा सकता है।

डेकोरेटर्स को `@` प्रतीक के बाद एक फ़ंक्शन कॉल (उदाहरण के लिए, `@decoratorName()`) का उपयोग करके परिभाषित किया जाता है। डेकोरेटर फ़ंक्शन तब आपके एप्लिकेशन के डिज़ाइन-टाइम चरण के दौरान निष्पादित किया जाएगा।

डेकोरेटर्स जावा, सी#, और पायथन जैसी भाषाओं में समान सुविधाओं से प्रेरित हैं। वे आपकी मुख्य तर्क को साफ रखकर और आपके मेटाडेटा या संशोधन पहलुओं को एक समर्पित स्थान पर केंद्रित करके चिंताओं को अलग करने और कोड पुन: प्रयोज्यता को बढ़ावा देने का एक तरीका प्रदान करते हैं।

डेकोरेटर्स कैसे काम करते हैं

टाइपस्क्रिप्ट कंपाइलर डेकोरेटर्स को ऐसे फ़ंक्शंस में बदल देता है जिन्हें डिज़ाइन समय पर कॉल किया जाता है। डेकोरेटर फ़ंक्शन को दिए गए सटीक तर्क उपयोग किए जा रहे डेकोरेटर के प्रकार (क्लास, मेथड, प्रॉपर्टी या पैरामीटर) पर निर्भर करते हैं। आइए विभिन्न प्रकार के डेकोरेटर्स और उनके संबंधित तर्कों को तोड़ें:

प्रभावी डेकोरेटर्स लिखने के लिए इन तर्क हस्ताक्षरों को समझना महत्वपूर्ण है।

डेकोरेटर्स के प्रकार

टाइपस्क्रिप्ट कई प्रकार के डेकोरेटर्स का समर्थन करता है, जिनमें से प्रत्येक एक विशिष्ट उद्देश्य को पूरा करता है:

व्यावहारिक उदाहरण

आइए टाइपस्क्रिप्ट में डेकोरेटर्स का उपयोग करने के तरीके को स्पष्ट करने के लिए कुछ व्यावहारिक उदाहरण देखें।

क्लास डेकोरेटर उदाहरण: एक टाइमस्टैम्प जोड़ना

कल्पना कीजिए कि आप किसी क्लास के प्रत्येक उदाहरण में एक टाइमस्टैम्प जोड़ना चाहते हैं। आप इसे पूरा करने के लिए एक क्लास डेकोरेटर का उपयोग कर सकते हैं:


function addTimestamp<T extends { new(...args: any[]): {} }>(constructor: T) {
  return class extends constructor {
    timestamp = Date.now();
  };
}

@addTimestamp
class MyClass {
  constructor() {
    console.log('MyClass created');
  }
}

const instance = new MyClass();
console.log(instance.timestamp); // आउटपुट: एक टाइमस्टैम्प

इस उदाहरण में, `addTimestamp` डेकोरेटर क्लास इंस्टेंस में एक `timestamp` प्रॉपर्टी जोड़ता है। यह मूल क्लास परिभाषा को सीधे संशोधित किए बिना मूल्यवान डिबगिंग या ऑडिट ट्रेल जानकारी प्रदान करता है।

मेथड डेकोरेटर उदाहरण: मेथड कॉल्स को लॉग करना

आप मेथड कॉल्स और उनके तर्कों को लॉग करने के लिए एक मेथड डेकोरेटर का उपयोग कर सकते हैं:


function logMethod(target: any, key: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function (...args: any[]) {
    console.log(`[लॉग] मेथड ${key} को तर्कों के साथ कॉल किया गया:`, args);
    const result = originalMethod.apply(this, args);
    console.log(`[लॉग] मेथड ${key} ने लौटाया:`, result);
    return result;
  };

  return descriptor;
}

class Greeter {
  @logMethod
  greet(message: string): string {
    return `Hello, ${message}!`;
  }
}

const greeter = new Greeter();
greeter.greet('World');
// आउटपुट:
// [लॉग] मेथड greet को तर्कों के साथ कॉल किया गया: [ 'World' ]
// [लॉग] मेथड greet ने लौटाया: Hello, World!

यह उदाहरण हर बार जब `greet` मेथड को कॉल किया जाता है, तो उसके तर्कों और वापसी मान के साथ लॉग करता है। यह अधिक जटिल अनुप्रयोगों में डिबगिंग और निगरानी के लिए बहुत उपयोगी है।

प्रॉपर्टी डेकोरेटर उदाहरण: सत्यापन जोड़ना

यहां एक प्रॉपर्टी डेकोरेटर का एक उदाहरण है जो मूल सत्यापन जोड़ता है:


function validate(target: any, key: string) {
  let value: any;

  const getter = function () {
    return value;
  };

  const setter = function (newValue: any) {
    if (typeof newValue !== 'number') {
      console.warn(`[चेतावनी] अमान्य प्रॉपर्टी मान: ${key}। एक संख्या की उम्मीद थी।`);
      return;
    }
    value = newValue;
  };

  Object.defineProperty(target, key, {
    get: getter,
    set: setter,
    enumerable: true,
    configurable: true,
  });
}

class Person {
  @validate
  age: number; //  <- सत्यापन के साथ प्रॉपर्टी
}

const person = new Person();
person.age = 'abc'; // एक चेतावनी लॉग करता है
person.age = 30;   // मान सेट करता है
console.log(person.age); // आउटपुट: 30

इस `validate` डेकोरेटर में, हम जांचते हैं कि निर्दिष्ट मान एक संख्या है या नहीं। यदि नहीं, तो हम एक चेतावनी लॉग करते हैं। यह एक सरल उदाहरण है लेकिन यह दिखाता है कि डेटा अखंडता को लागू करने के लिए डेकोरेटर्स का उपयोग कैसे किया जा सकता है।

पैरामीटर डेकोरेटर उदाहरण: निर्भरता इंजेक्शन (सरलीकृत)

जबकि पूर्ण विकसित निर्भरता इंजेक्शन फ्रेमवर्क अक्सर अधिक परिष्कृत तंत्रों का उपयोग करते हैं, डेकोरेटर्स का उपयोग इंजेक्शन के लिए मापदंडों को चिह्नित करने के लिए भी किया जा सकता है। यह उदाहरण एक सरलीकृत चित्रण है:


// यह एक सरलीकरण है और वास्तविक इंजेक्शन को नहीं संभालता है। वास्तविक DI अधिक जटिल है।
function Inject(service: any) {
  return function (target: any, propertyKey: string | symbol, parameterIndex: number) {
    // सेवा को कहीं स्टोर करें (उदाहरण के लिए, एक स्थिर संपत्ति या मानचित्र में)
    if (!target.injectedServices) {
      target.injectedServices = {};
    }
    target.injectedServices[parameterIndex] = service;
  };
}

class MyService {
  doSomething() { /* ... */ }
}

class MyComponent {
  constructor(@Inject(MyService) private myService: MyService) {
    // एक वास्तविक प्रणाली में, DI कंटेनर यहाँ 'myService' को हल करेगा।
    console.log('MyComponent इसके साथ बनाया गया:', myService.constructor.name); //उदाहरण
  }
}

const component = new MyComponent(new MyService());  // सेवा इंजेक्ट करना (सरलीकृत)।

`Inject` डेकोरेटर एक पैरामीटर को एक सेवा की आवश्यकता के रूप में चिह्नित करता है। यह उदाहरण दर्शाता है कि एक डेकोरेटर निर्भरता इंजेक्शन की आवश्यकता वाले मापदंडों की पहचान कैसे कर सकता है (लेकिन एक वास्तविक फ्रेमवर्क को सेवा समाधान का प्रबंधन करने की आवश्यकता है)।

डेकोरेटर्स का उपयोग करने के लाभ

डेकोरेटर्स का उपयोग करने के लिए सर्वोत्तम अभ्यास

उन्नत अवधारणाएँ

डेकोरेटर फैक्ट्रियाँ

डेकोरेटर फैक्ट्रियाँ ऐसे फ़ंक्शन हैं जो डेकोरेटर फ़ंक्शन लौटाते हैं। यह आपको अपने डेकोरेटर्स को तर्क पास करने की अनुमति देता है, जिससे वे अधिक लचीले और विन्यास योग्य हो जाते हैं। उदाहरण के लिए, आप एक सत्यापन डेकोरेटर फ़ैक्टरी बना सकते हैं जो आपको सत्यापन नियमों को निर्दिष्ट करने की अनुमति देती है:


function validate(minLength: number) {
  return function (target: any, key: string) {
    let value: string;

    const getter = function () {
      return value;
    };

    const setter = function (newValue: string) {
      if (typeof newValue !== 'string') {
        console.warn(`[चेतावनी] अमान्य प्रॉपर्टी मान: ${key}। एक स्ट्रिंग की उम्मीद थी।`);
        return;
      }
      if (newValue.length < minLength) {
        console.warn(`[चेतावनी] ${key} कम से कम ${minLength} वर्ण लंबा होना चाहिए।`);
        return;
      }
      value = newValue;
    };

    Object.defineProperty(target, key, {
      get: getter,
      set: setter,
      enumerable: true,
      configurable: true,
    });
  };
}

class Person {
  @validate(3) // न्यूनतम 3 की लंबाई के साथ मान्य करें
  name: string;
}

const person = new Person();
person.name = 'Jo';
console.log(person.name); // एक चेतावनी लॉग करता है, मान सेट करता है।
person.name = 'John';
console.log(person.name); // आउटपुट: John

डेकोरेटर फैक्ट्रियाँ डेकोरेटर्स को बहुत अधिक अनुकूलनीय बनाती हैं।

डेकोरेटर्स को कंपोज करना

आप एक ही तत्व पर कई डेकोरेटर्स लागू कर सकते हैं। जिस क्रम में वे लागू होते हैं वह कभी-कभी महत्वपूर्ण हो सकता है। क्रम नीचे से ऊपर की ओर है (जैसा लिखा गया है)। उदाहरण के लिए:


function first() {
  console.log('first(): फैक्ट्री का मूल्यांकन किया गया');
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log('first(): कॉल किया गया');
  }
}

function second() {
  console.log('second(): फैक्ट्री का मूल्यांकन किया गया');
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log('second(): कॉल किया गया');
  }
}

class ExampleClass {
  @first()
  @second()
  method() {}
}

// आउटपुट:
// second(): फैक्ट्री का मूल्यांकन किया गया
// first(): फैक्ट्री का मूल्यांकन किया गया
// second(): कॉल किया गया
// first(): कॉल किया गया

ध्यान दें कि फ़ैक्टरी फ़ंक्शन उसी क्रम में मूल्यांकित किए जाते हैं जैसे वे दिखाई देते हैं, लेकिन डेकोरेटर फ़ंक्शन उल्टे क्रम में कॉल किए जाते हैं। इस क्रम को समझें यदि आपके डेकोरेटर्स एक दूसरे पर निर्भर करते हैं।

डेकोरेटर्स और मेटाडेटा रिफ्लेक्शन

डेकोरेटर्स मेटाडेटा रिफ्लेक्शन (जैसे, `reflect-metadata` जैसी लाइब्रेरी का उपयोग करके) के साथ मिलकर अधिक गतिशील व्यवहार प्राप्त करने के लिए काम कर सकते हैं। यह आपको, उदाहरण के लिए, रनटाइम के दौरान सजाए गए तत्वों के बारे में जानकारी संग्रहीत करने और पुनर्प्राप्त करने की अनुमति देता है। यह फ्रेमवर्क और निर्भरता इंजेक्शन सिस्टम में विशेष रूप से सहायक है। डेकोरेटर्स मेटाडेटा के साथ कक्षाओं या विधियों को एनोटेट कर सकते हैं, और फिर उस मेटाडेटा को खोजने और उपयोग करने के लिए रिफ्लेक्शन का उपयोग किया जा सकता है।

लोकप्रिय फ्रेमवर्क और पुस्तकालयों में डेकोरेटर्स

डेकोरेटर्स कई आधुनिक जावास्क्रिप्ट फ्रेमवर्क और पुस्तकालयों के अभिन्न अंग बन गए हैं। उनके आवेदन को जानने से आपको फ्रेमवर्क की वास्तुकला और यह विभिन्न कार्यों को कैसे सुव्यवस्थित करता है, यह समझने में मदद मिलती है।

ये फ्रेमवर्क और पुस्तकालय प्रदर्शित करते हैं कि कैसे डेकोरेटर्स कोड संगठन को बढ़ाते हैं, सामान्य कार्यों को सरल बनाते हैं, और वास्तविक दुनिया के अनुप्रयोगों में रखरखाव को बढ़ावा देते हैं।

चुनौतियाँ और विचार

निष्कर्ष

टाइपस्क्रिप्ट डेकोरेटर्स एक शक्तिशाली मेटाप्रोग्रामिंग सुविधा है जो आपके कोड की संरचना, पुन: प्रयोज्यता और रखरखाव में काफी सुधार कर सकती है। विभिन्न प्रकार के डेकोरेटर्स, वे कैसे काम करते हैं, और उनके उपयोग के लिए सर्वोत्तम प्रथाओं को समझकर, आप स्वच्छ, अधिक अभिव्यंजक और अधिक कुशल एप्लिकेशन बनाने के लिए उनका लाभ उठा सकते हैं। चाहे आप एक साधारण एप्लिकेशन बना रहे हों या एक जटिल उद्यम-स्तरीय प्रणाली, डेकोरेटर्स आपके विकास वर्कफ़्लो को बढ़ाने के लिए एक मूल्यवान उपकरण प्रदान करते हैं। डेकोरेटर्स को अपनाने से कोड की गुणवत्ता में उल्लेखनीय सुधार होता है। यह समझकर कि डेकोरेटर्स Angular और NestJS जैसे लोकप्रिय फ्रेमवर्क के भीतर कैसे एकीकृत होते हैं, डेवलपर्स स्केलेबल, रखरखाव योग्य और मजबूत एप्लिकेशन बनाने के लिए अपनी पूरी क्षमता का लाभ उठा सकते हैं। कुंजी उनके उद्देश्य को समझना है और उन्हें उपयुक्त संदर्भों में कैसे लागू किया जाए, यह सुनिश्चित करना है कि लाभ किसी भी संभावित कमियों से अधिक हों।

डेकोरेटर्स को प्रभावी ढंग से लागू करके, आप अपने कोड को बेहतर संरचना, रखरखाव और दक्षता के साथ बढ़ा सकते हैं। यह गाइड टाइपस्क्रिप्ट डेकोरेटर्स का उपयोग करने के तरीके का एक व्यापक अवलोकन प्रदान करता है। इस ज्ञान के साथ, आप बेहतर और अधिक रखरखाव योग्य टाइपस्क्रिप्ट कोड बनाने के लिए सशक्त हैं। आगे बढ़ो और डेकोरेट करो!