क्या एकल-चरित्र वाले लगातार शाब्दिकों से बेहतर हैं?


127

मैंने हाल ही में एक वर्ग का सामना किया जो एक निरंतर के रूप में हर एक चरित्र को बहुत अधिक प्रदान करता है; से सब कुछ COMMAकरने के लिए BRACKET_OPEN। आश्चर्य है कि क्या यह आवश्यक था; मैंने एक "लेख" पढ़ा, जो बताता है कि यह एकल-चरित्र शाब्दिकों को स्थिरांक में खींचने में सहायक हो सकता है। इसलिए, मुझे संदेह है।

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

शाब्दिक के बजाय स्थिरांक का उपयोग करने का एकमात्र कारण मैं कोड को अधिक पठनीय बनाना चाहता हूं। लेकिन city + CharacterClass.COMMA + state(उदाहरण के लिए) वास्तव में से अधिक पठनीय है city + ',' + state?

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


12
बहुत संबंधित: programmers.stackexchange.com/questions/221034/…
Blrfl

33
हम्म ... यह विभिन्न स्थानों के लिए उपयोगी हो सकता है, हो सकता है? उदाहरण के लिए, कुछ भाषाओं guillements (कोण उद्धरण, का उपयोग «और »उद्धरण के बजाय अंक अंग्रेजी के मानक के रूप में) "(या अच्छे दिखने और )। इसके अलावा, यह सिर्फ जादू के पात्रों के एक सेट की तरह लगता है। के दो उदाहरणों मान लिया जाये कि CharacterClassकहा जाता है englishCharsऔर frenchChars, यह संभव है कि englishChars.LEFT_QUOTEहो सकता है , जबकि frenchChars.LEFT_QUOTEहो सकता है «
जस्टिन टाइम

4
अल्पविराम पर कई अलग-अलग प्रकार हैं: en.wikipedia.org/wiki/Comma#Comma_variants - शायद यह ऐसा गूंगा विचार नहीं है, खासकर यदि आपके स्रोत कोड को utf-8 के रूप में एन्कोड किया जा सकता है।
आरोन हॉल

21
आपके मामले में, यह एक चर "नंबर" को कॉल करने जैसा है। आपके स्थिरांक को DELIMITER कहा जाना चाहिए था। या यह CITY_STATE = "{0}, {1}" होना चाहिए
the_lotus

13
आपके द्वारा जोड़ा गया वह लेख बहुत ही भयानक है। स्थिरांक को कभी भी इस तरह बाल्टी में नहीं फेंकना चाहिए । उन्हें उन वर्गों पर रखें जहां उनका संदर्भ है: संक्षेप में, निरंतर के साथ वर्ग वह संदर्भ प्रदान करता है जिसमें निरंतर का उपयोग किया जाता है। उदाहरण के लिए, जावा का File.separator। वर्ग आपको विभाजक का प्रकार बताता है। एक वर्ग का नाम Constsया Constantsकोई संदर्भ नहीं देता है और स्थिरांक को सही ढंग से उपयोग करना कठिन बनाता है।

जवाबों:


184

टॉटोलॉजी :

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

सामान्य ज्ञान आपको बताता है कि आपके सिस्टम में रखरखाव और जटिलता के अलावा कुछ भी नहीं है const char UPPER_CASE_A = 'A';या const char A = 'A'नहीं। const char STATUS_CODE.ARRIVED = 'A'एक अलग मामला है।

स्थिरांक उन चीजों का प्रतिनिधित्व करने वाले हैं जो रनटाइम में अपरिवर्तनीय हैं, लेकिन संकलन समय पर भविष्य में संशोधित करने की आवश्यकता हो सकती है। कब const char A =सही रूप से के अलावा कुछ भी समान होगा A?

यदि आप public static final char COLON = ':'जावा कोड में देखते हैं , तो खोजें कि किसने लिखा है और उनके कीबोर्ड को तोड़ दें। यदि आपके द्वारा COLONकभी भी परिवर्तन के लिए प्रतिनिधित्व :एक रखरखाव दुःस्वप्न होगा।

कहानियो:

क्या होता है जब कोई इसे बदलता है COLON = '-'क्योंकि जहां वे इसका उपयोग कर रहे हैं उन्हें -हर जगह इसके बजाय जरूरत है? क्या आप इकाई परीक्षण लिखने जा रहे हैं जो मूल रूप assertThat(':' == COLON)से हर एक constसंदर्भ के लिए कहते हैं कि वे बदल नहीं जाते हैं? केवल किसी के पास परीक्षण को ठीक करने के लिए जब वे उन्हें बदलते हैं?

यदि कोई वास्तव में यह तर्क देता है कि public static final String EMPTY_STRING = "";उपयोगी और लाभदायक है, तो आप सिर्फ उनके ज्ञान को योग्य बनाते हैं और उन्हें बाकी सब चीजों पर सुरक्षित रूप से अनदेखा करते हैं।

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

सामंजस्य:

यह कृत्रिम रूप से सामंजस्य को भी कम करता है, क्योंकि यह चीजों को उन चीजों से दूर ले जाता है जो उनका उपयोग करते हैं और उनसे संबंधित हैं।

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

युग्मन:

यह बहुत से असंबंधित वर्गों को एक साथ जोड़े भी है क्योंकि वे सभी संदर्भित फ़ाइलों को समाप्त करते हैं जो वास्तव में वे क्या करते हैं, इससे संबंधित नहीं हैं।

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

यदि आप एक का उपयोग किया है बेहतर नाम की तरह DELIMITER = ','आप अभी भी क्योंकि नाम सामान्य है और कोई अर्थ वहन करती है, एक ही समस्या के लिए होगा। मान को पुन: असाइन करना शाब्दिक के लिए खोज और प्रतिस्थापन की तुलना में प्रभाव विश्लेषण करने में मदद करने के लिए और अधिक नहीं है ','। क्योंकि कुछ कोड क्या इसका उपयोग करता है और उसे ,और कुछ अन्य कोड का उपयोग करने की आवश्यकता होती है, लेकिन ;अब आवश्यकता है? अभी भी मैन्युअल रूप से हर उपयोग को देखना होगा और उन्हें बदलना होगा।

जंगल में:

मैंने हाल ही में एक 1,000,000+ LOCएप्लीकेशन को रिफ्लेक्ट किया जो 18 साल की थी। जैसी बातें थीं public static final COMMA = SPACE + "," + SPACE;। यह किसी भी तरह से बेहतर नहीं है, " , "जहां इसकी जरूरत है।

यदि आप पठनीयता पर बहस करना चाहते हैं, तो आपको अपने IDE को whitespaceउन वर्णों को प्रदर्शित करने के लिए कॉन्फ़िगर करने की आवश्यकता है, जहाँ आप उन्हें या जो कुछ भी देख सकते हैं, वह सिस्टम में एन्ट्रापी शुरू करने का सिर्फ एक बहुत ही आलसी कारण है।

इसने कई संकुल और कक्षाओं में ,शब्द के कई गलत वर्तनी के साथ कई बार परिभाषित किया था COMMA। कोड में एक साथ intermixed सभी विविधताओं के संदर्भ में। यह पूरी तरह से असंबंधित कुछ को तोड़ने के बिना कुछ को ठीक करने और ठीक करने के लिए किसी बुरे सपने से कम नहीं था ।

वर्णमाला के साथ एक ही, एक से अधिक थे UPPER_CASE_A, A, UPPER_A, A_UPPERकि समय के सबसे अधिक के बराबर थे A लेकिन कुछ मामलों में नहीं थे । लगभग हर किरदार के लिए, लेकिन सभी किरदार नहीं।

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

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

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


112
हो सकता है कि आपको एक प्रतिरूप जोड़ना चाहिए: const char DELIMITER = ':'वास्तव में उपयोगी होगा।
बर्गी जूल

115
मैं कई तर्क दूंगा जो EMPTY_STRINGफायदेमंद है। (1) मैं बहुत आसानी से EMPTY_STRINGएक फ़ाइल के सभी उपयोग पा सकता हूं जितना कि मैं सभी उपयोगों को पा सकता हूं ""। (2) जब मैं देखता EMPTY_STRINGहूं कि मुझे पता है कि डेवलपर को यह सुनिश्चित करना है कि स्ट्रिंग खाली है, और यह गलत मिस या स्ट्रिंग के लिए प्लेसहोल्डर नहीं है जिसे बाद में आपूर्ति की जाएगी। अब, आप दावा करते हैं कि मेरे द्वारा यह तर्क देने से कि आप मेरे ज्ञान को प्राप्त कर सकते हैं, और मुझे हमेशा के लिए अनदेखा कर सकते हैं। तो, आप मेरे ज्ञान को कैसे योग्य बनाते हैं? और क्या आप मेरी सलाह को हमेशा के लिए अनदेखा करने की योजना बना रहे हैं? मेरे पास कोई रास्ता नहीं है।
एरिक लिपर्ट

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

15
@EricLippert: मैं यहाँ दूसरों की बात देख रहा हूँ, जो इस बात की ओर इशारा करते हैं कि केवल एक ही गारंटी है कि एक constप्रदान करता है कि यह रनटाइम (संकलन के बाद) में नहीं बदलेगा, हालाँकि मैं आपसे सहमत हूँ कि अर्थ का अर्थ constहै एक परिवर्तन प्रबंधन उपकरण के रूप में इसके उपयोग से कहीं अधिक महत्वपूर्ण है। उस ने कहा, मैं निश्चित रूप से कल्पना कर सकता हूं const EARLIEST_OS_SUPPORTEDजो न केवल शब्दार्थ के अनुरूप है, बल्कि समय के साथ बदल भी जाएगा क्योंकि कार्यक्रम विकसित होता है और पुराने cruft को हटा दिया जाता है।
रॉबर्ट हार्वे

16
@DanielJour: तो यह तब के लिए एक तीसरा तर्क है EMPTY_STRING; यह एक अच्छी तरह से डिज़ाइन किया गया IDE उपकरण होगा जो मुझे इस इकाई को प्रतीकात्मक रूप से, बजाय सिंटैक्टिक रूप से व्यवहार करने की अनुमति देगा। इसे चौथे तर्क में सामान्यीकृत करें: कि कोड विश्लेषण उपकरणों का पुस्तकालय जो IDE के नीचे बैठता है , प्रतीकात्मक स्तर पर कोड शुद्धता के उन्नत प्रोग्रामेटिक विश्लेषण की अनुमति दे सकता है । एक डेवलपर जो 40 साल पहले लिखे गए उन उपकरणों की तुलना में अधिक उन्नत है, जो उन्नत टूलींग के पुरस्कारों को वापस पाने के लिए केवल अपनी आदतों में छोटे बदलाव करने की आवश्यकता है।
एरिक लिपर्ट

145

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

बिलकुल नहीं। स्थिरांक का उपयोग करने के लिए यह बिल्कुल भी कारण नहीं है क्योंकि स्थिरांक परिभाषा से नहीं बदलते हैं । अगर कोई स्थिरांक कभी बदलता है तो वह स्थिरांक नहीं था, क्या यह था?

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

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

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


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

50
निष्पक्ष होने के लिए, एक स्थिरांक की बात यह है कि यह आरंभीकृत होने के बाद रनटाइम के दौरान नहीं बदलता है, न कि यह संकलनों के बीच नहीं बदलता है। एक संकलक के दृष्टिकोण से, बिंदु यह है कि संकलक यह अनुमान लगा सकता है कि कार्यक्रम इसे संशोधित करने में असमर्थ है; क्या प्रोग्रामर को इसे संशोधित करने की अनुमति है, जब वे recompile अपने निरंतर-नेस को नहीं बदलते हैं। ऐसे मामले भी हो सकते हैं जहां सॉफ़्टवेयर हार्डवेयर से रीड-ओनली वैल्यू लेता है, हो सकता है कि const volatile T*एक पूर्व निर्धारित पते पर एक पॉइंटर को डीफेरफ्रेंस करके ; जबकि प्रोग्राम इसे बदल नहीं सकता है, हार्डवेयर कर सकता है।
जस्टिन टाइम

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

7
@SteveCox: मैं सहमत हूं; जिस तरह से C / C ++ "कॉन्स्ट" की विशेषता अजीब और सीमित उपयोग है। मैं जिस संपत्ति में स्थिरांक चाहता हूं, वह यह है कि उनके मूल्य नहीं बदलते हैं, यह नहीं कि मैं उन्हें कुछ कार्यों में नहीं बल्कि दूसरों में बदलने से प्रतिबंधित करता हूं।
एरिक लिपर्ट

15
"यह स्थिरांक का उपयोग करने के लिए बिल्कुल भी कारण नहीं है क्योंकि स्थिरांक परिभाषा से नहीं बदलते हैं। यदि कोई निरंतर बदलता है तो यह एक स्थिर नहीं था, क्या यह था?" लगातार समय पर स्थिरांक (स्पष्ट रूप से रनटाइम नहीं) पूरी तरह से सामान्य है। यही कारण है कि आपने उन्हें पहली जगह में स्पष्ट रूप से लेबल वाली "चीज" बना दिया है। बेशक, ओपी के कॉन्स्टेंट कबाड़ हैं, लेकिन कुछ const VERSION='3.1.2'या जैसे कुछ const KEYSIZE=1024भी सोचते हैं ।
एओई

61

नहीं, वह गूंगा है।

क्या है नहीं जरूरी गूंगा स्थानीयकरण कारणों के लिए नामित किया गया लेबल में है कि तरह बातें खींच है। उदाहरण के लिए, हजारों सीमांकक है अमेरिका (1,000,000) में एक अल्पविराम, लेकिन नहीं अन्य स्थानों में एक अल्पविराम। एक नामित लेबल में खींचकर (एक उपयुक्त, गैर-अल्पविराम नाम के साथ) प्रोग्रामर को उन विवरणों को अनदेखा / सार करने की अनुमति देता है।

लेकिन एक निरंतरता बनाना क्योंकि "जादू के तार खराब हैं" सिर्फ कार्गो खेती है।


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

19
वास्तव में हजारों सीमांकक अन्य स्थानों (चीन / जापान) में आवश्यक रूप से हजारों परिसीमन नहीं हैं। यह लगातार अंकों (भारत) की संख्या के बाद भी सेट नहीं है। ओह, और अगर यह एक 1000 सीमांकक या 1000000 सीमांकक (मैक्सिको) के आधार पर अलग-अलग परिसीमन हो सकता है। लेकिन यह कुछ स्थानों (फारसी) में ASCII अंक 0-9 का उपयोग नहीं करने से कम समस्या है। ux.stackexchange.com/questions/23667/…
पीटर

1
@Vlad स्थानीयकरण उससे कहीं अधिक जटिल है, हालांकि, हजारों विभाजक एक प्रसिद्ध उदाहरण है जिसे लोग पहचानते हैं।

यह स्थानीयकरण की रणनीति पर निर्भर करता है ... क्या आप अपने कार्यक्रम के सभी स्थिरांक को इसे बदलने के लिए बदलते हैं? या क्या आपको फ़ाइल (या अन्य डेटा स्टोर) से मान पढ़ना चाहिए, जिससे वे प्रभावी रूप से रनवे चर बना सकें?
पाओलो एबरमन 20

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

29

कुछ अक्षर हैं जो अस्पष्ट हो सकते हैं या कई अलग-अलग उद्देश्यों के लिए उपयोग किए जाते हैं। उदाहरण के लिए, हम '-'हाइफ़न, माइनस साइन या डैश के रूप में उपयोग करते हैं। आप अलग नाम बना सकते हैं:

static const wchar_t HYPHEN = '-';
static const wchar_t MINUS = '-';
static const wchar_t EM_DASH = '-';

बाद में, आप अपने कोड को संशोधित करने के लिए उन्हें फिर से परिभाषित करके चुन सकते हैं:

static const wchar_t HYPHEN = '-';
static const wchar_t MINUS = '\u2122';
static const wchar_t EM_DASH = '\u2014';

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

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


मेरे लिए यह एकमात्र वैध कारण है जिससे कोई चरित्र स्थिरांक बना सकता है
FP

2
-एम डैश के रूप में उपयोग करना काफी भ्रामक है ... अधिकांश फॉन्ट में यह बहुत कम है। (यह एक एन डैश से भी छोटा है।)
पाओलो एबरमैन 20

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

1
@ Pa @loEbermann नहीं, पारंपरिक रूप से एक एम डैश एक टाइपफेस के 'एम' वर्ण की चौड़ाई है और एक एन डैश एक 'एन' वर्ण की चौड़ाई है।
दिज़ली

@Dizzley हाँ, और हाइफ़न-चौड़ाई <n-चौड़ाई <m- चौड़ाई।
पाओलो एबरमन जुएल

22

एक निरंतर अर्थ जोड़ना होगा।

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

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

  • city + CharacterClass.COMMA + state = बुरा
  • city + CITY_STATE_DELIMITER + state = अच्छा है

स्वरूपण के लिए कार्यों का उपयोग करें

मैं व्यक्तिगत रूप से पसंद करता हूं FormatCityState(city, state)और इस बात की परवाह नहीं करता कि उस फ़ंक्शन का शरीर तब तक कैसा दिखता है जब तक यह छोटा है और परीक्षण मामलों को पारित करता है।


1
आह, लेकिन एक अल्पविराम हमेशा एक ही अल्पविराम नहीं होता है। मैं COMMA = '\ u0559' या '\ u060C' आदि (यूनिकोड देखें) को परिभाषित कर सकता हूं या इसे बाद में एक चर में बदल सकता हूं और इसे एक विन्यास फाइल से पढ़ सकता हूं। इस तरह, यह अभी भी एक ही अर्थ होगा , लेकिन सिर्फ एक अलग मूल्य। उस के बारे में कैसा है।
श्री लिस्टर

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

17

यह विचार कि लगातार COMMA से बेहतर है ','या डिबैंक ","करना आसान है। निश्चित रूप से ऐसे मामले हैं जहां यह समझ में आता है, उदाहरण के लिए final String QUOTE = "\"";सभी स्लैशों के बिना पठनीयता पर भारी बचत होती है, लेकिन भाषा नियंत्रण वर्णों की तरह \ 'और "मैं उन्हें बहुत उपयोगी नहीं पाया।

उपयोग करना final String COMMA = ","केवल खराब रूप नहीं है, यह खतरनाक है! किसी से विभाजक बदलना चाहता है जब ","करने के लिए ";"वे बदल जाते हैं स्थिरांक फ़ाइल जा सकता COMMA = ";"है क्योंकि यह तेजी से उन्हें ऐसा करने के लिए है और यह सिर्फ काम करता है। सिवाय, आप जानते हैं, कि COMMA का उपयोग करने वाली अन्य सभी चीजें अब अर्धविराम भी हैं, जिनमें बाहरी उपभोक्ताओं को भेजी गई चीजें भी शामिल हैं। तो यह आपके सभी परीक्षणों को पार कर जाता है (क्योंकि सभी marshalling और unmarshalling कोड भी COMMA का उपयोग कर रहे थे) लेकिन बाहरी परीक्षण विफल हो जाएंगे।

जो उपयोगी है, उन्हें उपयोगी नाम देना है। और हाँ, कभी-कभी कई स्थिरांक में समान सामग्री लेकिन अलग-अलग नाम होंगे। उदाहरण के लिए final String LIST_SEPARATOR = ","

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


सशर्त रूप से DISP_APOSTROPHE को ASCII 0x27 या यूनिकोड सिंगल राइट कोट्स कैरेक्टर के रूप में परिभाषित करने के बारे में (जो कि एपोस्ट्रोफ का एक अधिक टाइपोग्राफी-उपयुक्त प्रतिपादन है), लक्ष्य प्लेटफॉर्म पर निर्भर करता है?
सुपरकैट

3
वास्तव में QUOTEउदाहरण यह साबित करता है कि यह एक बुरा विचार है और साथ ही साथ आप इसे यह बता रहे हैं कि आम तौर पर / लोकप्रिय रूप से क्या जाना जाता है DOUBLE QUOTEऔर QUOTEइसका तात्पर्य SINGLE_QUOTEयह है कि इसे अधिक सही तरीके से संदर्भित किया जाता है APOSTROPHE

3
@JarrodRoberson मुझे नहीं लगता है कि व्यक्तिगत रूप से एकल उद्धरण का मतलब है - लेकिन यह अस्पष्टता को दूर करने का एक और अच्छा कारण है जहाँ आप कर सकते हैं!
corsiKa

2
मुझे QUOTEएक अतिरिक्त कारण के लिए उदाहरण पसंद नहीं है - यह इसके साथ निर्मित स्ट्रिंग्स को पढ़ना कठिन बना देता है "Hello, my name is " + QUOTE + "My Name" + QUOTEयह एक तुच्छ उदाहरण है और फिर भी यह खराब दिखता है। ओह, निश्चित रूप से, बदले की जगह आप टोकन का उपयोग कर सकते हैं, बहुत "Hello, my name is %sMy Name%s".format(QUOTE, QUOTE)बुरा हो सकता है। लेकिन, हे, आइए अनुक्रमित टोकन "Hello, my name is {0}My Name{0}".format(QUOTE)ऊग की कोशिश करें , न कि बहुत बेहतर। किसी भी गैर-तुच्छ स्ट्रिंग में उद्धरण के साथ उत्पन्न भी बदतर होगा।

2
@corsiKa - मैं बच गए वास्तविक उद्धरणों के साथ रहूँगा। अगर मुझे एक से बचना याद है, तो मैं जिस आईडीई का उपयोग करता हूं वह तुरंत शिकायत करेगा। कोड सबसे अधिक संभावना संकलन नहीं करेगा, या तो। इसे स्पॉट करना काफी आसान है। एक गलती करना कितना आसान है जब "My name is" + QUOTE + "My Name" + QUOTEमैं वास्तव में वही गलती करता हूं जो तीन बार उपरोक्त टिप्पणी लिखते हैं। क्या आप इसे देख सकते हैं? यदि यह आपको थोड़ा सा लेता है, तो यह लापता स्थान है । क्या आप स्ट्रिंग को प्रारूपित करते हैं? जिस स्थिति में, बदलने के लिए कई टोकन के साथ एक स्ट्रिंग वर्कआउट करने के लिए और भी बदतर होने वाली है। मैं इसका उपयोग कैसे करूं ताकि यह अधिक पठनीय हो?
वीएलए

3

मैंने कुछ काम किया है जो लेक्सर्स और पर्सर्स लिख रहा है और टर्मिनलों का प्रतिनिधित्व करने के लिए पूर्णांक स्थिरांक का उपयोग किया है। एकल-वर्ण टर्मिनलों में ASCII कोड होता है जो कि सादगी के लिए उनके संख्यात्मक मान के रूप में होता है, लेकिन कोड पूरी तरह से कुछ हो सकता है। इसलिए, मेरे पास एक T_COMMA है जिसे ASCII- कोड ',' के रूप में इसके निरंतर मूल्य के रूप में सौंपा गया था। हालांकि, गैर-मध्यस्थों के लिए भी स्थिरांक थे जिन्हें एएससीआईआई सेट के ऊपर पूर्णांक सौंपा गया था। पार्सर जनरेटर जैसे कि याक या बाइसन, या इन उपकरणों का उपयोग करके लिखे गए पार्सर्स को देखने से, मुझे यह धारणा मिली कि मूल रूप से हर कोई इसे कैसे करता है।

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

मैं कुछ और अलग-थलग मामलों के बारे में सोच सकता हूं, जहां संबंधित शाब्दिक के बजाय स्थिरांक का उपयोग करना समझ में आता है। उदाहरण के लिए, आप NEWLINE को यूनिक्स बॉक्स पर शाब्दिक '\ n' के रूप में परिभाषित कर सकते हैं, लेकिन अगर आप विंडोज़ या मैक बॉक्स पर हैं तो '\ r \ n' या '\ n \ r'। वही पार्सिंग फ़ाइलों के लिए जाता है जो सारणीबद्ध डेटा का प्रतिनिधित्व करते हैं; आप FIELDSEPARATOR और RECORDSEPARATOR स्थिरांक परिभाषित कर सकते हैं। इन मामलों में, आप वास्तव में एक निश्चित कार्य करने वाले चरित्र का प्रतिनिधित्व करने के लिए एक निरंतर परिभाषित कर रहे हैं। फिर भी, यदि आप एक नौसिखिए प्रोग्रामर थे, तो शायद आप अपने क्षेत्र के विभाजक का नाम लगातार COMMA रखेंगे, न कि आपको यह एहसास दिलाते हुए कि इसे FIELDSEPARATOR कहा जाना चाहिए, और जब तक आपको एहसास हुआ, कोड उत्पादन में होगा और आप अगले पर होंगे परियोजना,

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

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


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

3

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

अच्छा सार एक तरफ कोड का उपयोग करना आसान बनाता है, और दूसरी ओर बनाए रखना आसान होता है।

मैं पूरी तरह से सहमत हूं DELIMITER=':'और अपने आप में एक खराब अमूर्त है, और केवल इससे बेहतर है COLON=':'(क्योंकि उत्तरार्द्ध पूरी तरह से खराब है)।

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

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

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

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


2

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

दोनों ही मामलों में, नामांकित प्रतीक का उपयोग COMMAएक अन्यथा असंतुष्ट उत्पाद के लिए सामंजस्य प्रदान करने में मदद करता है। यह मूल्य अक्सर अत्यधिक क्रिया संकेतन की लागत से आगे निकल सकता है।


2

गौर करें कि आप एक सूची बनाने की कोशिश कर रहे हैं।

तो, इसे निम्न के रूप में देखें: String makeList(String[] items)

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


0

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

हालाँकि, ऐसे कम से कम दो मामले हैं, जिनसे यह स्पष्ट हो जाता है कि स्थिरांक घोषित करने के लिए जिनके नाम में उनकी सामग्री के बारे में बताया गया है और जहाँ आप उचित रूप से स्थिरांक के नाम को बदले बिना मूल्य नहीं बदल सकते हैं:

  • गणितीय या भौतिक स्थिरांक, उदाहरण के लिए PI = 3.14159। यहां, स्थिर की भूमिका एक महामारी के रूप में कार्य करना है, क्योंकि प्रतीकात्मक नाम PIबहुत कम और अधिक पठनीय है, जो मूल्य का प्रतिनिधित्व करता है।
  • एक पार्सर या कीबोर्ड पर कुंजियों में प्रतीकों की अत्यधिक सूची। यह भी सबसे अधिक या सभी यूनिकोड वर्णों के साथ स्थिरांक की एक सूची बनाने के लिए समझ में आ सकता है और यह वह जगह है जहां आपका मामला गिर सकता है। कुछ पात्र जैसे Aस्पष्ट और स्पष्ट रूप से पहचाने जाने योग्य हैं। लेकिन क्या आप आसानी से Аऔर Aअलग बता सकते हैं? पहला अक्षर सिरिलिक पत्र है, जबकि दूसरा लैटिन अक्षर A है । वे अलग-अलग अक्षर हैं, अलग-अलग यूनिकोड कोड बिंदुओं द्वारा दर्शाए गए हैं, भले ही ग्राफिक रूप से वे लगभग समान हैं। मैं लगातार CYRILLIC_CAPITAL_Aऔर होगाLATIN_CAPITAL_Aमेरे कोड में लगभग दो समान-समान दिखने वाले अक्षर। बेशक, यह व्यर्थ है यदि आप जानते हैं कि आप केवल ASCII वर्णों के साथ काम करेंगे जिसमें सिरिलिक शामिल नहीं है। इसी तरह: मैं दिन-प्रतिदिन लैटिन वर्णमाला का उपयोग करता हूं इसलिए अगर मैं एक ऐसा कार्यक्रम लिख रहा था जिसमें एक चीनी चरित्र की आवश्यकता थी, तो मैं संभवतः एक चरित्र का उपयोग करने के बजाय एक निरंतरता का उपयोग करना पसंद करूंगा जो मुझे समझ में नहीं आता है। दिन-ब-दिन चीनी वर्णों का उपयोग करने वाले व्यक्ति के लिए, एक चीनी चरित्र स्पष्ट हो सकता है लेकिन एक लैटिन व्यक्ति को नामित नाम के रूप में प्रतिनिधित्व करना आसान हो सकता है। इसलिए, जैसा कि आप देखते हैं, यह संदर्भ पर निर्भर करता है। फिर भी, एक पुस्तकालय में सभी पात्रों के लिए प्रतीकात्मक स्थिरांक हो सकते हैं क्योंकि लेखक पहले से नहीं जान सकता है कि पुस्तकालय का उपयोग कैसे किया जा रहा है और एक विशिष्ट अनुप्रयोग में पठनीयता में सुधार करने के लिए किन पात्रों को स्थिरांक की आवश्यकता हो सकती है।

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


-1

शायद।

एकल चरित्र स्थिरांक को भेद करना अपेक्षाकृत कठिन है। इसलिए इस तथ्य को याद करना आसान हो सकता है कि आप अल्पविराम के बजाय एक अवधि जोड़ रहे हैं

city + '.' + state

जबकि वह अपेक्षाकृत कठिन गलती है

city + Const.PERIOD + state

आपके अंतर्राष्ट्रीयकरण और वैश्वीकरण के वातावरण के आधार पर, ASCII एपोस्ट्रोफ और विंडोज -1252 के बीच का अंतर ओपन एपस्ट्रोफ (या एएससीआईआई डबल कोट और विंडोज 1252 ओपन एंड क्लोज्ड डबल कोट) के बीच अंतर महत्वपूर्ण हो सकता है और देखने में कल्पना करने के लिए कुख्यात है। कोड पर।

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

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


2
क्या होता है जब कुछ मोरन Const.PERIODसमान होने के लिए बदलता है ~? नामित पात्रों की तनातनी का कोई औचित्य नहीं है, यह सिर्फ रखरखाव और जटिलता को जोड़ता है जो आधुनिक दिन के प्रोग्रामिंग वातावरण में अनएडेड है। क्या आप यूनिट परीक्षणों का एक सूट लिखने जा रहे हैं जो मूल रूप से कहते हैं assert(Const.PERIOD == '.')?

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

3
आपकी विरासत का उदाहरण एक गरीब है, मैंने अभी १००,०००+ एलओसी कोड आधार को रिफलैक्ट किया है जो १ a साल पुराना है। इसमें हर प्रिंट करने योग्य चरित्र को कई बार अलग-अलग परस्पर विरोधी नामों के साथ परिभाषित किया गया था। और कई बार नाम की चीजें COMMAवास्तव में निर्धारित की गई थीं = SPACE + "," + SPACE। हां कुछ बेवकूफों के पास एक SPACEस्थिर था। मैंने उन्हें बाहर निकाल दिया और कोड अधिक पठनीय के आदेश थे और कॉलेज के काम बहुत अधिक चीजों को ट्रैक करने और उन्हें ठीक करने के लिए 6 स्तर के अप्रत्यक्ष होने के बिना यह पता लगाने में सक्षम थे कि वास्तव में क्या कुछ निर्धारित किया गया था।

-1

क्या एकल-चरित्र वाले लगातार शाब्दिकों से बेहतर हैं?

यहाँ बहुत सारे भ्रम तैर रहे हैं। मुझे देखने दो कि क्या मैं उन्हें अलग कर सकता हूं।

लगातार प्रदान करते हैं:

  • अर्थ विज्ञान
  • परिवर्तन, विकास के दौरान
  • अविवेक

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

एक शाब्दिक और एक निरंतर विकास के दौरान दोनों बदल सकते हैं। यह वही है जो जादू की संख्या मुद्दे को लाता है। स्ट्रिंग्स जादू की संख्या भी हो सकती है।

यदि अर्थ अर्थ मौजूद है, और चूँकि दोनों स्थिर हैं, तो क्या स्थिरांक का शाब्दिक से अधिक मूल्य है जो अप्रत्यक्ष रूप से नीचे आता है।

अप्रत्यक्ष किसी भी समस्या को हल कर सकता है, अन्य अप्रत्यक्ष के अलावा।

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

अप्रत्यक्ष ओवरडोन हो सकता है। कुछ लोग अपने परिवर्तन करने के लिए शाब्दिक रूप से खोजना और बदलना पसंद करते हैं। यह ठीक है जब तक 42 स्पष्ट रूप से जीवन का अर्थ है और 42 के साथ एक साथ नहीं मिलाया जाता है, मोलिब्डेनम की परमाणु संख्या।

आप एक पत्र के साथ इस तरह के उपयोगी अंतर बना सकते हैं जो काफी हद तक संदर्भ पर निर्भर करता है। लेकिन मैं इसे एक आदत नहीं बनाऊंगा।


1
शब्दार्थ की कुंजी है। यदि और "A" में "A" होने की तुलना में अधिक शब्दार्थ है, तो यह समान शब्दार्थ को उसी "संदर्भ" में बाँधने के लायक है। कोई फर्क नहीं पड़ता कि यह एक स्थिर है या नहीं। मैं पूरी तरह सहमत हूँ।
oopexpert

-1

बहुमत की राय के लिए एक दार्शनिक विरोधाभासी के रूप में, मुझे यह बताना होगा कि हममें से कुछ हैं, जो 19 वीं सदी के फ्रांसीसी किसान प्रोग्रामर की सराहना करते हैं और

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

जीके चेस्टर्टन, द बॉल एंड द क्रॉस

सच की सराहना करने में कुछ भी गलत नहीं है और सच कहने में कुछ भी गलत नहीं है, खासकर जब कंप्यूटर से बात की जा रही हो।

अगर आप कंप्यूटर से झूठ बोलते हैं, तो यह आपको मिल जाएगा

पेरी फर्रार - जर्मेनटाउन, मैरीलैंड (अधिक प्रोग्रामिंग मोती से)


लेकिन, अधिकांश भाग के लिए मैं उन लोगों से सहमत हूं जो कहते हैं कि यह गूंगा है। मैं बहुत छोटा हूँ जिसने फोरट्रान को प्रोग्राम करना सीख लिया है, लेकिन मैंने सुना है कि आप फिर से परिभाषित कर सकते हैं 'A' = 'Q'और सभी प्रकार के अद्भुत क्रिप्टोग्रम्स के साथ आ सकते हैं । आप ऐसा नहीं कर रहे हैं।

इससे पहले लाए गए i18n मुद्दों से परे (जो ग्लिफ़ "COMMA" को पुनर्परिभाषित नहीं कर रहे हैं, लेकिन वास्तव में एक DECIMAL_POINT के ग्लिफ़ को फिर से परिभाषित कर रहे हैं)। मनुष्यों को अर्थ बताने के लिए फ्रेंच कैरोटी कोट्स या ब्रिटिश सिंगल कोट्स का निर्माण करना, बात पर है और जिन्हें वास्तव में वेरिएबल होना चाहिए, न कि स्थिरांक। निरंतर AMERICAN_COMMA := ','और होगाcomma := AMERICAN_COMMA

और, अगर मैं SQL क्वेरी बनाने के लिए एक बिल्डर पैटर्न का उपयोग कर रहा था, तो मैं बहुत कुछ देखूंगा

sb.append("insert into ")
 .append(table_name)
 .append(" values ")
 .append(" ( ")
 .append(val_1)
 .append(",")
 .append(val_2)
 .append(" ); ")

किसी भी अन्य चीज़ की तुलना में, लेकिन यदि आप स्थिरांक जोड़ने जा रहे हैं, तो यह होगा

INSERT_VALUES_START = " ( "
INSERT_VALUES_END = " ) "
INSERT_VALUES_SEPARATOR = " , "
QUERY_TERMINATOR = ";"

sb.append("insert into ")
 .append(table_name)
 .append(" values ")
 .append(INSERT_VALUES_START)
 .append(val_1)
 .append(INSERT_VALUES_SEPARATOR)
 .append(val_2)
 .append(INSERT_VALUES_END)
 .append(QUERY_TERMINATOR)

हालाँकि, यदि आपने कभी किसी और कार्यक्रम (या प्रकार) को देखा है, तो आपको कुछ दिलचस्प प्रश्न हो सकते हैं। हम सभी लोग स्टेलर टाइपिस्ट नहीं हैं। हम में से बहुतों को प्रोग्रामिंग देर से मिली या सोवियत कीबोर्ड (जहां आप पर टाइप करते हैं) के साथ उठाया गया था और हम कीबोर्ड पर उन्हें खोजने और / या स्वत: पूर्ण पर भरोसा करने के बजाय व्यक्तिगत पत्रों को काटना और पेस्ट करना पसंद करते हैं।

आपके लिए कुछ भी स्वत: पूर्ण नहीं हो रहा है, इसलिए यदि मैं 'con' दबाकर कॉमा प्राप्त कर सकता हूं, तो alt-space, down, down, down, एंटर करें और 'con', alt-space, डाउन दबाकर एक उद्धरण प्राप्त करें। नीचे, दर्ज करें। मै शायद यह कर सकता हूँ।


स्ट्रिंग शाब्दिक के बारे में याद रखने वाली एक और बात यह है कि जिस तरह से वे संकलित हैं। डेल्फी में कम से कम, (जो एकमात्र भाषा है जिसे मैंने स्टैक के ऊपर जुनून सवार किया है) आप प्रत्येक फ़ंक्शन के ढेर में अपने शाब्दिक रूप से पॉप अप करेंगे। तो, बहुत सारे शाब्दिक = बहुत सारे फ़ंक्शन ओवरहेड; "," function_A में मेमोरी की समान बिट नहीं है "," function_B में "। यह मुकाबला करने के लिए, एक" संसाधन स्ट्रिंग "है जिसे बग़ल में बनाया और जोड़ा जा सकता है - और यह है कि वे i18n सामान कैसे करते हैं (हत्या) एक झाड़ी के साथ दो पक्षी)। पायथन में आपके सभी स्ट्रिंग साहित्यिक वस्तुएं हैं, और यह वास्तव में उपयोग करने के लिए अच्छा लग सकता है utils.constants.COMMA.join(["some","happy","array","strings"]), लेकिन इस पृष्ठ पर बार-बार दोहराए जाने वाले बिंदुओं के लिए यह एक अच्छा विचार नहीं है।


-4

लेकिन जब हम अल्पविराम का प्रतिनिधित्व करने के लिए ',' की तुलना में एक अलग प्रतीक का उपयोग शुरू करने जा रहे हैं?

स्थानीयकरण के लिए।

अंग्रेजी बोलने वाले देशों में, एक दशमलव के पूरे और आंशिक भागों को अलग करने वाला प्रतीक "" है, जिसे हम "दशमलव बिंदु" कहते हैं। कई अन्य देशों में, प्रतीक "," है और आमतौर पर स्थानीय भाषा में "अल्पविराम" के बराबर कहा जाता है। इसी तरह, जहां अंग्रेजी बोलने वाले देश बड़ी संख्या में तीन अंकों के समूहों को अलग करने के लिए "," का उपयोग करते हैं (जैसे कि एक मिलियन के लिए 1,000,000), वे देश जो दशमलव बिंदु के रूप में अल्पविराम का उपयोग करते हैं वे एक डॉट (1.000.000) का उपयोग करते हैं।

यदि आप वैश्वीकरण कर रहे हैं तो DECIMAL_POINT और COMMA स्थिरांक बनाने के लिए एक मामला है।


2
लेकिन तब COMMA और DECIMAL_POINT एंटिटीज़ के लिए सही नाम नहीं हैं (जो शायद इसीलिए आपको डाउनवोट किया गया है)।
काइल स्ट्रैंड

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