क्या वे दुष्ट हैं? शायद। ग्लोबल्स के साथ समस्या यह है कि उन्हें किसी भी फ़ंक्शन या कोड द्वारा निष्पादित किए जा रहे किसी भी कोड द्वारा समय पर किसी भी समय एक्सेस और संशोधित किया जा सकता है। इससे ऐसी स्थितियां उत्पन्न हो सकती हैं, जो मान लें, वापस ट्रेस करना और समझाना मुश्किल है। ग्लोबल्स की मात्रा को कम करना, यदि संभव हो तो राशि को शून्य पर लाना, इसलिए वांछनीय है।
क्या उन्हें टाला जा सकता है? लगभग हमेशा हाँ। Arduino के साथ समस्या यह है कि वे आपको इस दो फ़ंक्शन दृष्टिकोण में मजबूर करते हैं जिसमें वे आपको setup()
और आपको मानते हैं loop()
। इस विशेष मामले में आपके पास इन दो फ़ंक्शन (शायद main()
) के कॉलर फ़ंक्शन के दायरे तक कोई पहुंच नहीं है । यदि आपके पास होता, तो आप अपने आप को सभी ग्लोबल्स से छुटकारा पाने में सक्षम होते और इसके बजाय स्थानीय लोगों का उपयोग करते।
निम्नलिखित चित्र:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
यह संभवतया कमोबेश अरुदिनो कार्यक्रम का मुख्य कार्य है। वेरीएबल्स setup()
और loop()
फ़ंक्शन दोनों की आपको आवश्यकता होती है और फिर main()
वैश्विक दायरे के बजाय फ़ंक्शन के दायरे में अधिमानतः घोषित किए जाएंगे । फिर उन्हें तर्क के रूप में पारित करने के माध्यम से दो अन्य कार्यों के लिए सुलभ बनाया जा सकता है (यदि आवश्यक हो तो संकेत का उपयोग करके)।
उदाहरण के लिए:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
ध्यान दें कि इस मामले में आपको दोनों कार्यों के हस्ताक्षर को भी बदलना होगा।
जैसा कि यह संभव नहीं है और न ही वांछनीय है, मैं प्रोग्राम संरचना पर मजबूर को संशोधित किए बिना एक Arduino कार्यक्रम से अधिकांश ग्लोबल्स को हटाने के लिए वास्तव में केवल एक ही रास्ता देखता हूं।
यदि मैं सही ढंग से याद करता हूं, तो आप पूरी तरह से C ++ का उपयोग करने में सक्षम हैं, जबकि Arduino के लिए प्रोग्रामिंग करते हैं, बजाय C. यदि आप परिचित नहीं हैं (अभी तक) OOP (ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग) या C ++ के साथ, तो यह कुछ करने की आदत हो सकती है और कुछ पढ़ने।
मेरा प्रस्ताव एक कार्यक्रम वर्ग बनाने और इस वर्ग का एक वैश्विक उदाहरण बनाने का होगा। एक वर्ग को वस्तुओं का खाका माना जाना चाहिए।
निम्नलिखित उदाहरण कार्यक्रम पर विचार करें:
class Program {
public:
Program();
void setup();
void loop();
private:
int myFirstSampleVariable;
int mySecondSampleVariable;
};
Program::Program() :
myFirstSampleVariable(0),
mySecondSampleVariable(0)
{
}
void Program::setup() {
// your setup code goes here
}
void Program::loop() {
// your loop code goes here
}
Program program; // your single global
void setup() {
program.setup();
}
void loop() {
program.loop();
}
Voilà, हमने खुद को लगभग सभी ग्लोबल्स से मुक्त कर लिया है। जिन कार्यों में आप अपने एप्लिकेशन तर्क जोड़ना शुरू करेंगे, वे कार्य Program::setup()
और Program::loop()
कार्य होंगे। इन कार्यों की पहुंच विशिष्ट सदस्य चर तक होती है myFirstSampleVariable
और mySecondSampleVariable
जबकि पारंपरिक setup()
और loop()
कार्यों तक पहुंच नहीं होती है क्योंकि इन चर को निजी श्रेणी के रूप में चिह्नित किया गया है। इस अवधारणा को डेटा एनकैप्सुलेशन या डेटा छिपाना कहा जाता है ।
आपको OOP और / या C ++ पढ़ाना इस प्रश्न के उत्तर के दायरे से बाहर है इसलिए मैं यहाँ रुकूँगा।
संक्षेप में: ग्लोबल्स से बचा जाना चाहिए और ग्लोबल्स की मात्रा को कम करने के लिए लगभग हमेशा संभव है। इसके अलावा जब आप Arduino के लिए प्रोग्रामिंग कर रहे हैं।
सबसे महत्वपूर्ण बात मुझे आशा है कि मेरा उत्तर आपके लिए कुछ उपयोगी है :)