Arduino में वैश्विक चर बुराई हैं?


24

मैं प्रोग्रामिंग में अपेक्षाकृत नया हूं और कई कोडिंग सर्वोत्तम प्रथाओं में से मैं प्रभावी रूप से पढ़ रहा हूं कि एक वैश्विक चर का उपयोग करने के लिए बहुत कम अच्छे कारण हैं (या सबसे अच्छा कोड में कोई ग्लोबल्स नहीं है)।

मैंने इसे ध्यान में रखने की पूरी कोशिश की है, जब एक एसडी कार्ड के साथ एक Arduino इंटरफ़ेस बनाने के लिए सॉफ्टवेयर लिखते हैं, एक कंप्यूटर से बात करते हैं और एक मोटर नियंत्रक चलाते हैं।

वर्तमान में मेरे पास "शुरुआती स्तर," कोड (लगभग एक कार्रवाई से अधिक कोई भी रेखा नहीं) की लगभग 1100 लाइनों के लिए 46 ग्लोबल्स हैं। क्या यह एक अच्छा अनुपात है या मुझे इसे कम करने पर ध्यान देना चाहिए? इसके अलावा, मैं ग्लोबल्स की संख्या को कम करने के लिए किन प्रथाओं को नियोजित कर सकता हूं?

मैं यहाँ यह पूछ रहा हूँ क्योंकि मैं विशेष रूप से सामान्य रूप से कंप्यूटर प्रोग्रामिंग के बजाय Arduino उत्पादों पर कोडिंग के लिए सर्वोत्तम प्रथाओं से संबंधित हूं।


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

16
@ LookAlterno Err, क्या आप अर्दुनियो में कक्षाएं नहीं लिख सकते हैं, क्योंकि यह अजीब मैक्रोज़ और पुस्तकालयों के साथ सिर्फ C ++ है? यदि हां, तो प्रत्येक चर वैश्विक नहीं है। और यहां तक ​​कि सी में, आमतौर पर वैश्विक चर होने के बजाय कार्यों में गुजरने वाले चर (शायद अंदर के ढांचे) को प्राथमिकता देना सबसे अच्छा अभ्यास माना जाता है। एक छोटे से कार्यक्रम के लिए कम सुविधाजनक हो सकता है लेकिन यह आमतौर पर भुगतान करता है क्योंकि कार्यक्रम बड़ा और अधिक जटिल हो जाता है।
मुजेर

11
@ LookAlterno: "मैं बचता हूं" और "आप नहीं कर सकते" बहुत अलग चीजें हैं।
मोनिका

2
वास्तव में, कुछ एम्बेडेड प्रोग्रामर स्थानीय चर पर प्रतिबंध लगाते हैं और इसके बजाय वैश्विक चर (या फंसे हुए स्थिर चर) की आवश्यकता होती है। जब कार्यक्रम छोटे होते हैं, तो इसे सरल राज्य मशीन के रूप में विश्लेषण करना आसान बना सकता है; क्योंकि चर कभी एक-दूसरे को अधिलेखित नहीं करते हैं (अर्थात: जैसा कि वे स्टैक करते हैं और आवंटित चर को ढेर करते हैं)।
रोब

1
स्थिर और वैश्विक चर संकलन समय पर स्मृति की खपत को जानने का लाभ देते हैं। Arduino के साथ बहुत सीमित मेमोरी उपलब्ध होने के कारण यह एक फायदा हो सकता है। उपलब्ध स्मृति को समाप्त करने और अप्राप्य विफलताओं का अनुभव करने के लिए एक नौसिखिया के लिए यह काफी आसान है।
एंटीपाटन्ट

जवाबों:


33

वे प्रति से बुराई नहीं कर रहे हैं , लेकिन वे जहां उपयोग करने के लिए कोई अच्छा कारण नहीं है वहाँ अति उपयोग करने के लिए करते हैं।

जब वैश्विक चर लाभप्रद होते हैं तो बहुत बार होते हैं। खासकर जब से एक Arduino प्रोग्रामिंग है, हुड के तहत, एक पीसी प्रोग्रामिंग करने के लिए काफी हद तक अलग है।

वैश्विक चरों में सबसे बड़ा लाभ स्थैतिक आवंटन है। विशेष रूप से बड़े और जटिल चर जैसे कि कक्षा के उदाहरण। newसंसाधनों की कमी के कारण डायनेमिक एलोकेशन ( आदि का उपयोग ) को छोड़ दिया जाता है।

इसके अलावा आपको एक भी कॉल ट्री नहीं मिलता है, जैसे आप एक सामान्य सी प्रोग्राम में करते हैं (सिंगल main()फंक्शन अन्य फ़ंक्शन को कॉल करते हैं) - इसके बजाय आपको प्रभावी रूप से दो अलग-अलग पेड़ मिलते हैं ( setup()कॉलिंग फ़ंक्शंस, फिर loop()कॉलिंग फ़ंक्शंस), जिसका मतलब है कि कभी-कभी वैश्विक चर होते हैं अपने लक्ष्य को प्राप्त करने का एकमात्र तरीका (यानी, यदि आप इसे दोनों में उपयोग करना चाहते हैं setup()और loop())।

तो नहीं, वे बुराई नहीं कर रहे हैं, और एक Arduino पर उनके पास पीसी की तुलना में अधिक और बेहतर उपयोग हैं।


ठीक है, क्या होगा अगर यह कुछ मैं केवल loop()(या कई कार्यों में कहा जाता है loop()) का उपयोग कर रहा हूं ? शुरुआत में उन्हें परिभाषित करने की तुलना में उन्हें अलग तरीके से स्थापित करना बेहतर होगा?
ATE-ENGE

1
उस स्थिति में मैं शायद उन्हें लूप में परिभाषित करूंगा () (हो सकता है जैसे staticकि मुझे पुनरावृत्तियों में उनके मूल्य को बनाए रखने के लिए उनकी आवश्यकता थी) और कॉल श्रृंखला के नीचे फ़ंक्शन मापदंडों के माध्यम से उन्हें पास करें।
Majenko

2
: यह एक तरीका है, या एक संदर्भ के रूप में इसे पारित void foo(int &var) { var = 4; }और foo(n);- nअब 4. है
Majenko

1
कक्षाओं को स्टैक-आबंटित किया जा सकता है। बेशक, स्टैक पर बड़े उदाहरणों को रखना अच्छा नहीं है, लेकिन फिर भी।
JAB

1
@JAB कुछ भी आवंटित किया जा सकता है।
Majenko

18

आपका वास्तविक कोड देखे बिना निश्चित उत्तर देना बहुत मुश्किल है।

वैश्विक चर बुरे नहीं हैं, और वे अक्सर एक अंतर्निहित वातावरण में समझ में आते हैं जहां आप आमतौर पर बहुत सारे हार्डवेयर का उपयोग करते हैं। आपके पास केवल चार यूएआरटीएस, केवल एक I2C पोर्ट आदि हैं, इसलिए यह विशिष्ट हार्डवेयर संसाधनों से बंधे चर के लिए ग्लोबल्स का उपयोग करने के लिए समझ में आता है। और वास्तव में, Arduino कोर पुस्तकालय है कि: Serial, Serial1, आदि वैश्विक चर रहे हैं। इसके अलावा, एक वैरिएबल प्रोग्राम की वैश्विक स्थिति का प्रतिनिधित्व करता है, जो आमतौर पर एक ग्लोबल होता है।

मेरे पास वर्तमान में [कोड] की लगभग 1100 लाइनों के लिए 46 ग्लोबल्स हैं। क्या यह एक अच्छा अनुपात है [...]

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

फिर भी, 46 वैश्विक मुझे थोड़ा ऊँचा लगता है। यदि इनमें से कुछ निरंतर मान रखते हैं, तो उन्हें इस रूप में अर्हता प्राप्त करें const: संकलक आमतौर पर उनके भंडारण का अनुकूलन करेगा। यदि उनमें से कोई भी चर केवल एक फ़ंक्शन के अंदर उपयोग किया जाता है, तो इसे स्थानीय बनाएं। यदि आप चाहते हैं कि फ़ंक्शन के लिए कॉल के बीच इसका मान बना रहे, तो इसे अर्हता प्राप्त करें static। आप एक वर्ग के अंदर एक साथ चर का समूह बनाकर "दृश्यमान" ग्लोबल्स की संख्या को कम कर सकते हैं, और इस वर्ग का एक वैश्विक उदाहरण हो सकता है। लेकिन ऐसा तभी करें जब सामान को एक साथ रखने का मतलब हो। GlobalStuffकेवल एक वैश्विक चर रखने के लिए एक बड़ा वर्ग बनाने से आपके कोड को स्पष्ट करने में मदद नहीं मिलेगी।


1
ठीक है! मुझे इस बारे में नहीं पता था कि staticक्या मेरे पास एक वैरिएबल है जो केवल एक फ़ंक्शन में उपयोग किया जाता है लेकिन हर बार एक नया मान प्राप्त होता है जिसे फ़ंक्शन कहा जाता है (जैसे var=millis()) क्या मुझे वह बनाना चाहिए static?
ATE-ENGE

3
नहीं static, केवल तब के लिए है जब आपको मूल्य रखने की आवश्यकता होती है। यदि आप फ़ंक्शन में पहली चीज़ करते हैं, तो वर्तमान समय में चर का मान सेट किया जाता है, पुराने मूल्य को रखने की कोई आवश्यकता नहीं है। उस स्थिति में जो कुछ स्थिर करता है वह स्मृति को बर्बाद कर रहा है।
एंड्रयू

यह एक बहुत ही अच्छा जवाब है, दोनों बिंदुओं के बारे में और ग्लोबल्स के बारे में संदेह व्यक्त करते हैं। +1
अंडरस्कोर_ड

6

वैश्विक चर के साथ मुख्य मुद्दा कोड रखरखाव है। कोड की एक पंक्ति को पढ़ते समय, चरों की घोषणा को पैरामीटर के रूप में पारित करना या स्थानीय रूप से घोषित करना आसान है। वैश्विक चर (अक्सर इसकी आवश्यकता होती है और आईडीई) की घोषणा को खोजना इतना आसान नहीं है।

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

C में नाम स्थान की नकल करने का एक खराब तरीका है:

static struct {
    int motor1, motor2;
    bool sensor;
} arm;

इंटेल या आर्म प्रोसेसर पर, वैश्विक चर की पहुंच अन्य चर की तुलना में धीमी है। यह शायद आर्डिनो पर विपरीत है।


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

1
समस्या वास्तव में घोषणा नहीं ढूंढ रही है; कोड को जल्दी से समझने में सक्षम होना महत्वपूर्ण है लेकिन अंततः यह क्या करता है - और वहाँ वास्तविक समस्या यह है कि कौन सा संस्करण आपके कोड के अज्ञात भाग में एक वस्तु के साथ अजीब चीजों को करने के लिए वैश्विक घोषणा का उपयोग करने में सक्षम है। सभी के लिए खुले में जो कुछ भी वे चाहते हैं।
अंडरस्कोर_ड

5

हालांकि मैं पीसी के लिए प्रोग्रामिंग करते समय उनका उपयोग नहीं करूंगा, लेकिन Arduino के लिए उनके पास कुछ लाभ हैं। सबसे अगर यह पहले ही कहा जा चुका है:

  • कोई डायनामिक मेमोरी उपयोग (Arduino के सीमित हीप स्पेस में अंतराल बनाना)
  • हर जगह उपलब्ध है, इस प्रकार उन्हें तर्क के रूप में पारित करने की आवश्यकता नहीं है (जो स्टैक स्पेस की लागत है)

इसके अलावा, कुछ मामलों में, विशेष रूप से प्रदर्शन-वार यह वैश्विक चर का उपयोग करने के लिए अच्छा हो सकता है, जब आवश्यक तत्व बनाने के बजाय:

  • हीप स्पेस में अंतराल को कम करने के लिए
  • डायनामिक रूप से आवंटन और / या मेमोरी को खाली करने में पर्याप्त समय लग सकता है
  • चर को 'पुन: उपयोग' किया जा सकता है, जैसे कि एक वैश्विक सूची के तत्वों की एक सूची जो कई कारणों से उपयोग की जाती है, जैसे कि एक बार एसडी के लिए एक बफर के रूप में, और बाद में एक अस्थायी स्ट्रिंग बफर के रूप में।

5

सब कुछ के साथ (गोटो के अलावा जो वास्तव में बुराई हैं) ग्लोबल्स का अपना स्थान है।

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

जैसा कि दूसरों ने कहा है कि 46 केवल 1000 से अधिक लाइनों के कोड के लिए बहुत कुछ लगता है, लेकिन आप जो कर रहे हैं, उसके विवरण को जाने बिना यह कहना मुश्किल है कि आप उनका उपयोग कर रहे हैं या नहीं।

हालांकि हर वैश्विक के लिए अपने आप से कुछ महत्वपूर्ण प्रश्न पूछें:

क्या नाम स्पष्ट और विशिष्ट है ताकि मैं गलती से कहीं और उसी नाम का उपयोग करने की कोशिश न करूं? अगर नाम नहीं बदला।

क्या इसे कभी बदलने की जरूरत है? यदि नहीं, तो इसे एक कास्ट बनाने पर विचार करें।

क्या यह हर जगह दिखाई देने की आवश्यकता है या क्या यह केवल वैश्विक है ताकि फ़ंक्शन कॉल के बीच मूल्य बनाए रखा जाए? इसलिए इसे फ़ंक्शन के लिए स्थानीय बनाने और कीवर्ड स्थिर का उपयोग करने पर विचार करें।

अगर मैं सावधान नहीं हो रहा हूं तो क्या चीजें वास्तव में बुरी तरह से खराब हो जाएंगी क्योंकि यह कोड के एक टुकड़े से बदल जाता है? उदाहरण के लिए, यदि आपके पास दो संबंधित चर हैं, तो नाम और आईडी संख्या कहें, जो कि वैश्विक हैं (वैश्विक उपयोग करने पर पिछला नोट देखें जब आपको लगभग हर जगह कुछ जानकारी की आवश्यकता होती है), तो यदि उनमें से एक दूसरे के बिना बदली हुई चीजें हो सकती हैं। हाँ आप बस सावधान हो सकते हैं लेकिन कभी-कभी सावधानी को थोड़ा लागू करना अच्छा होता है। उदाहरण के लिए, उन्हें एक .c फ़ाइल में रखें और फिर उन फ़ंक्शन को परिभाषित करें जो एक ही समय में दोनों को सेट करते हैं और आपको उन्हें पढ़ने की अनुमति देते हैं। फिर आप केवल संबंधित हेडर फ़ाइल में फ़ंक्शंस शामिल करते हैं, इस तरह आपके बाकी कोड केवल परिभाषित फ़ंक्शंस के माध्यम से चर तक पहुंच सकते हैं और इसलिए चीजों को गड़बड़ नहीं कर सकते।

- अद्यतन - मुझे बस एहसास हुआ कि आपने सामान्य कोडिंग के बजाय अरुडिनो विशिष्ट सर्वोत्तम अभ्यास के बारे में पूछा था और यह सामान्य कोडिंग उत्तर से अधिक है। लेकिन ईमानदारी से बहुत अंतर नहीं है, अच्छा अभ्यास अच्छा अभ्यास है। startup()और loop()Arduino साधन की संरचना आप उपयोग करने के लिए है कि कुछ स्थितियों में अन्य प्लेटफार्मों की तुलना में अधिक एक छोटे से वैश्विक लेकिन वह वास्तव में बहुत परिवर्तन नहीं होता है, तो आप हमेशा कोई बात नहीं सबसे अच्छा आप मंच की सीमाओं के भीतर कर सकते हैं के लिए लक्ष्य अंत क्या मंच है


मैं Arduinos के बारे में कुछ नहीं जानता, लेकिन बहुत सारे डेस्कटॉप और सर्वर डेवलपमेंट करता हूं। gotoS के लिए एक स्वीकार्य उपयोग (IMHO) है और यह नेस्टेड छोरों से बाहर निकलने के लिए है, यह विकल्पों की तुलना में बहुत क्लीनर और आसान है।
हठ

अगर आपको लगता है कि gotoबुराई कर रहे हैं, तो लिनक्स कोड देखें। तर्क है, वे बस के रूप में try...catchइस्तेमाल किया जब ब्लॉक के रूप में बुराई के रूप में कर रहे हैं ।
दिमित्री ग्रिगोरीव

5

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

क्या उन्हें टाला जा सकता है? लगभग हमेशा हाँ। 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 के लिए प्रोग्रामिंग कर रहे हैं।

सबसे महत्वपूर्ण बात मुझे आशा है कि मेरा उत्तर आपके लिए कुछ उपयोगी है :)


आप चाहें तो स्केच में अपने खुद के मुख्य () को परिभाषित कर सकते हैं। यह वही है जो स्टॉक एक जैसा दिखता है: github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/…
per1234

एक सिंगलटन प्रभावी रूप से एक वैश्विक है, बस एक अतिरिक्त भ्रामक तरीके से तैयार है। इसमें एक ही डाउनसाइड होता है।
14

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

@ per1234 धन्यवाद! मैं निश्चित रूप से कोई Arduino विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि मेरा पहला सुझाव तब भी काम कर सकता था।
अर्जेन

2
खैर, यह अभी भी वैश्विक स्थिति है जिसे प्रोग्राम में कहीं भी एक्सेस किया जा सकता है, आप इसे Program::instance().setup()इसके बजाय इसके माध्यम से एक्सेस कर सकते हैं globalProgram.setup()। संबंधित वैश्विक चर को एक वर्ग / संरचना / नाम स्थान में रखना फायदेमंद हो सकता है, खासकर यदि उन्हें केवल संबंधित कार्यों के एक जोड़े की आवश्यकता होती है, लेकिन सिंगलटन पैटर्न कुछ भी नहीं जोड़ता है। दूसरे शब्दों static Program p;में, वैश्विक भंडारण है और static Program& instance()वैश्विक पहुंच है, जो बस के समान है Program globalProgram;
patstew

4

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

एक वैश्विक चर क्या है, एक अंतर्निहित धारणा है कि केवल एक चीज है (यह कोई फर्क नहीं पड़ता कि हम एक वैश्विक सरणी या मानचित्र के बारे में बात कर रहे हैं जिसमें कई चीजें शामिल हो सकती हैं, लेकिन अभी भी यह धारणा है कि केवल है ऐसी एक सूची या मानचित्रण, और कई स्वतंत्र नहीं)।

तो इससे पहले कि आप एक वैश्विक का उपयोग करें, आप अपने आप से पूछना चाहते हैं: क्या यह कल्पना योग्य है कि मैं कभी भी इस चीज का एक से अधिक उपयोग करना चाहूंगा? यदि यह रेखा के नीचे सच हो जाता है, तो आपको उस चीज़ को अन-ग्लोबलाइज़ करने के लिए कोड को संशोधित करना होगा, और आपको संभवतः इस तरह से पता चलेगा कि आपके कोड के अन्य भाग विशिष्टता की धारणा पर निर्भर हैं, इसलिए आप 'उन्हें भी ठीक करना होगा, और प्रक्रिया थकाऊ और त्रुटिपूर्ण हो जाती है। "ग्लोबल्स का उपयोग न करें" को पढ़ाया जाता है क्योंकि आमतौर पर शुरुआत से ग्लोबल्स से बचने के लिए यह एक बहुत छोटी लागत है, और यह बाद में एक बड़ी लागत का भुगतान करने की क्षमता से बचा जाता है।

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

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

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


0

क्या Arduino में ग्लोबल वैरिएबल ईविल हैं?

वैश्विक चर सहित कुछ भी स्वाभाविक नहीं है। मैं इसे "आवश्यक बुराई" के रूप में चित्रित करूंगा - यह आपके जीवन को बहुत आसान बना सकता है लेकिन इसे सावधानी के साथ संपर्क किया जाना चाहिए।

इसके अलावा, मैं ग्लोबल्स की संख्या को कम करने के लिए किन प्रथाओं को नियोजित कर सकता हूं?

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


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