C / C ++ में, क्या वैश्विक वैरिएबल उतने ही बुरे हैं जितना कि मेरे प्रोफेसर सोचते हैं कि वे हैं?
C / C ++ में, क्या वैश्विक वैरिएबल उतने ही बुरे हैं जितना कि मेरे प्रोफेसर सोचते हैं कि वे हैं?
जवाबों:
वैश्विक चरों के साथ समस्या यह है कि चूंकि हर फ़ंक्शन इन तक पहुंचता है, इसलिए यह पता लगाना कठिन हो जाता है कि वास्तव में कौन से फ़ंक्शन इन चरों को पढ़ते और लिखते हैं।
यह समझने के लिए कि आवेदन कैसे काम करता है, आपको वैश्विक समारोह को संशोधित करने वाले प्रत्येक कार्य को ध्यान में रखना होगा। यह किया जा सकता है, लेकिन जैसे-जैसे आवेदन बढ़ता है, यह लगभग असंभव होने के बिंदु तक कठिन हो जाएगा (या कम से कम समय की पूरी बर्बादी)।
यदि आप वैश्विक चर पर भरोसा नहीं करते हैं, तो आप आवश्यकतानुसार विभिन्न कार्यों के बीच राज्य को पारित कर सकते हैं। इस तरह से आप यह समझने का एक बेहतर मौका देते हैं कि प्रत्येक फ़ंक्शन क्या करता है, क्योंकि आपको वैश्विक स्थिति को ध्यान में रखने की आवश्यकता नहीं है।
समग्र लक्ष्य को याद रखना महत्वपूर्ण है: स्पष्टता
"कोई वैश्विक चर" नियम नहीं है क्योंकि ज्यादातर समय, वैश्विक चर कोड के अर्थ को कम स्पष्ट करते हैं।
हालांकि, कई नियमों की तरह, लोग नियम को याद रखते हैं, न कि उस नियम को करने के लिए जिसका उद्देश्य था।
मैंने ऐसे कार्यक्रम देखे हैं जो वैश्विक चरों की बुराई से बचने के लिए बड़ी संख्या में मापदंडों को पार करके कोड के आकार को दोगुना कर देते हैं। अंत में, ग्लोबल्स का उपयोग करने वालों ने इसे पढ़ने वालों के लिए कार्यक्रम को स्पष्ट कर दिया। नियम के शब्द का निष्ठापूर्वक पालन करते हुए, मूल प्रोग्रामर ने नियम के इरादे को विफल कर दिया था।
तो, हाँ, ग्लोबल्स अक्सर खराब होते हैं। लेकिन अगर आपको लगता है कि अंत में, प्रोग्रामर का इरादा वैश्विक चर के उपयोग से स्पष्ट हो गया है, तो आगे बढ़ें। हालाँकि, स्पष्टता में गिरावट को याद रखें जो स्वचालित रूप से लागू होती है जब आप किसी दूसरे कोड (ग्लोबल्स) को समझने के लिए मजबूर करते हैं कि पहला टुकड़ा कैसे काम करता है।
मेरे प्रोफेसर ऐसा कुछ कहते थे: यदि आप उन्हें सही तरीके से उपयोग करते हैं तो वैश्विक चर का उपयोग करना ठीक है। मुझे नहीं लगता कि मैं कभी भी उनका सही तरीके से उपयोग करने में अच्छा हुआ, इसलिए मैंने शायद ही कभी उनका इस्तेमाल किया हो।
static
वैश्विक चर का बहुत उपयोग करते हैं , भाषा सी है। अपेक्षाकृत छोटी अनुवाद इकाइयों में सीमित होने के कारण, वे सी ++ वस्तुओं के वर्ग चर के समान लगते हैं।
program lifetime, file scope variables
। और वे काफी वैश्विक हो जाते हैं जब आप बाहरी दुनिया के लिए चर के लिए एक पॉइंटर पास करते हैं (जो स्वचालित चर के साथ असंभव है) ..
static
वैश्विक चर एक ही अनुवाद इकाई के लिए सीमित गुंजाइश है। लेकिन उनके पास कार्यक्रम के अंत तक किसी भी वैश्विक चर के रूप में जीवनकाल है।
वैश्विक चर का उपयोग केवल तभी किया जाना चाहिए जब आपके पास कोई विकल्प न हो। और हां, जिसमें सिंगलेट्स भी शामिल हैं। एक पैरामीटर के आसपास से गुजरने की लागत को बचाने के लिए 90% समय, वैश्विक चर पेश किए जाते हैं। और फिर मल्टीथ्रेडिंग / यूनिट परीक्षण / रखरखाव कोडिंग होता है, और आपको एक समस्या है।
तो हां, 90% स्थितियों में वैश्विक चर खराब हैं। अपवाद आपके कॉलेज के वर्षों में आपके द्वारा देखे जाने की संभावना नहीं है। एक अपवाद मैं सोच सकता हूं कि मेरे सिर के शीर्ष पर अंतःक्रियात्मक तालिकाओं जैसे अंतर्निहित वैश्विक वस्तुओं के साथ व्यवहार हो रहा है। DB कनेक्शन जैसी चीजें वैश्विक लगती हैं , लेकिन यह नहीं है।
वैश्विक वैरिएबल प्रोग्रामर के लिए जो समस्या है, वह यह है कि यह विभिन्न कंपोनेंट्स के बीच इंटर-कंपोनेंट कपलिंग सतह का विस्तार करता है जो ग्लोबल वैरिएबल का उपयोग कर रहे हैं। इसका अर्थ यह है कि जैसे-जैसे वैश्विक चर का उपयोग करने वाले घटकों की संख्या बढ़ती है, बातचीत की जटिलता भी बढ़ सकती है। इस बढ़े हुए युग्मन से आम तौर पर सिस्टम में इंजेक्शन लगाने के लिए दोषों को आसान बना दिया जाता है और दोषों का निदान और सही करने के लिए कठिन हो जाता है। यह वृद्धि युग्मन भी परिवर्तन करते समय उपलब्ध विकल्पों की संख्या को कम कर सकता है और यह परिवर्तनों के लिए आवश्यक प्रयास को बढ़ा सकता है क्योंकि अक्सर परिवर्तन के परिणामों को निर्धारित करने के लिए वैश्विक मॉड्यूल का उपयोग करने वाले विभिन्न मॉड्यूल के माध्यम से पता लगाना चाहिए।
एनकैप्सुलेशन का उद्देश्य , जो मूल रूप से वैश्विक चर का उपयोग करने के विपरीत है, स्रोत को समझने और बदलने के लिए युग्मन को कम करना है और आसान और सुरक्षित रूप से परीक्षण किया गया है। जब वैश्विक चर का उपयोग नहीं किया जाता है तो यूनिट परीक्षण का उपयोग करना बहुत आसान होता है।
उदाहरण के लिए यदि आपके पास एक सरल वैश्विक पूर्णांक चर है, जिसका उपयोग एक एन्यूमरेटेड इंडिकेटर के रूप में किया जा रहा है, जो विभिन्न घटक राज्य मशीन के रूप में उपयोग करते हैं और आप एक नए घटक के लिए एक नया राज्य जोड़कर बदलाव करते हैं, तो आपको अन्य सभी के माध्यम से ट्रेस करना होगा घटकों को यह सुनिश्चित करने के लिए कि परिवर्तन उन्हें प्रभावित नहीं करेगा। एक संभावित समस्या का एक उदाहरण यह होगा कि यदि वर्तमान मानों में से प्रत्येक के लिए कथनों के switch
साथ गणना वैश्विक चर के मान का परीक्षण करने के लिए case
विभिन्न स्थानों में उपयोग किया जा रहा है और ऐसा होता है कि कुछ switch
बयानों default
को संभालने के लिए मामला नहीं है। वैश्विक के लिए एक अप्रत्याशित मूल्य अचानक आपके पास अपरिभाषित व्यवहार है जहां तक आवेदन का संबंध है।
दूसरी ओर, साझा डेटा क्षेत्र का उपयोग वैश्विक मापदंडों के एक सेट को सम्मिलित करने के लिए किया जा सकता है, जिसे पूरे अनुप्रयोग में संदर्भित किया जाता है। इस दृष्टिकोण का उपयोग अक्सर छोटे मेमोरी फुटप्रिंट्स के साथ एम्बेडेड अनुप्रयोगों के साथ किया जाता है।
इस प्रकार के अनुप्रयोगों में वैश्विक चर का उपयोग करते समय, आमतौर पर डेटा क्षेत्र को लिखने की जिम्मेदारी एक एकल घटक को आवंटित की जाती है और अन्य सभी घटक उस क्षेत्र को देखते हैं const
और उससे पढ़ते हैं, इसे कभी नहीं लिखते हैं। इस दृष्टिकोण को लेने से समस्याएं विकसित हो सकती हैं।
वैश्विक चरों की कुछ समस्याएं जिनके चारों ओर काम करने की आवश्यकता है
जब किसी वैश्विक चर जैसे स्रोत को संशोधित किया जाता है, तो इसका उपयोग करने वाली हर चीज को पुन: संकलित किया जाना चाहिए ताकि चर का उपयोग करने वाली हर चीज अपने सही आकार और मेमोरी टेम्पलेट को जान सके।
यदि एक से अधिक घटक वैश्विक चर को संशोधित कर सकते हैं, तो आप वैश्विक चर में असंगत डेटा के साथ समस्याओं में चल सकते हैं। मल्टी-थ्रेडिंग एप्लिकेशन के साथ, आपको एक रास्ता प्रदान करने के लिए संभवतः किसी प्रकार के लॉकिंग या महत्वपूर्ण क्षेत्र को जोड़ना होगा ताकि एक समय में केवल एक धागा वैश्विक चर को संशोधित कर सके और जब कोई धागा चर को संशोधित कर रहा हो, तो सभी परिवर्तन पूर्ण हो जाएं और अन्य थ्रेड्स चर को क्वेरी या संशोधित करने से पहले प्रतिबद्ध हो सकते हैं।
वैश्विक चर का उपयोग करने वाले बहु-थ्रेडेड अनुप्रयोग को डीबग करना अधिक कठिन हो सकता है। आप दौड़ की स्थिति में भाग सकते हैं जो ऐसे दोष पैदा कर सकते हैं जिन्हें दोहराने में मुश्किल होती है। वैश्विक चर के माध्यम से संचार करने वाले कई घटकों के साथ, विशेष रूप से एक बहु-थ्रेडेड एप्लिकेशन में, यह जानने में सक्षम है कि चर कब और कैसे बदल रहा है, यह घटक क्या बदल रहा है, यह समझना बहुत मुश्किल हो सकता है।
ग्लोबल क्लैबल्स के उपयोग से नाम क्लैश एक समस्या हो सकती है। एक स्थानीय चर जिसका वैश्विक चर के समान नाम है, वैश्विक चर को छिपा सकता है। C प्रोग्रामिंग लैंग्वेज का उपयोग करते समय आप नामकरण सम्मलेन में भी भाग लेते हैं। चारों ओर एक प्रणाली को एक विशेष उप-प्रणाली के लिए वैश्विक चर के साथ सिस्टम को सब-सिस्टम में विभाजित करना है, जो शुरुआत में पहले तीन अक्षरों के साथ शुरू होता है (इसे उद्देश्य सी में नाम स्थान टकराव को हल करने पर देखें )। C ++ नाम स्थान प्रदान करता है और C के साथ आप इसके चारों ओर एक विश्व स्तर पर दृश्यमान संरचना बनाकर काम कर सकते हैं, जिसके सदस्य डेटा और फ़ंक्शन के लिए विभिन्न डेटा आइटम और पॉइंटर्स हैं, जो किसी फ़ाइल में स्थिर के रूप में प्रदान किए जाते हैं, इसलिए केवल फ़ाइल दृश्यता के साथ ताकि उन्हें केवल संदर्भित किया जा सके विश्व स्तर पर दिखाई देने वाली संरचना।
कुछ मामलों में मूल एप्लिकेशन इरादे को बदल दिया जाता है ताकि वैश्विक चर जो राज्य को एक ही धागे के लिए प्रदान करते हैं, को कई डुप्लिकेट थ्रेड को चलाने की अनुमति देने के लिए संशोधित किया गया है। एक उदाहरण राज्य के लिए वैश्विक चर का उपयोग करने वाले एकल उपयोगकर्ता के लिए डिज़ाइन किया गया एक सरल अनुप्रयोग होगा और फिर दूरस्थ उपयोगकर्ताओं को आभासी उपयोगकर्ताओं के रूप में कार्य करने के लिए एक REST इंटरफ़ेस जोड़ने के लिए प्रबंधन से अनुरोध आता है । तो अब आप वैश्विक वैरिएबल्स और उनकी राज्य सूचनाओं को डुप्लिकेट करने के लिए दौड़ते हैं ताकि एकल उपयोगकर्ता के साथ-साथ दूरदराज के अनुप्रयोगों में से प्रत्येक वर्चुअल उपयोगकर्ता के पास अपना, अद्वितीय वैरिएबल सेट हो।
C ++ namespace
और struct
C के लिए तकनीक का उपयोग करना
C ++ प्रोग्रामिंग लैंग्वेज के लिए namespace
निर्देश एक नाम के टकराव की संभावना को कम करने में एक बड़ी मदद है। namespace
के साथ-साथ class
और विभिन्न पहुँच कीवर्ड ( private
, protected
, और public
) उपकरण आपको Encapsulate चर की जरूरत के सबसे प्रदान करते हैं। हालाँकि C प्रोग्रामिंग भाषा इस निर्देश को प्रदान नहीं करती है। यह स्टैकओवरफ़्लो पोस्टिंग, Namespaces in C , C के लिए कुछ तकनीक प्रदान करता है।
एक उपयोगी तकनीक एक एकल मेमोरी निवासी डेटा क्षेत्र है struct
जिसे वैश्विक दृश्यता के रूप में परिभाषित किया गया है और इसके भीतर struct
विभिन्न वैश्विक चर और कार्यों के संकेत हैं जिन्हें उजागर किया जा रहा है। वैश्विक चर की वास्तविक परिभाषाएँ static
कीवर्ड का उपयोग करके फ़ाइल गुंजाइश दी जाती हैं । यदि आप तब const
कीवर्ड का उपयोग करते हैं जो केवल पढ़ने के लिए संकेत करते हैं, तो कंपाइलर आपको केवल पहुंच को पढ़ने के लिए लागू करने में मदद कर सकता है।
struct
तकनीक का उपयोग करना भी वैश्विक को घेर सकता है ताकि यह एक प्रकार का पैकेज या घटक बन जाए जो कि वैश्विक हो। इस तरह का एक घटक होने से वैश्विक और वैश्विक उपयोग की कार्यक्षमता को प्रभावित करने वाले परिवर्तनों को प्रबंधित करना आसान हो जाता है।
हालांकि, जबकि namespace
या struct
तकनीक नाम संघर्ष प्रबंधन में मदद कर सकते हैं, अंतर-घटक युग्मन की अंतर्निहित समस्याओं जो विशेष रूप से एक आधुनिक बहु लड़ी आवेदन में वैश्विक प्रस्तुत किया जाने का उपयोग करते हैं, अभी भी मौजूद हैं।
हां, लेकिन जब तक आप वैश्विक चर का उपयोग करने वाले कोड में काम करना बंद नहीं करते हैं और वैश्विक चर का उपयोग करने वाले कोड का उपयोग करना शुरू करते हैं, तब तक आप वैश्विक चर की लागत नहीं लेते हैं। लेकिन लागत अभी भी है।
दूसरे शब्दों में, यह एक दीर्घकालिक अप्रत्यक्ष लागत है और जैसा कि ज्यादातर लोग सोचते हैं कि यह बुरा नहीं है।
यदि यह संभव है कि आपका कोड सर्वोच्च न्यायालय के परीक्षण के दौरान गहन समीक्षा के तहत समाप्त हो जाएगा , तो आप वैश्विक चर से बचने के लिए सुनिश्चित करना चाहते हैं।
इस लेख को देखें: छोटी गाड़ी सांस लेने वाला कोड स्रोत की समीक्षा के महत्व को दर्शाता है
कोड की शैली के साथ कुछ समस्याएं थीं जिन्हें दोनों अध्ययनों द्वारा पहचाना गया था। शैलीगत मुद्दों में से एक जो समीक्षकों को चिंतित करता था, वह असुरक्षित वैश्विक चर का व्यापक उपयोग था । इसे खराब रूप माना जाता है क्योंकि इससे यह जोखिम बढ़ जाता है कि कार्यक्रम की स्थिति असंगत हो जाएगी या कि मूल्यों को अनजाने में संशोधित या फिर से लिखा जाएगा। शोधकर्ताओं ने इस तथ्य के बारे में भी कुछ चिंता व्यक्त की है कि पूरे कोड में दशमलव परिशुद्धता लगातार बनी नहीं है।
यार, मैं शर्त लगाता हूं कि वे डेवलपर्स चाह रहे हैं कि वे वैश्विक चर का उपयोग न करें!
ग्लोबल वैरिएबल उतने ही बुरे हैं जितना आप उन्हें बनाते हैं, कम नहीं।
यदि आप एक पूरी तरह से समझाया कार्यक्रम बना रहे हैं, तो आप ग्लोबल्स का उपयोग कर सकते हैं। ग्लोबल्स का उपयोग करना "पाप" है, लेकिन प्रोग्रामिंग पाप दुर्लभ रूप से दार्शनिक हैं।
यदि आप L.in.oleum की जांच करते हैं , तो आपको एक ऐसी भाषा दिखाई देगी , जिसके चर पूरी तरह से वैश्विक हैं। यह अस्थिर है क्योंकि पुस्तकालयों में ग्लोबल्स का उपयोग करने के अलावा कोई विकल्प नहीं है।
कहा कि, यदि आपके पास विकल्प हैं, और प्रोग्रामर दर्शन को अनदेखा कर सकते हैं, तो ग्लोबल्स सभी खराब नहीं हैं।
न तो गोटोस हैं, अगर आप उन्हें सही उपयोग करते हैं।
बड़ी "बुरी" समस्या यह है कि, यदि आप उनका गलत उपयोग करते हैं, तो लोग चिल्लाते हैं, मार्स लैंडर क्रैश हो जाता है, और दुनिया उड़ जाती है .... या ऐसा ही कुछ।
मैं इस प्रश्न का उत्तर एक और प्रश्न के साथ दूंगा: क्या आप सिंगलटन का उपयोग करते हैं / क्या सिंगेलटन खराब हैं?
क्योंकि (लगभग सभी) सिंगलटन उपयोग एक वैश्विक वैरिएबल है।
यह मुद्दा कम है कि वे बुरे हैं , और अधिक वे खतरनाक हैं । उनके पास पेशेवरों और विपक्षों का अपना सेट है, और ऐसी परिस्थितियां हैं जहां वे या तो सबसे कुशल हैं या किसी विशेष कार्य को प्राप्त करने का एकमात्र तरीका है। हालाँकि, इनका दुरुपयोग करना बहुत आसान है, भले ही आप हमेशा इनका सही उपयोग करने के लिए कदम उठाएं।
कुछ पेशेवरों:
कुछ विपक्ष:
ध्यान दें, यदि आप करेंगे, कि पहले दो पेशेवरों और पहले सूचीबद्ध किए गए पहले दो विपक्ष ठीक एक ही बात हैं, बस अलग-अलग शब्दों के साथ। ऐसा इसलिए है क्योंकि एक वैश्विक चर की विशेषताएं वास्तव में उपयोगी हो सकती हैं, लेकिन बहुत ही विशेषताएं जो उन्हें उपयोगी बनाती हैं, वे उनकी सभी समस्याओं का स्रोत हैं।
कुछ समस्याओं के कुछ संभावित समाधान:
Globals
या होगा GlobalVars
), या वैश्विक चर के लिए एक मानकीकृत नामकरण सम्मेलन का उपयोग करें (जैसे कि global_[name]
या g_module_varNameStyle
टिप्पणी में uncorecore_d द्वारा उल्लेख किया गया है) ))। यह दोनों उनके उपयोग का दस्तावेज़ देगा (आप कोड प्राप्त कर सकते हैं जो नामस्थान / संरचना नाम की खोज करके वैश्विक चर का उपयोग करता है), और वैश्विक नाम स्थान पर प्रभाव को कम करता है।extern
संबंधित हेडर में घोषित करें , इसलिए उनका उपयोग उन संकलन इकाइयों तक सीमित हो सकता है, जिन्हें उन्हें एक्सेस करने की आवश्यकता होती है। यदि आपका कोड बहुत सारे वैश्विक चर पर निर्भर करता है, लेकिन प्रत्येक संकलन इकाई को केवल कुछ मुट्ठी भर तक पहुंच की आवश्यकता होती है, तो आप उन्हें कई स्रोत फ़ाइलों में सॉर्ट करने पर विचार कर सकते हैं, इसलिए प्रत्येक फ़ाइल की पहुंच को वैश्विक चर तक सीमित करना आसान है।चाहे वे अच्छे हों या बुरे यह इस बात पर निर्भर करता है कि आप उनका उपयोग कैसे करते हैं। बहुमत उन्हें बुरी तरह से इस्तेमाल करते हैं, इसलिए उनके प्रति सामान्य चेतावनी। यदि सही तरीके से उपयोग किया जाता है, तो वे एक प्रमुख वरदान हो सकते हैं; अगर खराब इस्तेमाल किया, तथापि, वे और कर सकते हैं जाएगा वापस आ आप काटने का कब और कैसे आप कम से कम यह उम्मीद करते हैं।
इसे देखने का एक अच्छा तरीका यह है कि वे स्वयं बुरे नहीं हैं, लेकिन वे खराब डिजाइन को सक्षम करते हैं, और खराब डिजाइन के प्रभाव को तेजी से बढ़ा सकते हैं।
यहां तक कि अगर आप उनका उपयोग करने का इरादा नहीं रखते हैं, तो यह जानना बेहतर है कि उन्हें सुरक्षित रूप से कैसे उपयोग करें और न चुनें, न कि उनका उपयोग करने के लिए क्योंकि आप नहीं जानते कि उन्हें कैसे सुरक्षित रूप से उपयोग करना है। यदि आप कभी भी अपने आप को ऐसी स्थिति में पाते हैं जहाँ आपको पहले से मौजूद कोड को बनाए रखने की आवश्यकता होती है जो वैश्विक चर पर निर्भर होता है, तो आप मुश्किल में पड़ सकते हैं यदि आप नहीं जानते कि उनका सही उपयोग कैसे करें।
g_module_varNameStyle
पूरी तरह से सुपाठ्य लगता है । स्पष्ट होने के लिए, मैं ग्लोबल्स का उपयोग नहीं कर रहा हूं अगर मैं इसे आसानी से बचा सकता हूं - कुंजी शब्द आसानी से , क्योंकि जब से मैंने विश्वास करना बंद कर दिया है, तो उन्हें बचा जाना चाहिए - या बल्कि मोटे तौर पर - हर कीमत पर, मैं बहुत बेहतर समय पा रहा हूं, और मेरा कोड है (सदमा!) दूर का चित्र
जैसा कि किसी ने दूसरे सूत्र में कहा है (मैं paraphrasing हूँ) "इस तरह के नियम नहीं तोड़े जाने चाहिए, जब तक कि आप ऐसा करने के परिणामों को पूरी तरह से नहीं समझते हैं।"
ऐसे समय होते हैं जब वैश्विक चर आवश्यक होते हैं, या कम से कम बहुत सहायक होते हैं (उदाहरण के लिए सिस्टम परिभाषित कॉल-बैक के साथ काम करना)। दूसरी ओर, वे उन सभी कारणों के लिए भी बहुत खतरनाक हैं जो आपको बताए गए हैं।
प्रोग्रामिंग के कई पहलू हैं जिन्हें संभवतः विशेषज्ञों के लिए छोड़ दिया जाना चाहिए। कभी-कभी आप एक बहुत तेज चाकू की जरूरत है। लेकिन जब तक आप तैयार न हों, तब तक आपको एक का उपयोग करने की आवश्यकता नहीं है ...
वैश्विक चर आम तौर पर खराब होते हैं, खासकर यदि अन्य लोग एक ही कोड पर काम कर रहे हैं और 20mins खर्च नहीं करना चाहते हैं, तो चर को संदर्भित करने वाले सभी स्थानों की खोज करना। और थ्रेड्स जो वेरिएबल्स को संशोधित करते हैं, सिरदर्द के एक नए स्तर में लाता है।
एक एकल अनुवाद इकाई में उपयोग किए जाने वाले एक अनाम नामस्थान में वैश्विक स्थिरांक पेशेवर ऐप्स और पुस्तकालयों में ठीक और सर्वव्यापी हैं। लेकिन अगर डेटा म्यूटेबल है, और / या इसे कई टीयू के बीच साझा किया जाना है, तो आप इसे एनकैप्सुलेट करना चाह सकते हैं - यदि डिज़ाइन के लिए नहीं है, तो किसी के लिए डिबगिंग या अपने कोड के साथ काम करने के लिए।
वैश्विक चर का उपयोग करना एक गलीचा के नीचे गंदगी की तरह है। यह एक त्वरित सुधार है, और इसे साफ करने के लिए धूल-पैन या वैक्यूम प्राप्त करने की तुलना में अल्पावधि में बहुत आसान है। हालांकि, यदि आप कभी भी बाद में गलीचा हिलना शुरू करते हैं, तो आपको एक बड़ा आश्चर्य गड़बड़ होने वाला है।
मुझे लगता है कि आपके प्रोफेसर की कोशिश शुरू होने से पहले ही एक बुरी आदत को रोकने की है।
वैश्विक चर का अपना स्थान है और कई लोगों ने कहा कि यह जानना कि उन्हें कब और कहां इस्तेमाल करना है, यह जटिल हो सकता है। इसलिए मुझे लगता है कि क्यों, कैसे, कब, और कहाँ वैश्विक चर के अपने किरकिरी में पाने के बजाय अपने प्रोफेसर सिर्फ प्रतिबंध का फैसला किया। कौन जानता है, वह भविष्य में उन पर प्रतिबंध लगा सकता है।
बिलकुल नहीं। हालांकि उनका दुरुपयोग करना ... यह बुरा है।
नासमझी के लिए उन्हें हटाना सिर्फ इतना ही है ... नासमझ। जब तक आप एडवांटेज और नुकसान नहीं जानते हैं, तब तक यह स्पष्ट करना और करना सबसे अच्छा है जैसा कि आपको सिखाया / सीखा गया है, लेकिन वैश्विक चर के साथ कुछ भी गलत नहीं है। जब आप पेशेवरों और विपक्षों को बेहतर समझते हैं तो अपना निर्णय स्वयं करें।
वैश्विक चर छोटे कार्यक्रमों में ठीक हैं, लेकिन अगर बड़े लोगों में भी उसी तरह से उपयोग किया जाए तो भयानक है।
इसका मतलब है कि आप सीखते समय उनका उपयोग करने की आदत आसानी से प्राप्त कर सकते हैं। यह वही है जो आपका प्रोफेसर आपको बचाने की कोशिश कर रहा है।
जब आप अधिक अनुभवी होते हैं, तो जब वे ठीक होते हैं, तो सीखना आसान होगा।
नहीं, वे बिल्कुल भी बुरे नहीं हैं। आपको यह निर्धारित करने के लिए संकलक द्वारा उत्पादित मशीन (मशीन) कोड को देखने की आवश्यकता है, कभी-कभी एक वैश्विक की तुलना में स्थानीय का उपयोग करना कहीं अधिक खराब है। यह भी ध्यान दें कि "स्थिर" को एक स्थानीय चर पर रखना मूल रूप से इसे एक वैश्विक बना रहा है (और अन्य बदसूरत समस्याएं पैदा करता है जो एक वास्तविक वैश्विक हल करेगा)। "स्थानीय ग्लोबल्स" विशेष रूप से खराब हैं।
ग्लोबल्स आपको अपने मेमोरी उपयोग पर साफ नियंत्रण प्रदान करते हैं, स्थानीय लोगों के साथ कुछ अधिक कठिन। इन दिनों जो केवल एम्बेडेड वातावरण में मायने रखता है जहां मेमोरी काफी सीमित है। कुछ पता करने से पहले आपको लगता है कि एम्बेडेड अन्य वातावरणों के समान है और मान लें कि प्रोग्रामिंग नियम पूरे बोर्ड में समान हैं।
यह अच्छा है कि आप पढ़ाए जा रहे नियमों पर सवाल उठाते हैं, उनमें से ज्यादातर उन कारणों के लिए नहीं हैं जो आपको बताए जा रहे हैं। सबसे महत्वपूर्ण सबक हालांकि यह नहीं है कि यह आपके साथ हमेशा के लिए ले जाने के लिए एक नियम है, लेकिन इस वर्ग को पारित करने और आगे बढ़ने के लिए सम्मान की आवश्यकता है। जीवन में आपको पता चलेगा कि कंपनी XYZ के लिए आपके पास अन्य प्रोग्रामिंग नियम होंगे, जिन्हें आपको पेचेक रखने के लिए अंत में सम्मान करना होगा। दोनों ही स्थितियों में आप नियम पर बहस कर सकते हैं, लेकिन मुझे लगता है कि स्कूल की तुलना में आपके पास नौकरी में बेहतर किस्मत होगी। आप सिर्फ कई छात्रों में से एक हैं, आपकी सीट जल्द ही बदल जाएगी, प्रोफेसर अभ्यस्त नहीं हैं, एक काम पर आप खिलाड़ियों की एक छोटी टीम में से एक हैं जिन्हें इस उत्पाद को अंत तक देखना है और उस वातावरण में विकसित नियम हैं टीम के सदस्यों के साथ-साथ उत्पाद और कंपनी का लाभ, इसलिए अगर हर कोई दिमाग की तरह है या विशेष उत्पाद के लिए कॉलेज में सीखी गई किसी चीज़ का उल्लंघन करने के लिए इंजीनियरिंग का अच्छा कारण है या जेनेरिक प्रोग्रामिंग पर कोई पुस्तक है, तो अपना विचार टीम को बेच दें और इसे एक मान्य के रूप में लिखें यदि पसंदीदा तरीका नहीं है । वास्तविक दुनिया में सब कुछ उचित खेल है।
यदि आप स्कूल या किताबों में आपको सिखाए गए सभी प्रोग्रामिंग नियमों का पालन करते हैं तो आपका प्रोग्रामिंग कैरियर बेहद सीमित हो जाएगा। आप संभवतः जीवित रह सकते हैं और एक फलदायी कैरियर बना सकते हैं, लेकिन आपके लिए उपलब्ध वातावरण की चौड़ाई और चौड़ाई बेहद सीमित होगी। यदि आप जानते हैं कि नियम कैसे और क्यों है और इसका बचाव कर सकते हैं, तो अच्छा है, यदि आपके पास केवल यह कारण है कि "क्योंकि मेरे शिक्षक ने ऐसा कहा है", तो यह अच्छा नहीं है।
ध्यान दें कि इस तरह के विषयों को अक्सर कार्यस्थल में तर्क दिया जाता है और यह जारी रहेगा, क्योंकि संकलक और प्रोसेसर (और भाषाएं) विकसित होते हैं इसलिए इस प्रकार के नियम बनाएं और अपनी स्थिति का बचाव किए बिना और संभवतः किसी अन्य व्यक्ति द्वारा आपको सिखाया गया पाठ पढ़ाया जाना चाहिए। आगे बढ़ो।
इस बीच में, फिर बस वही करें जो सबसे ज़ोर से बोलता है या सबसे बड़ी छड़ी को उठाता है (जब तक कि आप सबसे ज़ोर से चिल्लाते हैं और सबसे बड़ी छड़ी ले जाते हैं)।
मैं इस सूत्र में इस बात के विरूद्ध तर्क देना चाहूंगा कि यह बहु-थ्रेडिंग को कठिन या असंभव बना देता है। वैश्विक चर साझा किए गए राज्य हैं, लेकिन ग्लोबल्स (उदाहरण के लिए पासिंग पॉइंटर्स) के विकल्प भी राज्य साझा कर सकते हैं। मल्टी-थ्रेडिंग के साथ समस्या यह है कि साझा स्थिति का सही उपयोग कैसे किया जाए, न कि उस स्थिति को वैश्विक चर के माध्यम से साझा किया जाए या कुछ और।
अधिकांश समय जब आप मल्टी-थ्रेडिंग करते हैं तो आपको कुछ साझा करने की आवश्यकता होती है। उदाहरण के लिए निर्माता-उपभोक्ता पैटर्न में, आप कुछ थ्रेड-सुरक्षित कतार साझा कर सकते हैं जिसमें कार्य इकाइयाँ होती हैं। और आपको इसे साझा करने की अनुमति है क्योंकि वह डेटा संरचना थ्रेड-सुरक्षित है। चाहे वह कतार वैश्विक हो या न हो पूरी तरह अप्रासंगिक है जब यह थ्रेड-सेफ्टी की बात आती है।
इस पूरे धागे में व्यक्त की गई आशा है कि एक प्रोग्राम को सिंगल-थ्रेडेड से मल्टी-थ्रेडेड में बदलना आसान होगा जब ग्लोबल्स का उपयोग न किया जाए। हां, ग्लोबल्स खुद को पैर में गोली मारना आसान बनाते हैं, लेकिन अपने आप को शूट करने के कई तरीके हैं।
मैं ग्लोबल्स की वकालत नहीं कर रहा हूं, क्योंकि अन्य बिंदु अभी भी खड़े हैं, मेरी बात केवल यह है कि किसी प्रोग्राम में थ्रेड्स की संख्या का वेरिएबल स्कोप से कोई लेना-देना नहीं है।
हां, क्योंकि यदि आप अक्षम प्रोग्रामर का उपयोग करते हैं (90% विशेष रूप से वैज्ञानिकों को पढ़ें) तो आप 600+ वैश्विक चर के साथ 20+ फ़ाइलों और 12,000 लाइनों की एक परियोजना के साथ समाप्त होते हैं जहां 80% फ़ंक्शन शून्य लेते हैं, शून्य करते हैं और काम करते हैं पूरी तरह से वैश्विक स्थिति पर।
यह समझना मुश्किल हो जाता है कि किसी एक बिंदु पर क्या हो रहा है जब तक आप पूरी परियोजना को नहीं जानते।
वैश्विक चर का उपयोग वास्तव में आवश्यकताओं पर निर्भर करता है। इसका लाभ यह है, यह बार-बार मूल्यों को पारित करने के ओवरहेड को कम करता है।
लेकिन आपका प्रोफेसर सही है क्योंकि यह सुरक्षा के मुद्दों को उठाता है इसलिए वैश्विक चर के उपयोग को जितना संभव हो उतना टाला जाना चाहिए। वैश्विक चर भी समस्याएं पैदा करते हैं जो कभी-कभी डिबग करना मुश्किल होता है ।
उदाहरण के लिए:-
परिवर्तन जब चर मानों को रनटाइम पर संशोधित किया जा रहा है । उस समय यह पहचानना मुश्किल है कि कोड का कौन सा भाग इसे संशोधित कर रहा है और किन शर्तों पर।
जब विन्यास की बात आती है तो वैश्विक अच्छे हैं । हम अपने चाहते हैं विन्यास / बदल जाता है एक के लिए वैश्विक प्रभाव पर पूरी परियोजना ।
इसलिए हम एक कॉन्फ़िगरेशन को बदल सकते हैं और परिवर्तन पूरे प्रोजेक्ट के लिए निर्देशित किए जाते हैं । लेकिन मुझे चेतावनी देनी चाहिए कि ग्लोबल्स का उपयोग करने के लिए आपको बहुत स्मार्ट होना पड़ेगा।
जितनी जल्दी या बाद में आपको यह बदलना होगा कि उस चर को कैसे सेट किया जाता है या जब यह एक्सेस किया जाता है तो क्या होता है, या आपको बस इसे बदलने के लिए नीचे शिकार करने की आवश्यकता होती है।
वैश्विक चर न होना व्यावहारिक रूप से हमेशा बेहतर होता है। बस बांध प्राप्त करें और तरीकों को सेट करें, और जब आप उन्हें एक दिन, सप्ताह या महीने बाद की आवश्यकता हो, तो आपको ग्रंथि दें।
मैं आमतौर पर उन मानों के लिए ग्लोबल्स का उपयोग करता हूं जिन्हें शायद ही कभी बदल दिया जाता है जैसे कि डायनेमिकली लोडेड लाइब्रेरी में फ़ंक्शन के लिए सिंगलटन या फंक्शन पॉइंटर्स। Multithreaded अनुप्रयोगों में उत्परिवर्ती ग्लोबल्स का उपयोग करने से बग को ट्रैक करने के लिए कड़ी मेहनत होती है, इसलिए मैं इसे एक सामान्य नियम के रूप में बचने की कोशिश करता हूं।
किसी तर्क को पारित करने के बजाय एक वैश्विक का उपयोग करना अक्सर तेज़ होता है, लेकिन यदि आप एक मल्टीथ्रेडेड एप्लिकेशन लिख रहे हैं, जो आप आजकल करते हैं, तो यह आम तौर पर बहुत अच्छी तरह से काम नहीं करता है (आप थ्रेड-स्टैटिक्स का उपयोग कर सकते हैं लेकिन फिर प्रदर्शन लाभ संदिग्ध है) ।
एक एंटरप्रीज़ के भीतर वेब अनुप्रयोगों में सत्र / विंडो / थ्रेड / उपयोगकर्ता विशिष्ट डेटा को ऑप्टिमाइज़ेशन के कारणों के लिए सर्वर पर रखने और काम के नुकसान से बचाने के लिए उपयोग किया जा सकता है जहां कनेक्शन अस्थिर हैं। जैसा कि उल्लेख किया गया है, दौड़ की स्थिति को संभालने की आवश्यकता है। हम इस जानकारी के लिए एक वर्ग के एकल उदाहरण का उपयोग करते हैं और इसे सावधानीपूर्वक प्रबंधित किया जाता है।
दिन के अंत में, आपका कार्यक्रम या ऐप अभी भी काम कर सकता है, लेकिन यह सुव्यवस्थित होने और व्हाट्सएप के बारे में पूरी समझ रखने की बात है। यदि आप सभी कार्यों के बीच एक चर मान साझा करते हैं, तो यह पता लगाना मुश्किल हो सकता है कि फ़ंक्शन किस मान को बदल रहा है (यदि फ़ंक्शन ऐसा करता है) और एक लाख गुना कठिन डिबगिंग बनाता है
सुरक्षा कम है इसका मतलब यह है कि कोई भी वैरिएबल को हेरफेर कर सकता है यदि वे वैश्विक घोषित किए जाते हैं, तो इसके लिए यह एक उदाहरण है कि यदि आप अपने बैंक कार्यक्रम में एक वैश्विक वैरिएबल के रूप में संतुलन रखते हैं तो उपयोगकर्ता फ़ंक्शन इसे जोड़ सकते हैं और साथ ही बैंक अधिकारी भी हेरफेर कर सकते हैं। इसलिए यह एक समस्या है। केवल उपयोगकर्ता को केवल रीड दिया जाना चाहिए और फ़ंक्शन को वापस लेना चाहिए लेकिन बैंक के क्लर्क उस राशि को जोड़ सकते हैं जब उपयोगकर्ता व्यक्तिगत रूप से डेस्क में कैश देता है। यह जिस तरह से काम करता है
बहु-थ्रेडेड अनुप्रयोग में, दौड़ की स्थिति से बचने के लिए वैश्विक चर के स्थान पर स्थानीय चर का उपयोग करें।
एक दौड़ की स्थिति तब होती है जब कई थ्रेड साझा संसाधन तक पहुंचते हैं, जिसमें कम से कम एक थ्रेड होता है जिसमें डेटा तक पहुंच होती है। फिर, कार्यक्रम का परिणाम अनुमानित नहीं है, और विभिन्न थ्रेड्स द्वारा डेटा तक पहुंच के आदेश पर निर्भर करता है।
इस पर अधिक यहाँ, https://software.intel.com/en-us/articles/use-intel-parallel-inspector-to-find-race-conditions-in-openmp-based-multithreaded --code