जावास्क्रिप्ट में "मॉड्यूल" पैटर्न को पार्स करना

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

छवि

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

Iife


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

(function () { //      })(); 

इससे पहले कि हम तथाकथित स्व-आह्वान समारोह ( IIFE , तत्काल-इनवॉइस फ़ंक्शन अभिव्यक्ति, तुरंत कार्यात्मक अभिव्यक्ति कहा जाता है)। इस तरह के फ़ंक्शन को इसकी घोषणा के तुरंत बाद निष्पादित किया जाता है। एक निश्चित समस्या को हल करने के लिए इस तरह के कार्यों का उपयोग करना सुविधाजनक है, जिसे वैश्विक दायरे में कुछ भी नहीं छोड़ने के बिना केवल एक बार हल करने की आवश्यकता है। इस फ़ंक्शन के अंदर (साथ ही अन्य कार्यों के अंदर) एक निजी गुंजाइश बनाई जाती है, बाहर से दुर्गम। यही है, अगर इस दायरे के अंदर एक और फ़ंक्शन घोषित किया जाता है, तो IIFE के निष्पादित होने के बाद, इस तक पहुंच संभव नहीं होगी।

 (function () { var myFunction = function () {   //     }; })(); 

अब कार्यक्रम के मुख्य पाठ से myFunction फ़ंक्शन तक पहुँचने का प्रयास करते हैं:

 myFunction(); // Uncaught ReferenceError: myFunction is not defined 

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

IIFE और API मॉड्यूल से एक वस्तु लौटाते हुए


यह कैसे सुनिश्चित करें कि किसी अन्य फ़ंक्शन के अंदर घोषित एक फ़ंक्शन अभी भी एक्सेस किया जा सकता है? तथ्य की बात के रूप में, अब हम जिसके बारे में बात करने जा रहे हैं वह है "मॉड्यूल" पैटर्न। निम्नलिखित उदाहरण पर विचार करें।

 //   var Module = (function () { return {   myMethod: function () {     console.log('myMethod has been called.');   } }; })(); //      Module.myMethod(); 

आप देख सकते हैं कि समान IIFE का उपयोग यहां पहले की तरह किया गया है, लेकिन अब एक विधि के साथ एक फ़ंक्शन फ़ंक्शन से वापस आ गया है, जिसे वैश्विक दायरे से एक्सेस किया जा सकता है। स्वाभाविक रूप से, इस पद्धति को नहीं कहा जा सकता है। यह ध्यान दिया जाना चाहिए कि इस उदाहरण में हम क्लोजर क्षमताओं का उपयोग नहीं करते हैं, हम नीचे इस बारे में बात करेंगे।

IIFE से लौटी वस्तु एक सामान्य वस्तु है जिसमें कई विधियाँ और गुण हो सकते हैं। वे एक सार्वजनिक इंटरफ़ेस या मॉड्यूल एपीआई बनाते हैं।

 //   var Module = (function () { return {   myMethod: function () {   },   someOtherMethod: function () {   } }; })(); //      Module.myMethod(); Module.someOtherMethod(); 

निजी चर और कार्य बंद में संग्रहीत


अब निजी चर और कार्यों के बारे में बात करने का समय है। उदाहरण के लिए, यह कुछ सहायक कार्य हो सकते हैं जो मॉड्यूल के आंतरिक तंत्र के संचालन को सुनिश्चित करते हैं।

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

 var Module = (function () { var privateMethod = function () { }; return {   publicMethod: function () {   } }; })(); 

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

इस तरह के कार्यों के साथ काम करते समय, आपको यह विचार करने की आवश्यकता होती है कि उन्हें उसी दायरे में घोषित अन्य कार्यों से पहुँचा जा सकता है, जिसमें IIFE से लौटाई गई वस्तु की विधियाँ भी शामिल हैं, और return बाद भी वह वस्तु return आती है । अर्थात्, सार्वजनिक विधियों के पास निजी कार्यों तक पहुंच है, वे उनके साथ बातचीत कर सकते हैं, लेकिन वैश्विक दायरे में, ये निजी कार्य उपलब्ध नहीं हैं।

 var Module = (function () { var privateMethod = function () { }; return {   publicMethod: function () {     //       privateMethod,      :     // privateMethod();   } }; })(); 

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

यहाँ IIFE से लौटी हुई एक वस्तु का एक उदाहरण है जिसमें सार्वजनिक विधियाँ हैं और निजी कार्यों तक पहुँच प्राप्त कर सकते हैं:

 var Module = (function () { var myModule = {}; var privateMethod = function () { }; myModule.publicMethod = function () { }; myModule.anotherPublicMethod = function () { }; return myModule; //      })(); //   Module.publicMethod(); 

निजी और सार्वजनिक सुविधाओं का नामकरण


एक समझौता है, जिसके अनुसार निजी कार्यों के नाम की शुरुआत में एक अंडरस्कोर लगाया जाता है। यह केवल कोड को देखकर समझने की अनुमति देता है कि कौन से कार्य आंतरिक हैं और जो सार्वजनिक रूप से उपलब्ध हैं। उदाहरण के लिए, यह इस तरह दिख सकता है:

 var Module = (function () { var _privateMethod = function () { }; var publicMethod = function () { }; return {   publicMethod: publicMethod, } })(); 

परिणाम


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

प्रिय पाठकों! क्या आप अपने JS प्रोजेक्ट्स में "मॉड्यूल" पैटर्न का उपयोग करते हैं?

Source: https://habr.com/ru/post/hi419997/


All Articles