प्रोग्रामर ने वैरिएबल स्कोप से पहले क्या किया, जहां सब कुछ ग्लोबल है?


40

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

वैसे मैं यहाँ हूँ। मैं यह पता लगाने की कोशिश कर रहा हूं कि कई खुले तरीकों में वैश्विक चर के अलावा और कुछ भी कैसे प्रबंधित करें । हां, यहां तक ​​कि forलूप्स के लिए पुनरावृत्तियों को वैश्विक रूप से परिभाषित किया जाना है, जिसे मैं अपने कोड के विभिन्न हिस्सों में खुद को पुनर्चक्रित करता हूं।

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


71
उन्होंने बहुत प्रार्थना की।
रॉबर्ट हार्वे

15
मैं बहुत सारे पागल चर नामों की कल्पना कर सकता हूं, जो गुंजाइश - bob_dog_fur_colourआदि ... समान नामों को मारने की संभावना को कम करने और कम करने के लिए हैं।
लैटीन

12
उन्होंने ऐसे कार्यक्रम लिखे जो छोटे दायरे में थे, और उनमें बहुत सारे कीड़े थे।
चार्ल्स ई। ग्रांट

12
@ लेटवेयर, वास्तव में बड़े दिनों में वापस आप बहुत सीमित थे कि आप अपने वर्णनात्मक नाम कैसे बना सकते हैं। कुछ भाषाओं ने केवल 1 या 2 वर्ण चर नामों की अनुमति दी है, अन्य ने आपको 8 के रूप में अनुमति दी है। यह चूसा है, लेकिन हम यह नहीं जानते थे कि यह तब तक कितना चूसा था। इसने संकलक को सीमित मात्रा में स्मृति में निचोड़ने दिया।
चार्ल्स ई। ग्रांट

17
उन्होंने बेहतर प्रोग्रामिंग भाषाओं का आविष्कार किया ...
wim

जवाबों:


44

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

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

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

मैंने लंबे पहचानकर्ताओं के साथ चीजों को पहले देखा है, लेकिन जिनके पहचानकर्ता पहले 8 पात्रों में केवल अद्वितीय थे। तो तुम RonnyRayGun और RonnyRayBlaster हो सकता है और वे वास्तव में एक ही चर रहे हैं। ऐसे मामलों में मैं चर नामों को 'अद्वितीय' सीमा के तहत रखने की सलाह देता हूं ताकि आप गलती से टकराएं।


4
+1: असेंबली लिखते समय मैं आमतौर पर कुछ इसी समस्याओं का सामना करता हूं कि अगर मैं रजिस्टरों का नाम दूं, तो नाम वैश्विक हैं (मुझे अतिरिक्त समस्या का सामना करना पड़ता है, भले ही मैं अधिक नाम बनाऊं, मुझे अधिक रजिस्टर नहीं मिलते हैं, लेकिन यह है कि यहाँ प्रासंगिक नहीं है)। अस्थायी मूल्यों के लिए समर्पित कुछ रजिस्टर होने से वास्तव में बनाए गए चर की संख्या को कम रखने में मदद मिलती है जिससे आपके सिर में सब कुछ रखना आसान हो जाता है। प्रत्येक फ़ंक्शन का उपयोग करने वाले वेरिएबल्स का दस्तावेज़ीकरण (सबसे महत्वपूर्ण है जिसे वह संशोधित करेगा) वैश्विक चित्र को सही होने में मदद करता है।
सिंह

53

डेटा शब्दकोश।

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

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

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


मैं इसके साथ एक बहुत ही समान स्थिति में हूं, एक "डेटाबेस" प्रबंधक के रूप में अधिक है जहां भाषा सीधे डेटाबेस के साथ इंटरफेस करती है, साथ ही कुछ प्रोग्रामिंग जैसे कार्यक्षमता। यह बहुत मददगार है
चाड हैरिसन

1
यह मुझे याद दिलाता है कि जब मैं BASIC सीख रहा था और चर दो अक्षरों से अधिक लंबे समय तक नाम नहीं रख सकते थे, और एक बड़े कार्यक्रम में उनमें से एक को ध्यान में रखते हुए ...
केविन रुबिन

@KevinRubin, मुझे याद न दिलाएं। आह दर्द महसूस होता है, जैसा कि बिल क्लिंटन कहते थे ...
जॉन आर। स्ट्रॉहम

8

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

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


कितनी पीछे की बात कर रहे हैं। मैंने 80 के दशक से व्यक्तिगत रूप से एक युगल मिनीकंप्यूटर देखा है जिसमें 60K लेबल से अधिक की 'डेटापुल' (यानी एक वैश्विक चर लिस्टिंग) थी।
इवान प्लाइस

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

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

एकल-स्कोप प्रोग्रामिंग के साथ समस्याओं को काफी पहले ही पहचान लिया गया था, जब कंप्यूटर में कई मेगाबाइट मेमोरी थी। ALGOL, लेक्सिकल स्कोप वाली पहली भाषा, 1958 में प्रदर्शित हुई।
केविन क्लाइन

4

मेरा गश, वह कई साल पहले का है (बुदबुदाई यादें :))।

मुझे नहीं पता कि आप जिस भाषा का उल्लेख करते हैं, लेकिन सामान्य तौर पर हमने जो हमारे पास था, उसे अपना लिया। यह वास्तव में एक बहुत बड़ा मुद्दा नहीं था। आपको उन नामों पर अधिक ध्यान देने की आवश्यकता है जो अक्सर निहित होते थे (संक्षिप्त रूप में, उन दिनों बाइट्स की संख्या कीमती थी) उप या फ़ंक्शन का संदर्भ, जैसे mIORead1कि यदि आपके पास फ़ाइल 1 से डेटा पढ़ने के लिए हैंडलर था, या आपके पास विभिन्न थे काउंटर वेरिएंट जैसे i, j, k आदि जो आपके खुद के सिस्टम द्वारा आप जानते हैं कि वे क्या थे, अगर उन्हें दोबारा इस्तेमाल किया जा सकता है। यह अधिक कट्टर था (फिर कोई हेलमेट या दस्ताने नहीं) :-)


3

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

मैंने पाया है, यदि आप ऐसा करने जा रहे हैं, तो आपको एक संरचित नामकरण सम्मेलन का उपयोग करने की आवश्यकता है। उदाहरण के लिए: Motor1_DriveContactor_Run। यदि आपकी भाषा संरचनाओं का समर्थन करने के लिए होती है (कभी-कभी उपयोगकर्ता-परिभाषित प्रकारों के रूप में जाना जाता है) तो आप एक संरचित डेटा पदानुक्रम बनाने के लिए भी उनका उपयोग कर सकते हैं, जैसे Motor[1].DriveContactor.Run:।

यह सब कुछ व्यवस्थित रखता है, और आम तौर पर आप के साथ मदद करने के लिए अंतर्मुखी पर्याप्त सभ्य है।


2

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

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

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

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

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


मैंने Macromedia Authorware, @ amy-blankenship के साथ भी काम किया। मुझे याद नहीं है कि जब मैंने आखिरी बार इसके साथ काम किया था, तो यह 3. शायद यह फ्लैश / शोक्वेव द्वारा प्रतिस्थापित किया गया था या अभी भी मौजूद है?
ट्यूलेंस कोरडोवा

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

1

जब मैं विश्वविद्यालय में था, तब हमें "द ग्लोबल वैरिएबल प्रॉब्लम" के बारे में लंबाई में पढ़ाया गया था - बहुत सारे ग्लोबल वैरिएबल्स की वजह से बग्स और कोड मेंटेनेंस समस्याओं का संग्रह।

कुछ चर दूसरों की तुलना में अधिक खतरनाक हैं।

सुरक्षित : चर, जो अंतिम-नाम जैसे प्रवाह-नियंत्रण को प्रभावित नहीं करते हैं

खतरनाक : कोई भी चर जो प्रोग्राम के प्रवाह-नियंत्रण को प्रभावित करता है जैसे डिलीवरीस्टैटस

सबसे खतरनाक पहला:

  • यौगिक स्थिति (मोड और उप-मोड)
  • यौगिक मूल्य (कुल, उप-कुल)
  • एकल स्थिति (मोड)
  • एकल मान (गणना)

"वैश्विक परिवर्तनशील समस्या" से बचने के लिए आपको आवश्यकता है

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

करने के लिए अपने कोड संरचना , जब कोई संरचना भाषा, उपयोग टिप्पणियों और नामकरण रिवाजों का में उपलब्ध है:

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

पता नहीं उन्होंने कैसे किया।

लेकिन मुझे लगता है कि आधुनिक ओओपी भाषाओं में नामकरण टकराव के बारे में एक समान समस्या थी ।

समाधान नाम स्थान को अपना रहा है । यह एक अमूर्त अवधारणा है, लेकिन व्यापक रूप से कई कार्यान्वयन (जावा पैकेज, .NET नेमस्पेस, पायथन मॉड्यूल) द्वारा अपनाई गई है।

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

तो चर नाम भी चर क्षेत्र का प्रतिनिधित्व करता है।

इस तरह की एक नामकरण पैटर्न को परिभाषित करने का प्रयास करें: order_detail_product_code, order_detail_product_unit_price। या अस्थायी काउंटर या स्वैप के लिए: tmp_i, tmp_swap


0

भाषाओं में सभी चर वैश्विक थे (मैंने एक जोड़े का उपयोग किया है) हम एक चर नामकरण सम्मेलन का उपयोग करते थे। उदाहरण के लिए: यदि मैं वास्तव में वैरिएबल का उपयोग करना चाहता था तो वैश्विक रूप से मैं "m_" या "_" उपसर्ग का उपयोग कर सकता हूं। बेशक यह अभी भी डेवलपर्स पर निर्भर करता है कि यह अनुशासन हो

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