दिलचस्प पोस्ट
मैं एक महीने के आखिरी दिन कैसे प्राप्त करूं? क्या सी # को जावास्क्रिप्ट के एनकोडुरिकमोनेंट () के समतुल्य है? जावा मैवेन परियोजना में विवादित पुस्तकालय संस्करण JSON के माध्यम से एंड्रॉइड से सर्वर पर डेटा भेजें एक सर्वेक्षण के लिए डेटाबेस डिजाइन दृश्य स्टूडियो 2010 के लिए OpenCV-2.3 सेटअप करें java.lang.NoClassDefFound त्रुटि: संगठन / वसंतफ्रेमवर्क / कोर / एनवाईवी / कॉन्फ़िगर करने योग्य पर्यावरण % Eax को printf के लिए कॉल करने से पहले क्यों चुना जाता है? रूबी: आवश्यकता होती है vs_relative – रूबी <1.9.2 और> = 1.9.2 दोनों में चलने के लिए सबसे अच्छा अभ्यास Lxml xpath में नियमित अभिव्यक्ति का उपयोग कैसे करें? एंड्रॉइड पर मैं वीडियो रिकॉर्डिंग कैसे कैद कर सकता हूं? XML दस्तावेज़ से निर्दिष्ट नोड मान प्राप्त करना मैं किसी तरह के वाइल्डकार्ड का उपयोग कर कॉलम में कैसे खोज सकता हूँ (केस-असंवेदनशील)? Photos.app से अंतिम चित्र प्राप्त करें? PHP भाजित सीमांकित स्ट्रिंग में कुंजी / वैल्यू जोड़े (एसोसिएटेटेड अर्रे)

क्या वैश्विक चर खराब है?

सी / सी ++ में, क्या वैश्विक प्रोफेसर सोचते हैं कि वे हैं?

वेब के समाधान से एकत्रित समाधान "क्या वैश्विक चर खराब है?"

वैश्विक चर के साथ समस्या ये है कि जब से प्रत्येक फ़ंक्शन इन तक पहुंच पाती है, तब यह पता लगाना बहुत कठिन हो जाता है कि वास्तव में कौन से कार्य वास्तव में इन चर को पढ़ और लिखते हैं।

यह समझने के लिए कि आवेदन कैसे काम करता है, आप को हर कार्य को ध्यान में रखना होगा जो वैश्विक स्थिति को संशोधित करता है। ऐसा किया जा सकता है, लेकिन जैसा कि आवेदन बढ़ता है, वस्तुतः असंभव होने पर (या कम से कम समय की पूर्ण बेकार) होने के कारण इसे कठिन हो जाएगा

यदि आप वैश्विक चर पर भरोसा नहीं करते हैं, तो आप आवश्यकता के अनुसार विभिन्न कार्यों के बीच राज्य को पार कर सकते हैं। इस तरह आप समझते हैं कि प्रत्येक फ़ंक्शन क्या करता है, जैसा आपको वैश्विक राज्य को ध्यान में रखने की आवश्यकता नहीं है, उतनी बेहतर मौका है।

मेरा प्रोफेसर ऐसा कुछ कहना चाहता था: वैश्विक चर का उपयोग करना ठीक है अगर आप उन्हें सही तरीके से उपयोग करते हैं मुझे नहीं लगता कि मुझे उन्हें सही तरीके से इस्तेमाल करने में अच्छा लगे, इसलिए मैंने उन्हें शायद ही कभी इस्तेमाल किया।

महत्वपूर्ण बात यह है कि समग्र लक्ष्य को याद रखना चाहिए: स्पष्टता

"कोई ग्लोबल वैरिएबल" नियम नहीं है क्योंकि ज्यादातर समय, ग्लोबल वैरिएबल कोड का अर्थ कम स्पष्ट करता है।

हालांकि, कई नियमों की तरह, लोगों को नियम याद है, और न कि नियम का उद्देश्य क्या था।

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

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

जब आपके पास कोई विकल्प नहीं है तो केवल वैश्विक चर का उपयोग किया जाना चाहिए और हाँ, इसमें सिंगलटन शामिल हैं समय का 90%, वैश्विक चर को एक पैरामीटर के चारों ओर से गुजरने की लागत को बचाने के लिए पेश किया जाता है। और फिर multithreading / इकाई परीक्षण / रखरखाव कोडिंग होता है, और आपको एक समस्या है।

तो हां, 90% स्थितियों में वैश्विक चर खराब हैं अपवाद अपने कॉलेज के वर्षों में आपके द्वारा देखा जाने की संभावना नहीं है। एक अपवाद मैं अपने सिर के ऊपर से सोच सकता हूँ स्वाभाविक वैश्विक वस्तुओं जैसे कि अंतराल तालिकाएं से निपटना डीबी कनेक्शन जैसी चीजें वैश्विक हैं, लेकिन ऐसा नहीं है।

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

दूसरे शब्दों में, यह दीर्घकालिक अप्रत्यक्ष लागत है और जैसे अधिकांश लोगों को लगता है कि यह बुरा नहीं है।

मैं एक और सवाल के साथ इस सवाल का जवाब देना चाहूंगा: क्या आप सिंगेलॉन्स का उपयोग करते हैं / क्या आपस में बुरा लगता है?

क्योंकि (लगभग सभी) सिंगलटन उपयोग एक गौरवशाली वैश्विक चर है

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

इस लेख को देखें: छोटी गाड़ी का सांस लेने वाला कोड स्रोत की समीक्षा के महत्व को दर्शाता है

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

यार, मुझे यकीन है उन डेवलपर्स की इच्छा है कि उन्होंने वैश्विक चर का इस्तेमाल नहीं किया!

ग्लोबल वैरिएबल उतने ही बुरे हैं जैसे आप उन्हें करते हैं, कम नहीं।

यदि आप एक पूरी तरह से समसामयिक कार्यक्रम बना रहे हैं, तो आप वैश्विक उपयोग कर सकते हैं ग्लोबल्स का उपयोग करने के लिए यह "पाप" है, लेकिन प्रोग्रामिंग पापों को दलित दार्शनिक हैं

यदि आप एल.इन.ओलियम की जांच करते हैं, तो आपको एक ऐसी भाषा दिखाई देगी , जिसका चर एकमात्र वैश्विक है यह असंभव है क्योंकि लाइब्रेरीज़ के पास ग्लोबल्स का उपयोग करने के लिए कोई विकल्प नहीं है।

उस ने कहा, अगर आपके पास विकल्प हैं, और प्रोग्रामर दर्शन को अनदेखा कर सकते हैं, तो दुनिया भर में वह सब बुरा नहीं है।

न तो गोटो हैं, यदि आप उनका सही इस्तेमाल करते हैं

बड़ी "बुरी" समस्या यह है कि, यदि आप उन्हें गलत इस्तेमाल करते हैं, तो लोग चिल्लाते हैं, मर्स लैंडर क्रैश हो जाता है, और दुनिया में चल रही है …. या ऐसा कुछ।

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

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

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

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

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

वैश्विक चर का उपयोग करने के साथ यहां कुछ समस्याएं हैं जिनके लिए आसपास काम किया जाना चाहिए।

जब किसी वैश्विक चर जैसे स्रोत को संशोधित किया जाता है, तो इसका उपयोग करके प्रत्येक चीज को पुनः कंपाइल किया जाना चाहिए ताकि चर का उपयोग करके सब कुछ उसके वास्तविक आकार और मेमोरी टेम्पलेट को जानता हो।

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

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

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

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

जैसा कि किसी ने कहा (मैं परावर्तन करता हूं) दूसरे धागे में "इस तरह के नियमों को तोड़ा नहीं जाना चाहिए, जब तक कि आप पूरी तरह से ऐसा करने के परिणामों को समझें।"

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

प्रोग्रामिंग के कई पहलू हैं जो शायद विशेषज्ञों के लिए छोड़ दिए जाएं। कभी-कभी आपको एक बहुत तेज चाकू की आवश्यकता होती है लेकिन जब तक आप तैयार नहीं हो जाते तब तक आप एक का उपयोग नहीं करते …

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

एक एकल अनुवाद इकाई में उपयोग किए गए एक अनाम नामस्थान में वैश्विक स्थिर पेशेवर एप और पुस्तकालयों में ठीक और सर्वव्यापी हैं। लेकिन अगर डेटा अस्थिर है, और / या इसे कई टीयू के बीच साझा किया जाना है, तो आप इसे इनक्यूबेट कर सकते हैं – यदि डिज़ाइन के लिए नहीं, तो किसी को डिबगिंग या आपके कोड के साथ काम करने के लिए

बिलकुल नहीं। हालांकि उनका दुरुपयोग करना … यह बुरा है।

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

ग्लोबल वेरिएबल्स खराब हैं, यदि वे आपको प्रोग्राम के पहलुओं को हेरफेर करने की इजाजत देते हैं जिन्हें केवल स्थानीय रूप से संशोधित किया जाना चाहिए ओप ग्लोबल्स में अक्सर इनकैप्सुलेशन-विचार से संघर्ष होता है।

मुझे लगता है कि आपका प्राध्यापक इससे पहले ही शुरू होने से पहले एक बुरी आदत को रोकने की कोशिश कर रहा है।

ग्लोबल वेरिएबल्स की जगह होती है और बहुत से लोग जानते हैं कि उनका उपयोग कब और कब किया जाए, यह जटिल हो सकता है। इसलिए मुझे लगता है कि क्यों, कैसे, कब और ग्लोबल वेरिएबल कहां से आपके प्रोफेसर ने सिर्फ प्रतिबंध लगाने का फैसला किया है, इस बारे में क्या कहा गया है? कौन जानता है, वह भविष्य में इन पर प्रतिबंध लगा सकता है।

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

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

कुछ पेशेवरों:

  • किसी भी समारोह से पहुँचा जा सकता है
  • एकाधिक धागे से पहुँचा जा सकता है
  • कार्यक्रम के समाप्त होने तक कभी भी क्षेत्र से बाहर नहीं निकलेगा

कुछ विपक्ष:

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

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

कुछ समस्याओं का कुछ संभावित समाधान:

  • विचार करें कि क्या वे वास्तव में समस्या के लिए सबसे अच्छा या सबसे प्रभावी समाधान हैं। यदि कोई बेहतर समाधान है, तो इसके बजाय इसका उपयोग करें
  • एक अद्वितीय नाम (एक अच्छा उदाहरण GlobalVars या GlobalVars ) के साथ एक नामस्थान [सी ++] या सिंगलटन स्ट्रेट [सी, सी +] में GlobalVars या वैश्विक चर के लिए एक मानकीकृत नामकरण सम्मेलन का उपयोग करें (जैसे कि global_[name] या g_module_varNameStyle ( जैसा कि टिप्पणियों में underscore_d द्वारा उल्लिखित है))। यह दोनों अपने उपयोग का दस्तावेज करेगा (आप कोड को पा सकते हैं जो नाम-स्थान / संरचना नाम की खोज करके वैश्विक चर का उपयोग करता है), और वैश्विक नामस्थान पर प्रभाव को कम करता है।
  • किसी भी फ़ंक्शन के लिए जो वैश्विक वैरिएबल तक पहुंचता है, स्पष्ट रूप से दस्तावेज़ जो वे चर पढ़ता है और जो इसे लिखता है यह समस्या निवारण आसान बना देगा।
  • उन्हें अपनी स्वयं की स्रोत फाइल में रखें और संबंधित हेडर में उन्हें अलग-अलग घोषित करें, इसलिए उनका उपयोग उन संकलन इकाइयों तक सीमित हो सकता है, जिन्हें उन तक पहुंचने की आवश्यकता होती है। यदि आपका कोड बहुत सारे वैश्विक चर पर निर्भर करता है, लेकिन प्रत्येक संकलन इकाई को केवल मुट्ठी भर करने की आवश्यकता होती है, तो आप उन्हें कई स्रोत फ़ाइलों में सॉर्ट करने पर विचार कर सकते हैं, इसलिए प्रत्येक फ़ाइल की वैश्विक चर तक पहुंच को सीमित करना आसान है।
  • लॉक और अनलॉक करने के लिए एक तंत्र सेट करें, और / या अपना कोड डिज़ाइन करें ताकि जितना संभव हो उतना फ़ंक्शंस को वैश्विक चर संशोधित करने की आवश्यकता हो। उन्हें पढ़ना उन्हें लिखने की तुलना में अधिक सुरक्षित है, यद्यपि धागा दौड़ अभी भी मल्टी थ्रेड प्रोग्राम में समस्या पैदा कर सकता है।
  • असल में, उन तक पहुंच कम करके, और नाम विशिष्टता को अधिकतम करें आप नाम टकराव से बचना चाहते हैं और संभवत: कम से कम फ़ंक्शंस के रूप में है, जो संभावित रूप से किसी भी दिए गए चर को संशोधित कर सकते हैं।

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

इसे देखने का एक अच्छा तरीका यह है कि वे खुद को बुरे नहीं हैं, लेकिन वे खराब डिज़ाइन को सक्षम करते हैं, और बुरे डिजाइन के प्रभाव को तेजी से बढ़ा सकते हैं।


यहां तक ​​कि अगर आप उनका इस्तेमाल करने का इरादा नहीं करते हैं, तो यह जानना बेहतर है कि उन्हें कैसे सुरक्षित तरीके से उपयोग करें और न चुनें, उनका उपयोग न करें क्योंकि आपको नहीं पता कि उन्हें सुरक्षित रूप से कैसे उपयोग करें यदि आप कभी ऐसी स्थिति में स्वयं को ढूंढते हैं जहां आपको पहले से मौजूद कोड बनाए रखने की ज़रूरत होती है जो वैश्विक चर पर निर्भर होती है, तो आपको परेशानी हो सकती है अगर आपको नहीं पता कि उन्हें कैसे ठीक से उपयोग करना है

छोटे कार्यक्रमों में वैश्विक चर ठीक हैं, लेकिन भयानक अगर बड़े लोगों में उसी तरीके से उपयोग किया जाता है

इसका मतलब यह है कि सीखने के दौरान आप उन्हें आसानी से इस्तेमाल करने की आदत में आसानी से प्राप्त कर सकते हैं। यही वह है जो आपके प्रोफेसर से आपको बचाने की कोशिश कर रहा है।

जब आप अधिक अनुभवी होते हैं, तो जब वे ठीक हो जाते हैं तब सीखना आसान होगा।

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

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

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

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

ध्यान दें कि इस तरह के विषयों को अक्सर कार्यस्थल में दलील दी जाती है और यह जारी रहेगा, क्योंकि कंपलर और प्रोसेसर (और भाषाओं) विकसित होते हैं, इसलिए इन प्रकार के नियम करते हैं और आपकी स्थिति की रक्षा के बिना और संभवत: दूसरे किसी राय से किसी के द्वारा आपको एक सबक सिखाया जा रहा है आगे बढ़ो।

मतलब समय में, जो कुछ भी ऊपरी बोलता है या सबसे बड़ी छड़ी कहता है (जो तक कि आप एक हैं जो सबसे ऊपरी चिल्लाते हैं और सबसे बड़ी छड़ी लेते हैं) तक करते हैं।

हां, क्योंकि यदि आप अक्षम प्रोग्रामर उन का इस्तेमाल करते हैं (90% विशेषकर वैज्ञानिकों को पढ़िए) आप 600+ ग्लोबल वेरिएबल 20+ फाइल्स में फैले हुए हैं और 12,000 लाइनों की एक प्रोजेक्ट जहां 80% फ़ंक्शंस शून्य, वापसी शून्य और संचालित करते हैं पूरी तरह से वैश्विक राज्य पर

यह समझना असंभव हो जाता है कि किसी एक बिंदु पर क्या हो रहा है जब तक आप पूरी परियोजना को नहीं जानते।

वैश्विक चर का उपयोग वास्तव में आवश्यकताओं पर निर्भर करता है इसका फायदा यह है कि, यह मूल्यों को बार-बार पारित करने के ओवरहेड को कम करता है

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

उदाहरण के लिए:-

स्थिति जब चर मूल्यों को क्रमशः पर संशोधित किया जा रहा है उस वक्त यह पहचानना मुश्किल है कि कोड का कौन सा भाग इसे संशोधित कर रहा है और किस स्थिति पर है

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

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

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

मैं ग्लोबल्स की वकालत नहीं कर रहा हूं, जैसा कि दूसरे बिंदु अभी भी खड़े हैं, मेरा मुद्दा केवल यह है कि किसी कार्यक्रम में थ्रेड्स की संख्या में चर का गुंजाइश नहीं है।

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

वैश्विक वैरिएबल नहीं होने के लिए यह वास्तव में बेहतर है सिर्फ बांध को लिखो और विधियों को निर्धारित करें, और जब आपको उन्हें एक दिन, सप्ताह या महीने बाद की आवश्यकता होती है, तो आपको ग्रंथि बनें।

मैं आमतौर पर उन मानों के लिए ग्लोबल का उपयोग करता हूं जो गतिशील रूप से लोड किए गए लाइब्रेरी में फ़ंक्शन के लिए सिंगलटन या फ़ंक्शन पॉइंटर्स की तरह ही बदलते हैं। मल्टीथ्रेडेड अनुप्रयोगों में अस्थिर गोलाओं का प्रयोग करने से बग को ट्रैक करना मुश्किल हो जाता है इसलिए मैं इसे सामान्य नियम के रूप में से बचने का प्रयास करता हूं।

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

दिन के अंत में, आपका प्रोग्राम या ऐप अब भी काम कर सकता है, लेकिन इसकी साफ-सफाई होने और इसके बारे में पूरी जानकारी रखने का एक मामला है। यदि आप सभी फ़ंक्शंस में एक वैरिएबल मूल्य साझा करते हैं, तो यह पता लगाना मुश्किल हो सकता है कि फंक्शन मूल्य को कैसे बदल रहा है (यदि फ़ंक्शन ऐसा करता है) और डीबगिंग को लाखों बार कठिन बना देता है

जब यह कॉन्फ़िगरेशन की बात आती है तो वैश्विक अच्छा होता है जब हम चाहते हैं कि हमारा कॉन्फ़िगरेशन / परिवर्तन पूरे प्रोजेक्ट पर वैश्विक प्रभाव डाल सके

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

सुरक्षा का मतलब कम है कि कोई भी वैरिएबल को हेरफेर कर सकता है यदि उन्हें वैश्विक घोषित किया जाता है, तो इस उदाहरण को समझने के लिए, यदि आपके बैंक प्रोग्राम में वैश्विक वैरिएबल के रूप में संतुलन है, तो उपयोगकर्ता फ़ंक्शन इस के साथ ही बैंक ऑफिसर को हेरफेर कर सकता है this so there is a problem .only user should be given the read only and withdraw function but the clerk of the bank can add the amount when the user personally gives the cash in the desk.this is the way it works

In web applications within an enterprize can be used for holding session/window/thread/user specific data on the server for reasons of optimization and to preserve against loss of work where connection are unstable. As mentioned, race conditions need to be handled. We use a single instance of a class for this information and it is carefully managed.

In a multi-threaded application, use local variables in place of global variables to avoid a race condition.

A race condition occurs when multiple thread access a shared resource, with at least one thread having a write access to the data. Then, the result of the program is not predictable, and depends on the order of accesses to the data by different threads.

More on this here, https://software.intel.com/en-us/articles/use-intel-parallel-inspector-to-find-race-conditions-in-openmp-based-multithreaded-code