इन दिनों मेरे दिमाग में एक सवाल कौंध रहा था:
जिस तरह से हम जावास्क्रिप्ट को लगभग हर चीज के खिलाफ जाते हैं जो पारंपरिक सॉफ्टवेयर डेवलपमेंट में एक अच्छा अभ्यास माना जाता है?
मेरे पास इस कथन से संबंधित प्रश्नों / टिप्पणियों की एक श्रृंखला है, लेकिन 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
}
लाभ
- परीक्षण क्षमता में वृद्धि: अब
someModule
ES6 सिंटैक्स का उपयोग करके स्टब / मॉक करना आसान हो गया है । - यह संभव है, जरूरी नहीं है, हालांकि के रूप में ग्राहक मॉड्यूल अभी भी कार्यान्वयन और नहीं एक इंटरफेस करने के लिए प्रोग्राम किया जा सकता: DIP सम्मान करने के लिए।
नुकसान
- टूटा हुआ एनकैप्सुलेशन: मुख्य प्रश्न शेष है:
ठीक है, तो निर्भरता को कौन बनाएगा / बनाएगा?
- ऐसा करना मॉड्यूल के हर ग्राहक में बहुत WET लगता है ।
- यह शायद मुझे एक वास्तविक परियोजना में संभव होने के लिए डि कंटेनर का उपयोग करने की आवश्यकता होगी।
तो, यहाँ असली सवाल यह है:
जावास्क्रिप्ट डेवलपर्स पहले दृष्टिकोण की ओर झुकाव क्यों करते हैं?
क्या यह सिर्फ "जावास्क्रिप्ट तरीका है"?
मैं खुद ज्यादातर समय इस तरह का कोड लिखता हूं। मेरे पास पुस्तकालयों का उपयोग करते हुए परीक्षण सेटअप में मेरा उचित हिस्सा था, लेकिन ऐसा करने में हमेशा गलत लगा।
क्या मैं कुछ भूल रहा हूँ?