2008-10-06 21 views
36

जाहिर है, वहां से कई विचार हैं, "कभी नहीं! हमेशा encapsulate (भले ही यह केवल मैक्रो के साथ है!)" से "यह कोई बड़ा सौदा नहीं है - जब यह अधिक सुविधाजनक नहीं है तो उनका उपयोग करें "सी में वैश्विक चर का उपयोग करना ठीक है?

तो।

विशिष्ट, ठोस कारणों से (एक उदाहरण के साथ अधिमानतः)

  • क्यों वैश्विक चर खतरनाक हैं
  • जब वैश्विक चर विकल्प के स्थान पर इस्तेमाल किया जाना चाहिए
  • क्या विकल्प होते हैं कि के लिए मौजूद हैं वैश्विक चर का उपयोग करने के लिए प्रलोभन

हालांकि यह व्यक्तिपरक है, मैं एक answ er (कि मेरे लिए प्रत्येक डेवलपर को ग्लोबल्स के साथ प्यार/नफरत संबंध का सबसे अच्छा प्रतिनिधित्व करता है) और समुदाय उन्हें नीचे वोट देगा।

मेरा मानना ​​है कि नए लोगों के लिए इस तरह का संदर्भ होना महत्वपूर्ण है, लेकिन अगर कोई अन्य उत्तर मौजूद है तो यह अव्यवस्थित न हो कि यह आपके जैसा ही है - कोई टिप्पणी जोड़ें या किसी और के जवाब को संपादित करें।

-Adam

उत्तर

39

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

यह इस प्रकार स्पष्ट है कि वैश्विक चर का उपयोग करने से परहेज करना प्राथमिकता है यदि डिजाइन और कार्यान्वयन स्वाभाविक रूप से इसकी अनुमति देता है। इसके कारण मैं वैश्विक चर का उपयोग नहीं करना पसंद करता हूं जब तक कि उन्हें वास्तव में आवश्यकता नहीं होती है।

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

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

+0

इसके अलावा, उत्पादन कोड में, यह बहुत निराशाजनक बनाता है जब आपकी परियोजना को फिर से प्रवेश करने वाला और/या थ्रेड-सुरक्षित होना होता है। अगर किसी को सड़क के नीचे आपकी 20,000 लाइन प्रोजेक्ट विरासत में आता है, तो कल्पना करें कि वे पूरी चीज़ को उस बिंदु पर कितनी मजेदार कर देंगे जहां इसे स्क्रैच से फिर से लिखना अधिक कुशल होगा। – DevNull

7

सी में वैश्विक चर कोड अधिक पठनीय बनाने के लिए उपयोगी होते हैं, तो एक चर (बल्कि प्रत्येक विधि में चर गुजर से) एक से अधिक तरीकों के लिए आवश्यक है। हालांकि, वे खतरनाक हैं क्योंकि सभी स्थानों में उस चर को संशोधित करने की क्षमता है, जिससे बग को ट्रैक करना संभवतः मुश्किल हो जाता है। यदि आपको वैश्विक चर का उपयोग करना चाहिए, तो हमेशा यह सुनिश्चित करें कि इसे केवल एक विधि द्वारा संशोधित किया गया है और अन्य सभी कॉलर उस विधि का उपयोग करते हैं। यह उस चर में परिवर्तन से संबंधित मुद्दों को डीबग करना अधिक आसान बना देगा।

0

मैं यहां "कभी नहीं" शिविर में हूं; यदि आपको वैश्विक चर की आवश्यकता है, तो कम से कम singleton pattern का उपयोग करें। इस तरह, आप आलसी तत्कालता के लाभ प्राप्त करते हैं, और आप वैश्विक नामस्थान को अव्यवस्थित नहीं करते हैं।

+2

जबकि मैं असहमत नहीं हूं, ध्यान रखें कि यहां ध्यान केंद्रित सी है - कोई कक्षा नहीं है। क्या आप दिखा सकते हैं कि सी में सिंगलटन को कैसे कार्यान्वित किया जाए? ओओ प्रोग्रामिंग के प्रमुख लाभों में से एक सी से अधिक है इस तरह के डिजाइन पैटर्न ... –

+0

सिंगलेट्स वैश्विक चर का जवाब नहीं हैं, वे केवल प्रोग्रामर को आलसी होने के कारण घोषणा की शैली बदलने की अनुमति देते हैं (खराब तरीके से) आजीवन प्रबंधन। सिंगलटन वैश्विक चर से मुझे और अधिक समस्याएं पैदा करते हैं। – Torlack

+0

@ एडम डेविस: एक फ़ंक्शन जो एक उदाहरण देता है जो वैश्विक चर में फ़ाइल स्कोप के साथ संग्रहीत होता है? हालांकि मुझे यकीन नहीं है कि मुझे यह एक साधारण वैश्विक चर से बेहतर पसंद है। – aib

1

यह किसी अन्य उपकरण की तरह एक उपकरण है, लेकिन मुझे नहीं लगता कि वे बुरा हैं।

उदाहरण के लिए मेरे पास एक ऐसा प्रोग्राम है जो वास्तव में ऑनलाइन डेटाबेस की तरह कार्य करता है। डेटा स्मृति में संग्रहीत है लेकिन अन्य प्रोग्राम इसे कुशल बना सकते हैं। आंतरिक दिनचर्याएं हैं जो डेटाबेस में संग्रहित प्रक्रियाओं और ट्रिगर्स की तरह कार्य करती हैं।

इस कार्यक्रम में सैकड़ों वैश्विक चर हैं लेकिन यदि आप इसके बारे में सोचते हैं तो डेटाबेस क्या है लेकिन वैश्विक चर की एक बड़ी संख्या है।

यह प्रोग्राम लगभग दस वर्षों के लिए कई संस्करणों के माध्यम से उपयोग में है और यह कभी भी एक समस्या नहीं है और मैं इसे एक मिनट में फिर से करूँगा।

मैं स्वीकार करूंगा कि इस मामले में वैश्विक युद्ध ऐसे ऑब्जेक्ट हैं जिनके पास ऑब्जेक्ट के राज्य को बदलने के लिए उपयोग की जाने वाली विधियां हैं। तो डीबगिंग करते समय ऑब्जेक्ट को किसने बदल दिया है, यह ट्रैक करना एक समस्या नहीं है क्योंकि मैं हमेशा उस दिनचर्या पर ब्रेक पॉइंट सेट कर सकता हूं जो ऑब्जेक्ट की स्थिति को बदलता है। या यहां तक ​​कि सरल मैं बस लॉग इन लॉग इन चालू करता हूं जो परिवर्तनों को लॉग करता है।

2

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

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

4

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

+3

दिलचस्प। रक्षा उद्योग ने मुझे "कभी नहीं" शिविर में दृढ़ता से रखा। –

+1

मैंने एक एम्बेडेड सिस्टम पर काम किया जहां गतिशील स्मृति आवंटन उपलब्ध नहीं था। उस स्थिति में हमें लिंकर द्वारा रैम-स्पेस (छवि डेटा के लिए) में आवंटित 'ग्लोबल' चर की आवश्यकता थी और कई धागे के बीच पहुंच को नियंत्रित करना था। यह विचार का एक अलग विद्यालय है, लेकिन यह काम कर सकता है। –

1

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

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

1

जब आप स्थिरांक घोषित करते हैं।

5

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

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

10

इस कोन पर विचार करें: "यदि दायरा पर्याप्त संकीर्ण है, तो सब कुछ वैश्विक है"।

इस उम्र में एक बार की नौकरी करने के लिए अभी भी बहुत तेज़ उपयोगिता कार्यक्रम लिखने की आवश्यकता है।

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

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

वास्तव में, मैं साहसपूर्वक दावा कर सकता हूं कि यदि कार्यक्रम छोटा नहीं है, तो वैश्विक चर अवैध होना चाहिए।

  • यदि चर कभी नहीं बदलेगा, तो यह एक स्थिर, एक चर नहीं है।
  • यदि चर के लिए सार्वभौमिक पहुंच की आवश्यकता होती है, तो दो subroutines इसे प्राप्त करने और सेट करने के लिए मौजूद होना चाहिए, और उन्हें सिंक्रनाइज़ किया जाना चाहिए।
  • यदि प्रोग्राम छोटा शुरू होता है, और बाद में बड़ा हो सकता है, तो कोड जैसे आज कार्यक्रम बड़ा है, और वैश्विक चर को समाप्त कर दें। सभी कार्यक्रम नहीं बढ़ेंगे! (हालांकि, मान लीजिए कि प्रोग्रामर कभी-कभी कोड को फेंकने को तैयार होता है।)
15

वैश्विक वैरिएबल काम करने का एकमात्र तरीका उन नामों को देना है जो उन्हें आश्वस्त करते हैं कि वे अद्वितीय हैं।

उस नाम में आमतौर पर कुछ "मॉड्यूल" या कार्यों के संग्रह से जुड़े उपसर्ग होते हैं जिसके लिए वैश्विक चर विशेष रूप से केंद्रित या सार्थक होता है।

इसका मतलब है कि चर उन कार्यों के "संबंधित" हैं - यह उनका हिस्सा है। दरअसल, वैश्विक रूप से अन्य कार्यों के साथ-साथ एक छोटे से फ़ंक्शन के साथ "लपेटा" जा सकता है - उसी .h फ़ाइल में समान नाम उपसर्ग।

बोनस।

जब आप ऐसा करते हैं, अचानक, यह वास्तव में वैश्विक नहीं है। यह अब संबंधित कार्यों के कुछ मॉड्यूल का हिस्सा है।

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

"ग्लोबल वैरिएबल का कभी भी उपयोग न करें" कहने के बजाय, आप कह सकते हैं "ग्लोबल वैरिएबल की जिम्मेदारियों को कुछ मॉड्यूल में असाइन करें जहां यह सबसे ज्यादा समझ में आता है।"

+0

+1 - ब्रावो। इससे पहले कि हम जानते थे कि वैश्विक चर इतनी "बुराई" हैं, इससे पहले कि वे पुराने दिनों में लोगों ने किया था। चौंकाने वाला, उन पुराने कार्यक्रमों ने अभी भी काम किया और अक्सर अभी भी बनाए रखा जा सकता था। :) – Torlack

0

वैश्विक स्थिरांक उपयोगी हैं - आपको प्री-प्रोसेसर मैक्रोज़ की तुलना में अधिक प्रकार की सुरक्षा मिलती है और यदि आप तय करते हैं कि यह अभी भी मूल्य को बदलने में आसान है।

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

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

3

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

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

वैश्विक किफ़ायत से चर का प्रयोग करें। ग्लोबल नेमस्पेस के उपयोग को व्यवस्थित करने और अलग करने के लिए जब भी संभव हो, डेटा संरचनाओं का उपयोग किया जाना चाहिए।

चर गुंजाइश प्रोग्रामर avails बहुत उपयोगी संरक्षण - लेकिन यह एक लागत कर सकते हैं। मैं आज रात वैश्विक चर के बारे में लिखने आया क्योंकि मैं एक अनुभवी उद्देश्य-सी प्रोग्रामर हूं जो अक्सर डेटा एक्सेस पर ऑब्जेक्ट-ओरिएंटेशन स्थानों को बाधित करता है। मैं तर्क है कि विरोधी वैश्विक कट्टरता आता है ज्यादातर से छोटी है, सिद्धांत-डूबी प्रोग्रामर प्रणाली के स्तर एपीआई की एक गहरी, व्यावहारिक अनुभव और अनुप्रयोग विकास में उनकी बातचीत के बिना अलगाव में वस्तु उन्मुख API के साथ मुख्य रूप से अनुभव किया। लेकिन मुझे यह मानना ​​है कि विक्रेता निराशाजनक रूप से नामस्थान का उपयोग करते समय निराश हो जाते हैं। कई लिनक्स डिस्ट्रोस में "पीआई" और "TWOPI" वैश्विक स्तर पर पूर्वनिर्धारित थे, उदाहरण के लिए, जिसने मेरे अधिकांश व्यक्तिगत कोड को तोड़ दिया।

1

मैं कई कारणों के बारे में सोच सकते हैं:

डिबगिंग/परीक्षण प्रयोजनों (चेतावनी - इस कोड का परीक्षण किया है नहीं):

#include <stdio.h> 
#define MAX_INPUT 46 
int runs=0; 
int fib1(int n){ 
    ++runs; 
    return n>2?fib1(n-1)+fib1(n-2):1; 
}; 
int fib2(int n,int *cache,int *len){ 
    ++runs; 
    if(n<=2){ 
     if(*len==2) 
      return 1; 
     *len=2; 
     return cache[0]=cache[1]=1; 
    }else if(*len>=n) 
     return cache[n-1]; 
    else{ 
     if(*len!=n-1) 
      fib2(n-1,cache,len); 
     *len=n; 
     return cache[n-1]=cache[n-2]+cache[n-3]; 
    }; 
}; 
int main(){ 
    int n; 
    int cache[MAX_INPUT]; 
    int len=0; 
    scanf("%i",&n); 
    if(!n||n>MAX_INPUT) 
     return 0; 
    printf("fib1(%i)==%i",n,fib1(n)); 
    printf(", %i run(s)\n",runs); 
    runs=0; 
    printf("fib2(%i)==%i",n,fib2(n,&cache,&len)); 
    printf(", %i run(s)\n",runs); 
    main(); 
}; 

मैं fib2 के लिए दायरे वाले चर का इस्तेमाल किया है, लेकिन यह एक और परिदृश्य में जहाँ है ग्लोबल्स उपयोगी हो सकते हैं (शुद्ध गणितीय फ़ंक्शन जिन्हें हमेशा के लिए लेने से बचने के लिए डेटा स्टोर करने की आवश्यकता होती है)।

कार्यक्रमों केवल एक बार (उदाहरण के लिए एक प्रतियोगिता के लिए) का उपयोग किया है, या जब विकास समय छोटा करने की जरूरत है

वैश्विक टाइप किया स्थिरांक है, जहां एक समारोह कहीं पूर्णांक के बजाय की आवश्यकता है * पूर्णांक के रूप में उपयोगी होते हैं।

मैं आम तौर पर वैश्विक बचने अगर मैं एक दिन से अधिक के लिए कार्यक्रम का उपयोग करना चाहते।

1
  • जब नहीं उपयोग करने के लिए: वैश्विक चर खतरनाक है क्योंकि एक ही रास्ता कभी पता है कि कैसे वैश्विक चर बदल ग फ़ाइल के भीतर जो वे घोषणा की जाती है के भीतर संपूर्ण स्रोत कोड का पता लगाने के लिए है (या, सभी कर रहे हैं .c फाइलें अगर यह बाहरी भी है)। यदि आपका कोड छोटी गाड़ी चला जाता है, तो आपको यह देखने के लिए कि कौन से फ़ंक्शंस इसे बदलते हैं, और कब, आपको अपनी संपूर्ण स्रोत फ़ाइल खोजनी होगी। यह गलत होने पर डीबग करने का एक दुःस्वप्न है। हम अक्सर स्थानीय चर शान से दायरे से बाहर जाने की अवधारणा के पीछे सरलता प्रदान करने के लिए ले - यह
  • पता लगाने के लिए आसान है जब उपयोग करने के लिए: वैश्विक चर जब उसके उपयोग जरूरत से ज्यादा नकाबपोश नहीं है इस्तेमाल किया जाना चाहिए और जहां लागत स्थानीय चर का उपयोग करने के लिए उस बिंदु पर अत्यधिक जटिल है जहां यह पठनीयता से समझौता करता है।इसके द्वारा, मेरा मतलब है कि अन्य चीजों के साथ कार्य तर्कों और रिटर्न और पास पॉइंटर्स को अतिरिक्त पैरामीटर जोड़ने की आवश्यकता है। तीन क्लासिक उदाहरण: जब मैं पॉप और पुश स्टैक का उपयोग करता हूं - यह फ़ंक्शंस के बीच साझा किया जाता है। बेशक मैं स्थानीय चर का उपयोग कर सकता हूं लेकिन फिर मुझे अतिरिक्त पैरामीटर के रूप में पॉइंटर्स पास करना होगा। दूसरा क्लासिक उदाहरण कश्मीर & में पाया जा सकता आर के "सी प्रोग्रामिंग भाषा", जहां वे एक getch() और ungetch परिभाषित() कार्य करता है जो हिस्सा एक वैश्विक चरित्र बफर सरणी। एक बार फिर, हमें इसे वैश्विक बनाने की आवश्यकता नहीं है, लेकिन क्या यह अतिरिक्त जटिलता है जब बफर के उपयोग को गड़बड़ करना मुश्किल हो जाता है? तीसरा उदाहरण ऐसा कुछ है जो आपको आर्डिनो शौकियों के बीच एम्बेडेड स्पेस में मिलेगा। मुख्य लूप फ़ंक्शन के सभी कार्यों में से सभी मिलिस() फ़ंक्शन साझा करते हैं जो फ़ंक्शन लागू होने का तत्काल समय होता है। क्योंकि घड़ी की गति अनंत नहीं है, मिलिस()एक ही लूप के भीतर भिन्न होगा। इसे स्थिर बनाने के लिए, प्रत्येक लूप में पूर्व का एक स्नैपशॉट लें और इसे वैश्विक चर में सहेजें। समय स्नैपशॉट अब उतना ही होगा जितना कि कई कार्यों द्वारा एक्सेस किया जाता है।
  • विकल्प: ज्यादा नहीं। जितना संभव हो सके स्थानीय स्कोपिंग पर चिपके रहें, खासकर परियोजना की शुरुआत में, इसके विपरीत। जैसे-जैसे प्रोजेक्ट बढ़ता है और यदि आपको लगता है कि वैश्विक चर का उपयोग करके जटिलता को कम किया जा सकता है, तो ऐसा करें, लेकिन केवल तभी जब यह बिंदु दो की आवश्यकताओं को पूरा करता है। और याद रखें, स्थानीय क्षेत्र का उपयोग करके और अधिक जटिल कोड होने से वैश्विक चर का उपयोग करके गैर जिम्मेदार रूप से तुलना में कम बुराई होती है।
संबंधित मुद्दे