जावास्क्रिप्ट में मॉड्यूल की आवश्यकता बनाम निर्भरता इंजेक्शन


24

इन दिनों मेरे दिमाग में एक सवाल कौंध रहा था:

जिस तरह से हम जावास्क्रिप्ट को लगभग हर चीज के खिलाफ जाते हैं जो पारंपरिक सॉफ्टवेयर डेवलपमेंट में एक अच्छा अभ्यास माना जाता है?

मेरे पास इस कथन से संबंधित प्रश्नों / टिप्पणियों की एक श्रृंखला है, लेकिन StackExchange के प्रारूप का सम्मान करने के लिए, मुझे अलग-अलग प्रश्नों में विभाजित करना बेहतर होगा।

मॉड्यूल की आवश्यकता है

मानक जावास्क्रिप्ट कोड आजकल दिखता है:

const someModule = require('./someModule')

module.exports = function doSomethingWithRequest() {
  // do stuff
  someModule.someFunc()
  // do other stuff
}

लाभ

  • एनकैप्सुलेशन: मॉड्यूल स्टैंडअलोन काम करता है और सब कुछ जानता है कि उसे अपने कार्यों को करने की आवश्यकता है।
  • एक रंग के रूप में, मॉड्यूल का उपयोग करना ग्राहकों के लिए आसान है।

नुकसान

  • खराब परीक्षणशीलता: यह मानक है जब डीआई का उपयोग नहीं किया जाता है, लेकिन गतिशील भाषाओं में, जैसे कि इसे जावास्क्रिप्ट जैसे * mockeryया जैसे मॉड्यूल द्वारा दरकिनार किया जा सकता है rewire
  • यह निश्चित रूप से डीआईपी का उल्लंघन करता है - निर्भरता इंजेक्शन के साथ भ्रमित होने की नहीं। - चूंकि मैं केवल कंक्रीट मॉड्यूल आयात कर सकता हूं।
  • यह शायद OCP का उल्लंघन करता है - उदाहरण के लिए, कल्पना करें कि मेरे पास एक लॉग मॉड्यूल है जो फ़ाइल सिस्टम ( fsमॉड्यूल के माध्यम से ) को लिखता है । अगर मैं इसे नेटवर्क पर भेजने के लिए इस लॉग मॉड्यूल का विस्तार करना चाहता हूं, तो यह बहुत कठिन होगा।

* यह कॉमनजेएस या एएमडी मॉड्यूल के साथ काम कर सकता है क्योंकि वे ज्यादातर उपयोगकर्ता-भूमि में लागू होते हैं। हालाँकि, मुझे यकीन नहीं है कि यह ES6 importसिंटैक्स के साथ कैसे संभव हो सकता है ।

निर्भरता अन्तःक्षेपण

निर्भरता इंजेक्शन का उपयोग करना, यह अधिक पसंद किया जाएगा:

module.exports = function doSomethingWithRequest(someModule) {
  // do stuff
  someModule.someFunc()
  // do other stuff
}

लाभ

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

नुकसान

  • टूटा हुआ एनकैप्सुलेशन: मुख्य प्रश्न शेष है:

    ठीक है, तो निर्भरता को कौन बनाएगा / बनाएगा?

  • ऐसा करना मॉड्यूल के हर ग्राहक में बहुत WET लगता है ।
  • यह शायद मुझे एक वास्तविक परियोजना में संभव होने के लिए डि कंटेनर का उपयोग करने की आवश्यकता होगी।

तो, यहाँ असली सवाल यह है:

जावास्क्रिप्ट डेवलपर्स पहले दृष्टिकोण की ओर झुकाव क्यों करते हैं?

क्या यह सिर्फ "जावास्क्रिप्ट तरीका है"?

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

क्या मैं कुछ भूल रहा हूँ?


के रूप में .Net लड़का जो हाल ही में NodeJs में रुचि रखते हैं, मैं इसके साथ भी संघर्ष कर रहा हूं। मैंने परीक्षण उद्देश्यों के लिए ठीक होने के लिए प्रोक्सीक्वायर (रेवर की तरह) के साथ बंदर पैचिंग निर्भरता पाई है, लेकिन कभी-कभी आपको एक निर्भरता के कई कार्यान्वयन की आवश्यकता होती है ...
रबड़डैक

जवाबों:


6

मैं मुख्य रूप से एक PHP प्रोग्रामर हूं, लेकिन पिछले एक साल से 4 जावास्क्रिप्ट टीमों के संपर्क में हूं।

एक वस्तु-उन्मुख प्रोग्रामर के रूप में निर्भरता इंजेक्शन सिद्धांत सबसे अच्छा तरीका होगा, हालांकि मुझे कुछ जेएस डेवलपर्स द्वारा अन्यथा कहा गया है। JS एक अलग दुनिया है।

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

सामान्य दृष्टिकोण आमतौर पर यहां तक ​​जाता है कि एक निर्माणकर्ता को कभी भी उजागर न करें, बल्कि एक कारखाने के आवरण का उपयोग करके किसी वस्तु के निर्माण का खुलासा करें - ठीक उसी कारण के लिए: यदि आप किसी व्यक्ति को किसी वस्तु तक पहुंच देते हैं तो वे सीधे उन्हें तुरंत भेज सकते हैं कुछ भी बदलने की अनुमति है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.