हिन्दी

मेटाडेटा प्रबंधन और कोड संशोधन के लिए जावास्क्रिप्ट डेकोरेटर्स की शक्ति का अन्वेषण करें। अंतर्राष्ट्रीय सर्वोत्तम प्रथाओं के साथ, स्पष्टता और दक्षता के साथ अपने कोड को बेहतर बनाना सीखें।

जावास्क्रिप्ट डेकोरेटर्स: मेटाडेटा और कोड संशोधन को उजागर करना

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

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

डेकोरेटर्स मूल रूप से ऐसे फ़ंक्शन होते हैं जो अन्य फ़ंक्शन या क्लास को रैप करते हैं। वे सजाए गए तत्व के व्यवहार को उसके मूल कोड को सीधे बदले बिना संशोधित करने या बढ़ाने का एक तरीका प्रदान करते हैं। डेकोरेटर्स कक्षाओं, विधियों, एक्सेसर्स, गुणों, या पैरामीटर्स को सजाने के लिए @ प्रतीक के बाद एक फ़ंक्शन नाम का उपयोग करते हैं।

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

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

जावास्क्रिप्ट डेकोरेटर्स कई प्रकार के होते हैं, प्रत्येक आपके कोड के विभिन्न तत्वों को लक्षित करता है:

मूल सिंटैक्स

डेकोरेटर लागू करने का सिंटैक्स सीधा है:

@decoratorName
class MyClass {
  @methodDecorator
  myMethod( @parameterDecorator param: string ) {
    @propertyDecorator
    myProperty: number;
  }
}

यहाँ एक विश्लेषण है:

क्लास डेकोरेटर्स: क्लास व्यवहार को संशोधित करना

क्लास डेकोरेटर्स ऐसे फ़ंक्शन होते हैं जो क्लास के कंस्ट्रक्टर को एक तर्क के रूप में प्राप्त करते हैं। उनका उपयोग किया जा सकता है:

उदाहरण: क्लास निर्माण की लॉगिंग

कल्पना कीजिए कि आप जब भी किसी क्लास का एक नया इंस्टेंस बनाया जाता है, तो आप लॉग करना चाहते हैं। एक क्लास डेकोरेटर इसे प्राप्त कर सकता है:

function logClassCreation(constructor: Function) {
  return class extends constructor {
    constructor(...args: any[]) {
      console.log(`Creating a new instance of ${constructor.name}`);
      super(...args);
    }
  };
}

@logClassCreation
class User {
  name: string;

  constructor(name: string) {
    this.name = name;
  }
}

const user = new User("Alice"); // Output: Creating a new instance of User

इस उदाहरण में, logClassCreation मूल User क्लास को एक नई क्लास से बदल देता है जो इसे विस्तारित करती है। नई क्लास का कंस्ट्रक्टर एक संदेश लॉग करता है और फिर super का उपयोग करके मूल कंस्ट्रक्टर को कॉल करता है।

मेथड डेकोरेटर्स: मेथड की कार्यक्षमता को बढ़ाना

मेथड डेकोरेटर्स को तीन तर्क मिलते हैं:

उनका उपयोग किया जा सकता है:

उदाहरण: मेथड कॉल्स की लॉगिंग

आइए एक मेथड डेकोरेटर बनाएं जो हर बार जब कोई मेथड कॉल किया जाता है, उसके तर्कों के साथ लॉग करता है:

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

  descriptor.value = function (...args: any[]) {
    console.log(`Calling method ${propertyKey} with arguments: ${JSON.stringify(args)}`);
    const result = originalMethod.apply(this, args);
    console.log(`Method ${propertyKey} returned: ${result}`);
    return result;
  };

  return descriptor;
}

class Calculator {
  @logMethodCall
  add(x: number, y: number): number {
    return x + y;
  }
}

const calculator = new Calculator();
const sum = calculator.add(5, 3); // Output: Calling method add with arguments: [5,3]
                                 //         Method add returned: 8

logMethodCall डेकोरेटर मूल विधि को रैप करता है। मूल विधि को निष्पादित करने से पहले, यह विधि का नाम और तर्क लॉग करता है। निष्पादन के बाद, यह लौटे हुए मान को लॉग करता है।

एक्सेसर डेकोरेटर्स: प्रॉपर्टी एक्सेस को नियंत्रित करना

एक्सेसर डेकोरेटर्स मेथड डेकोरेटर्स के समान होते हैं लेकिन विशेष रूप से गेटर और सेटर विधियों (एक्सेसर्स) पर लागू होते हैं। उन्हें मेथड डेकोरेटर्स के समान ही तीन तर्क मिलते हैं:

उनका उपयोग किया जा सकता है:

उदाहरण: सेटर मानों का सत्यापन

आइए एक एक्सेसर डेकोरेटर बनाएं जो किसी प्रॉपर्टी के लिए निर्धारित किए जा रहे मान को मान्य करता है:

function validateAge(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalSet = descriptor.set;

  descriptor.set = function (value: number) {
    if (value < 0) {
      throw new Error("Age cannot be negative");
    }
    originalSet.call(this, value);
  };

  return descriptor;
}

class Person {
  private _age: number;

  @validateAge
  set age(value: number) {
    this._age = value;
  }

  get age(): number {
    return this._age;
  }
}

const person = new Person();
person.age = 30; // Works fine

try {
  person.age = -5; // Throws an error: Age cannot be negative
} catch (error:any) {
  console.error(error.message);
}

validateAge डेकोरेटर age प्रॉपर्टी के लिए सेटर को इंटरसेप्ट करता है। यह जांचता है कि मान नकारात्मक है या नहीं और यदि है तो एक त्रुटि फेंकता है। अन्यथा, यह मूल सेटर को कॉल करता है।

प्रॉपर्टी डेकोरेटर्स: प्रॉपर्टी डिस्क्रिप्टर को संशोधित करना

प्रॉपर्टी डेकोरेटर्स को दो तर्क मिलते हैं:

उनका उपयोग किया जा सकता है:

उदाहरण: प्रॉपर्टी को केवल-पठनीय बनाना

आइए एक प्रॉपर्टी डेकोरेटर बनाएं जो किसी प्रॉपर्टी को केवल-पठनीय बनाता है:

function readOnly(target: any, propertyKey: string) {
  Object.defineProperty(target, propertyKey, {
    writable: false,
  });
}

class Configuration {
  @readOnly
  apiUrl: string = "https://api.example.com";
}

const config = new Configuration();

try {
  (config as any).apiUrl = "https://newapi.example.com"; // Throws an error in strict mode
  console.log(config.apiUrl); // Output: https://api.example.com
} catch (error) {
  console.error("Cannot assign to read only property 'apiUrl' of object '#'", error);
}

readOnly डेकोरेटर प्रॉपर्टी डिस्क्रिप्टर को संशोधित करने के लिए Object.defineProperty का उपयोग करता है, writable को false पर सेट करता है। अब प्रॉपर्टी को संशोधित करने का प्रयास करने पर एक त्रुटि होगी (सख्त मोड में) या इसे अनदेखा कर दिया जाएगा।

पैरामीटर डेकोरेटर्स: पैरामीटर्स के बारे में मेटाडेटा प्रदान करना

पैरामीटर डेकोरेटर्स को तीन तर्क मिलते हैं:

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

उदाहरण: डिपेंडेंसी इंजेक्शन

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

const dependencies: any[] = [];

function inject(token: any) {
  return function (target: any, propertyKey: string | symbol, parameterIndex: number) {
    dependencies.push({
      target,
      propertyKey,
      parameterIndex,
      token,
    });
  };
}

class UserService {
  getUser(id: number) {
    return `User with ID ${id}`;
  }
}

class UserController {
  private userService: UserService;

  constructor(@inject(UserService) userService: UserService) {
    this.userService = userService;
  }

  getUser(id: number) {
    return this.userService.getUser(id);
  }
}

//Simplified retrieval of the dependencies
const userServiceInstance = new UserService();
const userController = new UserController(userServiceInstance);
console.log(userController.getUser(123)); // Output: User with ID 123

इस उदाहरण में, @inject डेकोरेटर dependencies ऐरे में userService पैरामीटर के बारे में मेटाडेटा संग्रहीत करता है। एक डिपेंडेंसी इंजेक्शन कंटेनर तब इस मेटाडेटा का उपयोग उपयुक्त निर्भरता को हल करने और इंजेक्ट करने के लिए कर सकता है।

व्यावहारिक अनुप्रयोग और उपयोग के मामले

कोड की गुणवत्ता और रखरखाव में सुधार के लिए डेकोरेटर्स को विभिन्न परिदृश्यों में लागू किया जा सकता है:

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

डेकोरेटर्स कई प्रमुख लाभ प्रदान करते हैं:

विचार और सर्वोत्तम प्रथाएं

विभिन्न वातावरणों में डेकोरेटर्स

हालांकि डेकोरेटर्स ESNext विनिर्देश का हिस्सा हैं, उनका समर्थन विभिन्न जावास्क्रिप्ट वातावरणों में भिन्न होता है:

डेकोरेटर्स पर वैश्विक परिप्रेक्ष्य

डेकोरेटर्स को अपनाना विभिन्न क्षेत्रों और विकास समुदायों में भिन्न होता है। कुछ क्षेत्रों में, जहाँ टाइपस्क्रिप्ट को व्यापक रूप से अपनाया जाता है (जैसे, उत्तरी अमेरिका और यूरोप के कुछ हिस्से), डेकोरेटर्स का आमतौर पर उपयोग किया जाता है। अन्य क्षेत्रों में, जहाँ जावास्क्रिप्ट अधिक प्रचलित है या जहाँ डेवलपर्स सरल पैटर्न पसंद करते हैं, डेकोरेटर्स कम आम हो सकते हैं।

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

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

निष्कर्ष

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