क्या वैश्विक चर खराब हैं? [बन्द है]


247

C / C ++ में, क्या वैश्विक वैरिएबल उतने ही बुरे हैं जितना कि मेरे प्रोफेसर सोचते हैं कि वे हैं?


17
मैं उस मामले में काटूँगा जब वह एक चुटकुला बताने की कोशिश कर रहा है ... "वे कितने बुरे हैं"?
ज़च स्क्रिपवेना

13
मुझे लगता है कि यह सवाल काफी दिलचस्प था! सॉफ्टवेयर विकास अभी भी शुरुआत से ही पुराने नुकसान का सामना कर रहा है और प्रोग्रामर अक्सर अभी भी नहीं जानते हैं कि वैश्विक चर, गोटो, लघु नाम चर का उपयोग करना समस्या नहीं है। बुरा कोड हर दिन उन्हें उपयोग किए बिना लिखा जाता है। +1
सिल्वेन रॉड्रिग

69
हम संभवतः कैसे उत्तर दे सकते हैं? उन्होंने हमें नहीं बताया कि उनके प्रोफेसर को कितना बुरा लगता है कि वे हैं। :)
स्टीव फालोअन्स

9
@ जुआन मेंडेस मैं 100% आपसे सहमत हूँ! मैं जिस समस्या के बारे में बात कर रहा था, वह यह है कि कई डेवलपर्स जानते हैं कि उन्हें वैश्विक चर का उपयोग नहीं करना चाहिए, लेकिन वे सिर्फ यह नहीं जानते हैं कि क्यों! और इस प्रकार मैंने कई बड़े सॉफ्टवेयर्स देखे हैं, जहाँ पर प्रत्येक फंक्शन में एक ही मेगा-स्ट्रक्चर मिला है जिसमें 100 फील्ड्स हैं- मॉम, नो मेज़र ट्रेबल्स! समान समस्या जिसे "अच्छी प्रथाएं" कहा जाता है: वे कुछ संदर्भों में अच्छी प्रथाएं हैं, सभी संदर्भों में नहीं। उनका उपयोग करना अस्वीकार्य कोड बना सकता है। चीयर्स।
सिल्वेन रोड्रिग

3
वैश्विक चरों के लिए बहुत कम उपयोग हैं। एक संभव, लेकिन डिबेटेबल उपयोग, एक वैश्विक "कॉन्फ़िगरेशन" ऑब्जेक्ट होगा, जो एक बार स्टार्टअप पर एक कॉन्फ़िगरेशन फ़ाइल में पढ़ता है।
Siler

जवाबों:


257

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

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

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


10
यह उत्तर वास्तव में अच्छा है। साथ 'चर गुंजाइश कम से कम' जवाब इस कम्बाइन stackoverflow.com/questions/357187/...
bobobobo

17
'ग्लोबल स्टेट' के लिए 'एप्लिकेशन' और 'ऑब्जेक्ट स्टेट' के लिए सब्स्टीट्यूट 'क्लास' और आप क्लास में मेंबर वेरिएबल्स (उर्फ फील्ड्स) का इस्तेमाल न करने के लिए बिल्कुल यही तर्क देते हैं। उपयुक्त होने पर वास्तविक उत्तर उनका उपयोग करते हैं।
इयान गोल्डबी

2
कुछ (शायद मूर्खतापूर्ण) प्रश्न: 1) यदि आप जानना चाहते हैं कि कौन से कार्य इन चरों को पढ़ते हैं और लिखते हैं, तो क्या आप संपादकों में "खोज" फ़ंक्शन का उपयोग उन मामलों को हाजिर करने के लिए नहीं कर सकते हैं जहाँ इन चरों में मूल्यों को संशोधित किया गया है? 2) "यह किया जा सकता है, ... समय की पूरी बर्बादी)।" क्या आप एक उदाहरण दे सकते हैं? 3) "यदि आप वैश्विक चर पर भरोसा नहीं करते हैं, तो ... आपको वैश्विक स्थिति को ध्यान में रखने की आवश्यकता नहीं है।" मुझे समझ नहीं आ रहा है कि यह एक फायदा कैसे है। शायद इसका एक उदाहरण मेरे लिए काम करेगा।
आंद्रेई

2
@bobobobo टूटा हुआ लिंक, क्या हम आपसे 10k + उपयोगकर्ता का स्क्रीनशॉट प्राप्त कर सकते हैं?
no --zɐɹƆ

3
@ no @zɥʇʎԀʎ यहाँ तुम जाओ! i.imgur.com/RwRgJLZ.jpg
मतीन उल्हाक

85

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

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

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

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

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


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

16
सही परिस्थितियों में ग्लोबल्स का सुझाव देना स्पष्ट और उच्च प्रदर्शन कोड के लिए एक नुस्खा है। "पासिंग" के लिए निरंतर स्टैक डायनेमिक मेमोरी आवंटन की आवश्यकता होती है, और यह ऐसी चीज़ के लिए मूर्खतापूर्ण होगा जो आने वाले सॉकेट डेटा के लिए वैश्विक बफर के रूप में वैश्विक होना चाहिए। उदाहरण के लिए, यदि आपके पास एक फ़ंक्शन है जो Winsock recv () को पढ़ता है, तो हर कॉल के भीतर लगातार इस बफर को क्यों बनाएं और डील करें? बफर को वैश्विक बनाएं। कई धागे वैसे भी इसे नहीं पढ़ रहे होंगे।
22

बस जिज्ञासु, वैश्विक चर से बचने के लिए क्या कार्यक्रम कोड के आकार को दोगुना कर देता है? मेरे अनुभव में, वैश्विक चर का उपयोग करने से डेटा एक्सपोज़र समस्याओं का समाधान हो सकता है, लेकिन आमतौर पर अतिरिक्त जटिल तर्क होते हैं, जिन्हें इन जादुई चर को ठीक से व्यवहार करने के लिए आपको जोड़ना होगा।
user2167582

3
यदि कोई व्यक्ति 100 चर के आसपास से गुजर रहा है, तो उन्होंने यह नहीं सीखा कि कोई वस्तु क्या है। इस ऑब्जेक्ट के संदर्भ का उपयोग करना तब एक पॉइंटर के आसपास सबसे खराब रूप से गुजर रहा है। मैं कहूंगा कि नियम केवल स्पष्टता नहीं है, लेकिन परीक्षणशीलता भी है - और गैर-वैश्विक झुकाव का उपयोग करके चीजों को परीक्षण करना बहुत आसान है।
UKMonkey

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

64

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


25
सच है। वे गोटो की तरह हैं, अगर आपको नहीं पता कि उनका उपयोग कब करना है तो कभी न करें।
डेविड होल्म

5
मेरी वर्तमान कंपनी में, वे staticवैश्विक चर का बहुत उपयोग करते हैं , भाषा सी है। अपेक्षाकृत छोटी अनुवाद इकाइयों में सीमित होने के कारण, वे सी ++ वस्तुओं के वर्ग चर के समान लगते हैं।
वोरैक

1
@Vorac स्थिर चर वैश्विक चर नहीं हैं, वे स्थानीय चर हैं। एक वैश्विक चर कार्यक्रम में हर जगह उपलब्ध एक चर है (इसलिए "वैश्विक", डुह)। फ़ाइल स्कोप वैरिएबल के साथ भ्रमित होने की नहीं , जो किसी भी फ़ंक्शन के बाहर घोषित किए गए वैरिएबल हैं। एक स्थिर फ़ाइल स्कोप वैरिएबल एक वैश्विक वैरिएबल नहीं है।
लुंडिन

1
अपने आप को सुधारने के लिए, program lifetime, file scope variables। और वे काफी वैश्विक हो जाते हैं जब आप बाहरी दुनिया के लिए चर के लिए एक पॉइंटर पास करते हैं (जो स्वचालित चर के साथ असंभव है) ..
वोरैक

@ लुंडिन मैं सहमत हूं, staticवैश्विक चर एक ही अनुवाद इकाई के लिए सीमित गुंजाइश है। लेकिन उनके पास कार्यक्रम के अंत तक किसी भी वैश्विक चर के रूप में जीवनकाल है।
akhilesh1988

38

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

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


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

10
+1 के लिए "डीबी कनेक्शन जैसी चीजें वैश्विक लगती हैं , लेकिन नहीं है।"
R .. गिटहब स्टॉप हेल्पिंग ICE

1
इंटरप्ट टेबल वैश्विक नहीं हैं, प्रति प्रोसेसर एक है - लेकिन प्रति प्रोसेसर आपके प्रोग्राम का एक उदाहरण भी है, इसलिए यह "रद्द" होता है।
user253751

1
क्या कोई मुझे बता सकता है कि डीबी कनेक्शन वैश्विक क्यों नहीं हैं (और क्या एक अच्छा विकल्प होगा)? मैंने हमेशा कनेक्शन को दुर्लभ मामलों में से एक माना जहां ग्लोबल्स स्वीकार्य थे।
15

33

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

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

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

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

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

वैश्विक चरों की कुछ समस्याएं जिनके चारों ओर काम करने की आवश्यकता है

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

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

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

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

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

C ++ namespaceऔर structC के लिए तकनीक का उपयोग करना

C ++ प्रोग्रामिंग लैंग्वेज के लिए namespaceनिर्देश एक नाम के टकराव की संभावना को कम करने में एक बड़ी मदद है। namespaceके साथ-साथ classऔर विभिन्न पहुँच कीवर्ड ( private, protected, और public) उपकरण आपको Encapsulate चर की जरूरत के सबसे प्रदान करते हैं। हालाँकि C प्रोग्रामिंग भाषा इस निर्देश को प्रदान नहीं करती है। यह स्टैकओवरफ़्लो पोस्टिंग, Namespaces in C , C के लिए कुछ तकनीक प्रदान करता है।

एक उपयोगी तकनीक एक एकल मेमोरी निवासी डेटा क्षेत्र है structजिसे वैश्विक दृश्यता के रूप में परिभाषित किया गया है और इसके भीतर structविभिन्न वैश्विक चर और कार्यों के संकेत हैं जिन्हें उजागर किया जा रहा है। वैश्विक चर की वास्तविक परिभाषाएँ staticकीवर्ड का उपयोग करके फ़ाइल गुंजाइश दी जाती हैं । यदि आप तब constकीवर्ड का उपयोग करते हैं जो केवल पढ़ने के लिए संकेत करते हैं, तो कंपाइलर आपको केवल पहुंच को पढ़ने के लिए लागू करने में मदद कर सकता है।

structतकनीक का उपयोग करना भी वैश्विक को घेर सकता है ताकि यह एक प्रकार का पैकेज या घटक बन जाए जो कि वैश्विक हो। इस तरह का एक घटक होने से वैश्विक और वैश्विक उपयोग की कार्यक्षमता को प्रभावित करने वाले परिवर्तनों को प्रबंधित करना आसान हो जाता है।

हालांकि, जबकि namespaceया structतकनीक नाम संघर्ष प्रबंधन में मदद कर सकते हैं, अंतर-घटक युग्मन की अंतर्निहित समस्याओं जो विशेष रूप से एक आधुनिक बहु लड़ी आवेदन में वैश्विक प्रस्तुत किया जाने का उपयोग करते हैं, अभी भी मौजूद हैं।


यह सबसे अच्छा छूटने वाला हाथ है, जो कुछ भी है उसे बताता है। कुडोस!
जॉन्डेवोडका

आपकी भाषा में बहुत अधिक वर्ग युग्मन का उपयोग करने से रोकने के लिए एक कोड नियम होना चाहिए।
मेलबर्न डेवलपर

19

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

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


19

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

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

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

यार, मैं शर्त लगाता हूं कि वे डेवलपर्स चाह रहे हैं कि वे वैश्विक चर का उपयोग न करें!


6
थोड़ी ही देर में मुझे सबसे अच्छी हंसी आई। लाभ के लिए बंद स्रोत विकास क्यों खराब है, और वैश्विक रूपांतरों का एक अच्छा उदाहरण गलत हो गया है, इसका एक सच्चा उदाहरण!
ईविल स्पोर्क

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

19

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

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

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

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

न तो गोटोस हैं, अगर आप उन्हें सही उपयोग करते हैं।

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


17
एक भ्रमित छात्र को ग्लोबल्स का उपयोग करने की समस्याओं को कम करना एक अच्छा विचार आईएमओ नहीं है।
जियोचैट

3
डिजाइन दर्शन उद्देश्य नहीं है। कम से कम नहीं। सिर्फ इसलिए कि अधिकांश प्रोग्रामर को कुछ पसंद नहीं है, इसका मतलब यह नहीं है कि किसी को कभी भी उस चीज पर गौर नहीं करना चाहिए। दुनिया को समाप्त किए बिना ग्लोबल्स का सामान्य उपयोग करना आसान है। उसे करने दो, संघर्ष करो (उसे जानकर), और सीखो कि कैसे।
user54650

7
धनी सही है। यह उत्तर इस बारे में कुछ नहीं कहता है कि क्या / बुरा नहीं है (या ग्लोबल्स को कैसे सुरक्षित रूप से इस्तेमाल किया जा सकता है), केवल यह कि "वे सभी के रूप में उतना बुरा नहीं हैं। इस तरह, यह केवल समस्याओं को कम करता है।
जल्फ

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

@gariepy जब तक मुझे पता है कि बात स्टैटिक्स के बारे में है: डी ठीक है तो यह है कि ... और मेरे ऐप में केवल एक या दो वैश्विक चर हैं, यह एक विजुअल स्टूडियो, डेबग और ट्रिक के साथ आता है जिसका हम सामान्य रूप से उपयोग नहीं करते हैं: डी
मृतमन

17

मैं इस प्रश्न का उत्तर एक और प्रश्न के साथ दूंगा: क्या आप सिंगलटन का उपयोग करते हैं / क्या सिंगेलटन खराब हैं?

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


11
मैं यह कहते हुए एक स्मार्ट टिप्पणी पोस्ट करने वाला था, "वे केवल बुरे हैं यदि आप उन्हें एकल के बजाय ग्लोबल्स कहते हैं", लेकिन आपने मुझे इसे हराया।
एसएमओ

मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि नरक के एकल गीत एलओएल क्या हैं।
ज्योफ्री

1
@Geoffrey: यहाँ कुछ अच्छे SO विवरण दिए गए हैं - stackoverflow.com/questions/11831/… और कुछ अच्छे लिंक के लिए: stackoverflow.com/questions/11831/…
Gavin Miller

10
रिकॉर्ड के लिए, एक सिंगलटन एक वैरिएबल डिज़ाइन पैटर्न (tm) (lol) नाम के साथ एक वैश्विक वैरिएबल है जो इसे ध्वनि को वैध बनाता है। यह सभी समान कारणों से समान रूप से खराब है।
R .. गिटहब स्टॉप हेल्पिंग ICE

@GavinMiller अगर आप सिम्पटन ... ऊप्स, सिंगलटन व्यंजना का उपयोग करते हैं तो यह ठीक है?
जुआन मेंडेस

14

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

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

  • किसी भी फ़ंक्शन से पहुँचा जा सकता है।
  • कई थ्रेड से पहुँचा जा सकता है।
  • जब तक कार्यक्रम समाप्त नहीं होगा, तब तक दायरे से बाहर नहीं जाएंगे।

कुछ विपक्ष:

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

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

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

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

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

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


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


1
व्यावहारिकता के लिए +1। एक सिंगलटन अक्सर सदस्यों में इंस्टेंस और रिफ्लेक्टर बनाने के लिए बॉयलरप्लेट जोड़ता है, और आप के साथ समाप्त होता है ... वैश्विक चर, बस एक अलग नाम के तहत चिनाई। क्यों परेशान, अन्य मात्र तकनीकी पर पाप के ग्लोबल्स से बचने के लिए? Namespaces एक बाधा के रूप में अच्छे हैं, लेकिन मुझे एक सरल g_module_varNameStyleपूरी तरह से सुपाठ्य लगता है । स्पष्ट होने के लिए, मैं ग्लोबल्स का उपयोग नहीं कर रहा हूं अगर मैं इसे आसानी से बचा सकता हूं - कुंजी शब्द आसानी से , क्योंकि जब से मैंने विश्वास करना बंद कर दिया है, तो उन्हें बचा जाना चाहिए - या बल्कि मोटे तौर पर - हर कीमत पर, मैं बहुत बेहतर समय पा रहा हूं, और मेरा कोड है (सदमा!) दूर का चित्र
अंडरस्कोर_ड

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

1
"किसी भी फ़ंक्शन के लिए ... स्पष्ट रूप से दस्तावेज़ जो चर" - यह एक सकर्मक संबंध है याद रखें। यदि फ़ंक्शन ए कॉल बी और सी का कार्य करता है, तो यह दोनों द्वारा लिखे गए चर को पढ़ता है और लिखता है (प्लस सीधे शरीर में)
कैलथ

11

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

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

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


1
मैं मानता हूं, यदि आप परिणाम को समझते हैं, तो नियम तोड़ना ठीक है, लेकिन यदि आप खुद को अक्सर ऐसा करते हुए पकड़ लेते हैं, तो आप कुछ गलत कर रहे हैं
जुआन मेंडेस

9

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

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


9

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


आलसी रूपक संदर्भ से रहित! = उत्तर
अंडरस्कोर_ड

1
@underscore_d: मैं असहमत हूं। यह एक चर्चा का प्रश्न है, भले ही इसे इस तरह (शायद इसकी उम्र के कारण) टैग नहीं किया गया है, और इसलिए इस तरह के उत्तर पूरी तरह से मान्य हैं, और यह एक बिंदु बनाता है जो ओप्स प्रश्न को संबोधित करता है।
गार्गी

7

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


7

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

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


7

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

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


3
-1 वैश्विक चरों के प्रति सावधानी बरतने के कई कारण हैं: मेरे लिए सबसे बड़ी बात यह है कि छिपी हुई निर्भरता और किसी भी अनुमानित फैशन में वैश्विक परीक्षण कोड को बेहद कठिन बना देता है। जब तक आप अपने कोड को स्वचालित तरीके से जांचने की क्षमता को महत्व नहीं देते, मैं सुझाव देता हूं कि वैश्विक चर आपको दर्द के अलावा कुछ नहीं देंगे। और इसके अलावा, एक अच्छी तरह से संरचित कार्यक्रम में हमेशा विकल्प होते हैं
jkp

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

1
बिल्कुल सही। वे बहुत "बुरे" नहीं हैं क्योंकि वे मूल रूप से "आसानी से टूटने योग्य" हैं। यदि आप जानते हैं कि किसी भी चीज को तोड़ने के बिना उनका उपयोग कैसे करना है, और विकल्प के बजाय उनका उपयोग कब करना है, तो वे सहायक हो सकते हैं। नहीं तो ... इतना नहीं।
जस्टिन टाइम -

4

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

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

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


4

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

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

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

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

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

इस बीच में, फिर बस वही करें जो सबसे ज़ोर से बोलता है या सबसे बड़ी छड़ी को उठाता है (जब तक कि आप सबसे ज़ोर से चिल्लाते हैं और सबसे बड़ी छड़ी ले जाते हैं)।


4
क्या यह कहने का एक और तरीका है "आईबीएम खरीदने के लिए कभी किसी को निकाल नहीं दिया गया"?
गॉर्डन पॉटर

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

4

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

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

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

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


3

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

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


2

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

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

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

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


2

जब विन्यास की बात आती है तो वैश्विक अच्छे हैं । हम अपने चाहते हैं विन्यास / बदल जाता है एक के लिए वैश्विक प्रभाव पर पूरी परियोजना

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


1

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

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


1

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

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


1

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


1

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


0

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


-1

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

एक दौड़ की स्थिति तब होती है जब कई थ्रेड साझा संसाधन तक पहुंचते हैं, जिसमें कम से कम एक थ्रेड होता है जिसमें डेटा तक पहुंच होती है। फिर, कार्यक्रम का परिणाम अनुमानित नहीं है, और विभिन्न थ्रेड्स द्वारा डेटा तक पहुंच के आदेश पर निर्भर करता है।

इस पर अधिक यहाँ, https://software.intel.com/en-us/articles/use-intel-parallel-inspector-to-find-race-conditions-in-openmp-based-multithreaded --code


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