पैरामीटर बनाम वैश्विक चर


10

मेरे पास एक बहुत ही सरल प्रश्न है जो कुछ समय के लिए मुझे परेशान कर रहा है जब मेरा कोड बढ़ने लगा है।

जब वे नेस्टेड फ़ंक्शन कॉल के लंबे मार्गों से गुजरते हैं, तो क्या मापदंडों को वैश्विक चर द्वारा प्रतिस्थापित किया जाना चाहिए?

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

मुझे खुद को समझाने दो:

functionA(){
   x = something
   functionB(x)
}
functionB(x){
   functionC(x)
}
functionC(x){
   finallyDoSomethingWithX(x)
}
finallyDoSomethingWithX(x){
  x += 1 //Very dummy example ignoring pass by value, not reference.
}

द्वारा प्रतिस्थापित:

globalX;
functionA(){
   globalX = something
   functionB()
}
...
...
...
finallyDoSomethingWithX(){
   globalX += 1
}

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

मुझे लगता है कि यह मेरे साथ हो रहा है क्योंकि मैं वास्तव में डिज़ाइन पैटर्न का उपयोग नहीं कर रहा हूं क्योंकि मैं जावास्क्रिप्ट में प्रोग्रामिंग कर रहा हूं, जो कि मेरे लिए मध्यम परियोजनाओं के लिए एक-स्क्रिप्ट-सौदों-के साथ सभी भाषा की तरह लगता है।

कोई सलाह? पैटर्न? जरूरत पड़ने पर मैं और विशिष्ट हो सकता हूं।


5
आमतौर पर, यदि आप चर को बहुत गहराई से पारित कर रहे हैं, तो आपने समस्या को सही ढंग से नहीं तोड़ा है। वैश्विक चर के रूप में सिस्टम में कहीं और ड्राइविंग राज्य, प्लेग की तरह से बचें। एक निश्चित बिंदु पर प्रबंधन करना असंभव है, और आप चीजों को यादृच्छिक रूप से तोड़ पाएंगे क्योंकि कुछ राज्य एक फ़ंक्शन द्वारा उत्परिवर्तित होते हैं जो आप बेतरतीब ढंग से उम्मीद नहीं कर रहे थे।
mgw854

प्लेग की तरह इससे बचें। समझ लिया। क्या आप "आप समस्या को सही ढंग से नहीं तोड़ पाए हैं" पर थोड़ा और विस्तृत कर सकते हैं। मैं सामान्य विचार को समझता हूं लेकिन मैं इसे एक उदाहरण या किसी चीज के साथ नहीं समझ सकता।
AFP_555

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

@KilianFoth धन्यवाद। क्या आप कृपया कुछ कोड के साथ विस्तृत कर सकते हैं ताकि मैं उत्तर की जांच कर सकूं?
AFP_555

1
अपने जावास्क्रिप्ट कोड की संरचना का इलाज करने पर विचार करें जैसा कि आप अन्य भाषाओं (जैसे कि "वास्तविक" कक्षाओं का उपयोग करते हैं) में करेंगे। SO पर इस संबंधित प्रश्न के कुछ उपयोगी लिंक: stackoverflow.com/questions/927651/…
बेन कॉटरेल

जवाबों:


7

वैश्विक चर का उपयोग न करें।

इसके अलावा, कार्यों की जंजीरों नीचे मापदंडों पारित नहीं करते!

यह मुश्किल है क्योंकि आप एक वास्तविक उदाहरण का उपयोग नहीं करते हैं। लेकिन आम तौर पर एक बेहतर दृष्टिकोण होगा।

कहते हैं कि हमारे पास एक पासवर्ड चर है जिसे हमें एपिस का उपयोग करने की आवश्यकता है जो विभिन्न निम्न स्तर के कार्यों द्वारा उपयोग किया जाता है।

वैश्विक दृष्टिकोण (psudo कोड)

var pass;

function multiply(a,b) {
   return apiMultiply(pass,a,b);
}

पैरामीटर पासिंग अप्रोच

function multiply(a,b,pass) {
    return apiMultiply(pass,a,b);
}

वस्तु दृष्टिकोण

class math {
    var api;
    constructor(pass) {
        api = new api(pass);
    }

    function Multiply(a,b) {
        api.Multiply(a,b); //uses pass from constructor
    }
}

उत्कृष्ट। यह तरीका वैश्विक वातावरण में नहीं है और यह múltiple कार्यों के लिए एक पैरामीटर भी नहीं है क्योंकि इसे ऑब्जेक्ट की विशेषताओं से लिया जा सकता है। धन्यवाद।
AFP_555

3

प्लेग की तरह ग्लोबल्स से बचें।

कोई भी कोड वैश्विक परिवर्तन कर सकता है। इसलिए यदि आपके पास एक चेन A (x) -> B (x) -> C (x) -> ... -> Z (x) है, और आप x को एक वैश्विक X में संग्रहीत करते हैं और अब आपके पास एक श्रृंखला A- है > B-> C -> ...-> Z, फिर उस लंबी श्रृंखला के हर एक कदम पर, या पूरी तरह से स्वतंत्र कोड में, कोई व्यक्ति X को बदल सकता है। और Z का उपयोग करने वाला मान उस A से पूरी तरह अलग हो सकता है। के साथ शुरू किया।

यह एक बुरा सपना है यदि आप कभी भी यह सुनिश्चित करना चाहते हैं कि आपका कोड वह करता है जो वह करना चाहता है, या यह वह करता है जो आप सोचते हैं कि वह करता है।


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