ग्लोबल चर का उपयोग कब करना ठीक है


22

ठीक है, तो यह वास्तव में एक शैतान अधिवक्ता सवाल का एक सा है।

जब वैश्विक चर ठीक हैं, और यदि कभी नहीं, तो आप विकल्प के रूप में क्या उपयोग करेंगे?

इस सवाल का एक दिलचस्प पक्ष यह है कि, एक सार्वजनिक स्थैतिक वर्ग क्षेत्र वैश्विक से अलग कैसे है?


5
कोड पूरा , दूसरा संस्करण, .313.3।
जेरी कॉफिन

1
Multithreaded अनुप्रयोगों को बहुत अधिक वैश्विक चर की आवश्यकता होती है।
एक्वा


4
@aqua मल्टीथ्रेडेड एप्लिकेशन ऐसे हैं जहां वैश्विक चर सबसे अधिक हानिकारक हो सकते हैं। हर कोई जटिल लॉकिंग लॉजिक से नफरत करता है।
लूसीसुबल

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

जवाबों:


18

जहां तक ​​मुझे पता है, एक सार्वजनिक स्थैतिक क्षेत्र मूल रूप से एक वैश्विक दिया गया है कि इसे अपवाद के साथ कहीं से भी बुलाया जा सकता है कि यह नाम स्थान पर नहीं चढ़ता है।

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


2
मैं एक अपरिवर्तनीय क्षेत्र को स्थिर कहता हूँ ।
शाम

14

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


क्या आप इसके लिए एक शुद्ध वैश्विक या सार्वजनिक स्थैतिक / सिंगलटन का उपयोग करेंगे?
ओसोडो

1
@Slomojo: निश्चित रूप से एक सिंगलटन नहीं। स्थिति के आधार पर, या तो कॉन्फ़िगरेशन क्लास पर स्टैटिक्स, CONFIG_या CFG_उपसर्ग के साथ सादे ग्लोबल्स ।
आनन।

+1 जो एक बदलाव मैं सुझाऊंगा वह है "... त्रुटि-प्रवण इसे हर दूसरी कक्षा में हर दूसरे तरीके से पास करने के लिए"। अन्यथा मुझे लगता है कि जो भी कार्य करता है, उसके साथ कक्षा में भाग लिया जा सकता है - सिंगलटन मुझे लगता है।
माइकल ड्यूरेंट

8

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

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


8
मैं शायद सिंगलनेट्स से बचने का सुझाव दूंगा।
ओसोडो

मैं सुझाव नहीं दे रहा हूं कि सिंगलटन महान हैं, लेकिन मुझे अभी भी लगता है कि वे वैश्विक चर को बहुत हरा देते हैं।
द्रालो

निरंतर मूल्यों को केवल उस क्षेत्र / मॉड्यूल में पहुंच योग्य होना चाहिए जो वे प्रासंगिक हैं। एक निरंतर TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOPकेवल एक फ़ाइल / वर्ग / अनुभाग में प्रासंगिक है जहां 'यह विशेष लूप' दिखाई देता है।
Cthulhu

1
एक सिंगलटन के क्षेत्र हैं , वैश्विक चर तो मैं कैसे क्या कोई अंतर नहीं होता नहीं दिख रहा।
sleske

1
@ कथुलु ने मुझे खुद को उद्धृत किया: "उन स्थितियों में जब आपको वैश्विक पहुंच बिंदु के लिए कुछ चाहिए।"
atdralo

6

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

किसी चीज़ के एक और उदाहरण के लिए मैं इस तरह से महसूस करता हूं, रूबी में मिश्रणों के उपयोग को देखें।


ग्लोबल्स के इन उपयोगों के लिए आप किस उदाहरण का उपयोग करेंगे?
ओसोडो

1
@Slomojo: ग्लोबल्स का एक उदाहरण मुझे बुरा नहीं लगता है @ पर्ल और $ _ का पर्ल में उपयोग। एक उदाहरण जो मुझे बुरा लगता है वह है सबरूटीन को पास करने वाले सस्ते पैरामीटर के लिए ग्लोबल्स का उपयोग।
btilly

5

यह सभी नामस्थानों के बारे में है।

एक पल के लिए कल्पना कीजिए कि दुनिया में सभी का एक ही अंतिम नाम था। क्या झंझट है।

(भारत में, सिखों के सभी समान नाम हैं: सिंह - एक नज़र डालें)


6
यह प्रयोग किया जाता नामस्थान के बारे में सभी हो सकता है, लेकिन अब यह धागा सुरक्षा के बारे में है।
dan04

6
@ dan04 यह दूरी पर डरावना कार्रवाई के साथ एक घृणित डिजाइन नहीं होने के बारे में है।
टॉम हॉल्टिन -

2
@ टोम: शायद हम कह सकते हैं कि, जीभ-इन-गाल, "क्वांटम प्रोग्रामिंग"
क्रिस्टोफर महान

4

लघु संस्करण: जब यह कार्यक्रम के बारे में तर्क करना आसान बनाता है। आमतौर पर मामले कुछ प्रकार के वैश्विक राज्य या स्थिर संसाधन होते हैं जो व्यापक रूप से उपयोग किए जाते हैं।

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

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

आपके पास जितने अधिक ग्लोबल्स हैं, उन पर नज़र रखने के लिए उतना ही कठिन है। उन्हें कम और दूर के बीच होना चाहिए।


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

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

3

ग्लोबल्स और सिंगलटन के साथ दो गोटे टेस्टीबिलिटी और तैनाती हैं।

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

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

कुल मिलाकर, मुझे लगता है कि उन कारणों का मतलब है कि ग्लोबल्स और सिंगलटन केवल असाधारण रूप से उपयोग किए जाते हैं।


2

महत्वपूर्ण एम्बेडेड सिस्टम के विकास में आमतौर पर वैश्विक चर का उपयोग शामिल होता है।

स्टैक का आकार छोटा होता है, सब कुछ सांख्यिकीय रूप से आवंटित किया जाता है ( malloc()निषिद्ध है), वैश्विक चर लाइब्रेरी से बाहर से छिपे होते हैं जो वे संबंधित हैं।


0

एक भयानक VB6 कोड बेस में जो ग्लोबल्स का दुरुपयोग करता है जैसे कि कल नहीं है, मैं एक नया परिचय देने का दोषी हूं:

Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained

मुझे लगता है कि यह एक वैश्विक वस्तु के लिए कुछ वैध उपयोग मामलों में से एक है।

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