जब कोई तार्किक विकल्प एक आरक्षित कीवर्ड है, तो उसका नाम कैसे रखा जाए? [बन्द है]


64

कभी-कभी, किसी चीज़ के लिए सबसे तार्किक नाम (जैसे एक चर) भाषा या पसंद के वातावरण में एक आरक्षित कीवर्ड होता है। जब समान रूप से उपयुक्त पर्यायवाची नहीं है, तो कोई इसे कैसे नाम देता है?

मुझे लगता है कि इस समस्या के लिए सबसे अच्छा अभ्यास उत्तराधिकार हैं। ये प्रोग्रामिंग भाषाओं और वातावरण के रचनाकारों या राज्यपालों द्वारा प्रदान किए जा सकते हैं। उदाहरण के लिए, अगर python.org (या गुइडो वैन रोसुम) कहता है कि पायथन में इससे कैसे निपटना है, तो यह मेरी पुस्तक में एक अच्छा दिशानिर्देश होगा। C # में इससे निपटने के बारे में MSDN लिंक भी अच्छा होगा।
वैकल्पिक रूप से, सॉफ्टवेयर इंजीनियरिंग में प्रमुख प्रभावकों द्वारा प्रदान किए गए दिशानिर्देश भी मूल्यवान होने चाहिए। शायद Google / वर्णमाला में एक अच्छा स्टाइल गाइड है जो हमें सिखाता है कि इससे कैसे निपटना है?

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


15
मैं "default_value" जैसा कुछ उपयोग करूंगा। अर्थ वही रहता है, लेकिन आपको कुछ और अक्षर लिखने होंगे।
Mael

26
@ Darkhogg अगर मुझे मेरे कोड में से कोई भी मिला तो मैं उन्हें तुरंत बदल दूंगा। वर्तनी की गलतियाँ या कन्वेंशन उल्लंघन उल्लंघन स्वीकार्य नहीं हैं।
मेटाफ़ाइट

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

6
डिफॉल्ट एनुम वैल्यू के रूप में गर्भ-उत्पादक लगता है। यह एक डोमेन-विशिष्ट नाम होना चाहिए जो डिफ़ॉल्ट का वर्णन करता है। हालाँकि, डिफ़ॉल्ट को वापस करने के लिए एक विधि होनी चाहिए।
qwerty_so

18
@AndresF। मैं असहमत हूं। मुझे अक्सर जावा के डिजाइनरों के खिलाफ बहस करना बहुत आसान लगता है । मैं इसे उनके खिलाफ नहीं पकड़ता, हालांकि। वे जंगली पश्चिम में काम कर रहे थे।
मेटाफ़ाइट

जवाबों:


63

एनम विकल्प के लिए आपको शीर्षक केस का उपयोग करना चाहिए Default। चूंकि C # केस-संवेदी है, इसलिए यह आरक्षित कीवर्ड से नहीं टकराएगा। .Net नामकरण दिशानिर्देश देखें ।

चूँकि सभी सार्वजनिक सदस्यों को .net में शीर्षक का मामला होना चाहिए, और सभी आरक्षित नाम कम मामले हैं, इसलिए आपको स्थानीय वेरिएबल्स (पैरामीटर सहित) को छोड़कर वास्तव में इसका सामना नहीं करना चाहिए। और स्थानीय लोगों के नाम के साथ आमतौर पर संज्ञा या वाक्यांश होते हैं, इसलिए यह बहुत दुर्लभ है सबसे प्राकृतिक नाम एक कीवर्ड के साथ टकराएगा। उदाहरण के लिए। defaultValueआमतौर पर की तुलना में अधिक प्राकृतिक नाम होगा default। तो व्यवहार में यह कोई बड़ा मुद्दा नहीं है।

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


बेशक अन्य भाषाओं में अलग-अलग वाक्यविन्यास और कीवर्ड हैं और इसलिए इस समस्या के विभिन्न समाधान हैं।

एसक्यूएल में काफी सारे कीवर्ड होते हैं, लेकिन यह केवल पहचानकर्ताओं से बचने के लिए बहुत आम है, जैसे [Table]। कुछ भी सभी पहचानकर्ताओं के लिए ऐसा करते हैं, भले ही वे किसी कीवर्ड से टकराते हों या नहीं। (आखिरकार, भविष्य में एक क्लैशिंग कीवर्ड पेश किया जा सकता है!)

पॉवर्सशेल (और अन्य स्क्रिप्टिंग भाषाओं का एक गुच्छा) सभी प्रकारों को $ s जैसे एक सतर्कता के साथ उपसर्ग करता है जिसका अर्थ है कि वे कभी भी कीवर्ड से नहीं टकराएंगे।

लिस्प में कम से कम पारंपरिक अर्थों में कीवर्ड नहीं हैं।

PEP-8 में अजगर को आधिकारिक तौर पर मान्यता प्राप्त सम्मेलन है :

हमेशा क्लास मेथड के लिए पहले तर्क के लिए cls का उपयोग करें।

यदि कोई फ़ंक्शन तर्क का नाम आरक्षित कीवर्ड के साथ टकराता है, तो आमतौर पर एक संक्षिप्त या अनचाहे भ्रष्टाचार का उपयोग करने के बजाय एकल ट्रेलिंग अंडरस्कोर को जोड़ना बेहतर होता है। इस प्रकार class_ clss से बेहतर है। (शायद बेहतर है कि समानार्थी शब्द का उपयोग करके इस तरह के झड़पों से बचें।)

जैसे कुछ भाषाओं Brainfuck या श्वेत रिक्ति बिल्कुल शब्द को परिभाषित करने टाल, सुंदर ढंग से समस्या sidestepping।

संक्षेप में, आपके प्रश्न का कोई भाषा-स्वतंत्र उत्तर नहीं है, क्योंकि यह विशिष्ट भाषा के वाक्य रचना और सम्मेलनों पर अत्यधिक निर्भर करता है।


2
हालांकि आपको केस सेंसिटिविटी पर भरोसा नहीं करना चाहिए। हालांकि यह व्यवहार में एक समस्या होने की संभावना नहीं है, सभी .NET भाषाएँ केस-संवेदी नहीं हैं, इसलिए आप किसी बिंदु पर अनपेक्षित समस्याओं में भाग सकते हैं।
विवलिन

6
@ विवलिन: आपके पास सार्वजनिक सदस्य या प्रकार के नाम नहीं होने चाहिए जो केवल मामले में भिन्न होते हैं, क्योंकि इससे अन्य भाषा के लिए समस्याएं हो सकती हैं। लेकिन यह मेरे सुझाव के अनुसार असंबंधित है, क्योंकि कीवर्ड पहचानकर्ता नहीं हैं (और अन्य भाषाओं में अन्य कीवर्ड होंगे)।
जैक्सबी

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

@Vivelin सभी .NET भाषाएँ केस-संवेदी नहीं हैं - मुझे VB.NET और Powershell का पता है; क्या कोई और हैं?
ज़ेव स्पिट्ज़

@ZevSpitz ने ओपी को विशेष रूप से C # कहा, यही कारण है कि मुझे लगता है कि विवलिन ने इसे अपने उदाहरण के रूप में इस्तेमाल किया है, हालांकि जैसा कि आप कहते हैं कि VB.NET केस-संवेदी नहीं है, इसलिए हमेशा की तरह, मुझे लगता है कि यह प्रति भाषा के आधार पर नीचे आएगा। । सभी भाषाओं में समान शब्द नहीं हैं
Shaggy13spe

22

मैं एक अंडरस्कोर (डिफ़ॉल्ट_) जोड़ूंगा

पेशेवरों:

  • सरल
  • स्पष्ट (आप किसी अंडरस्कोर को क्यों जोड़ेंगे?)
  • संगत
  • प्रयोग करने में आसान
  • मैं जानता हूँ कि सभी आधुनिक भाषाओं में काम करता है
  • तार्किक विकल्प के सबसे करीब

मुझे अन्य समाधान क्यों पसंद नहीं हैं:

पर्याय:

  • खोजने में मुश्किल
  • अक्सर सटीक समान अर्थ (बारीकियों) नहीं

एक शब्द को लागू करना / रोकना:

  • असंगत (defaultValue, defaultItem)
  • वृद्धि की पठनीयता के बिना वर्बोसिटी बढ़ गई

पत्र बदलना (वर्ग के बजाय क्लाज़):

  • असंगत (क्लाज़, क्लैज़, क्लज़)

संख्या लागू करना (डिफ़ॉल्ट 1):

  • डिफ़ॉल्ट 2 के लिए प्रश्न उठाता है

पत्र को लागू करना / रोकना:

  • स्पष्ट नहीं है (प्रोग्रामर को यह अनुमान लगाना है कि इसका उपयोग namecollision के लिए किया गया था और कुछ और के लिए शॉर्टकट नहीं)

एक कीवर्ड से बचने (@default (c #), `डिफ़ॉल्ट` (scala)

  • केवल कुछ भाषाओं में ही संभव है
  • मुख्य रूप से अन्य भाषाओं की संगतता के लिए शायद ही कभी इस्तेमाल की जाने वाली सुविधा
  • अपने एपीआई के उपयोगकर्ताओं के लिए उपयोग करना कठिन बना देता है (उन्हें यह जानना होगा कि यह कैसे करना है और यह याद रखना है कि यह कैसे करना है)

मैं इसका उपयोग कब नहीं करूंगा:

  • मौजूदा, व्यापक रूप से अन्य सम्मेलन का इस्तेमाल किया
  • मुझे पहले से ही एक उपयुक्त पर्यायवाची पता है
  • आपके विशिष्ट enum मामले में मैं @JacquesB उत्तर का पालन करूंगा

7
यह एक समाधान है जिसे अक्सर पायथन में उपयोग किया जाता है। मैं इसे सबसे सुरुचिपूर्ण के रूप में वकालत नहीं कर रहा हूं, लेकिन यह काम करता है।
19

1
@ फ्रालौ पायथन विशेष रूप से खराब नहीं है - मैं वास्तव में "इनपुट" जैसे पहचानकर्ताओं से नफरत करता हूं
क्रिश्चियन सॉयर

बहुत सी भाषाओं में एक klassचर के लिए देखता है जहां classएक आरक्षित शब्द है। मैंने कभी नहीं देखा defawltलेकिन यह एक ही विचार है। मैं पसंद करूँगा default_(और शायद class_ऐसा करने से किसी भी स्थापित सम्मेलनों को रौंद नहीं सकता)।
nigel222

आपने कीवर्ड से बचने का विकल्प शामिल नहीं किया था।
कोडइन्चोस

1
आप वैध, समझदार तर्क देते हैं, हालांकि मुझे यकीन नहीं है कि "यह स्पष्ट है कि अंडरस्कोर का उपयोग क्यों किया गया था"। मैंने शायद ही कभी ऐसे फ्रॉड्स के साथ काम किया है जो उन भाषाओं के सभी कीवर्ड जानते हैं, जिनमें वे काम कर रहे हैं!
रक्षक एक

18

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

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

या बेहतर अभी तक, कुछ और अक्षर टाइप करने के लिए अतिरिक्त प्रयास करें और इसे DefaultValue कहें।


3
मैं सहमत हूँ। "डिफ़ॉल्ट" कोई संकेत नहीं देता है कि मूल्य क्या है। enum ErrorHandlingLevel { Default = 0, ... }बनाम पर विचार करें enum ErrorHandlingLevel { None = 0, ... }। दूसरे उदाहरण में, जो तथ्य Noneडिफ़ॉल्ट है, उसे xumldoc का उपयोग करके या कोड में स्पष्ट रूप से 0 तक एनम मान सेट करके जाना जा सकता है। आपको यह जानने का अतिरिक्त लाभ मिलता है कि किसी वस्तु के ErrorHandlingLevelसेट होने पर इसका क्या अर्थ है None। तुलना करें कि ErrorHandlingLevelडिफ़ॉल्ट के लिए सेट के साथ एक वस्तु का निरीक्षण करना ।
हैरिसन पाइन

9

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

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

उदाहरण के लिए, आपको यह बताने की सुविधा देता है कि Modeआपके मामले में एक डिफ़ॉल्ट मान होना चाहिए। नामकरण यह default_modeपुनरावृत्ति के कारण सबसे अच्छा नहीं लग सकता है, लेकिन यह वांछित अर्थ को व्यक्त करते हुए अस्पष्टता से बचता है।


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

3

आपको अलग या संशोधित शब्द (शब्दों) का उपयोग करना होगा, यह स्पष्ट है।
तो यह आमतौर पर या तो मतलब है

  • एक पूरी तरह से अलग शब्द
  • एक उपसर्ग
  • एक प्रत्यय

यह निर्धारित करने के लिए एक और कारक है कि एकाधिक शब्दों को कैसे जोड़ा जाए और विकल्प आमतौर पर हैं

मेरा सुझाव उपसर्ग या प्रत्यय और अंडरस्कोर / डैश का उपयोग करना है, जैसे

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

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

मेरे द्वारा देखे गए domain_specific दृष्टिकोण के लिए कुछ उदाहरण हैं: vehicle_modelइसके बजाय modelएक आरक्षित शब्द था; room_tableSQL टेबल के tableलिए एक आरक्षित शब्द है।

अन्य दो विकल्प जिन्हें मैंने भाषाओं या लिपियों का उपयोग करते देखा है:

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

थोड़ा शायद दिलचस्प पक्ष के रूप में ध्यान दें: मैंने words_with_underscores-or-dashesदो नामों के साथ संदर्भित देखा है - snake_caseअंडरस्कोर kebab-caseका उपयोग करते समय और डैश का उपयोग करते समय। मुझे बाद वाला मजाकिया लगा।
व्लाज

2

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

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

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

int ccase;  // Name dodges a reserved word

10
डाउनवॉटर नहीं, लेकिन "पहले या आखिरी पत्र को दोगुना करना" सुझाव ने मेरी रीढ़ को ठंड कर दिया ....
विल्म वान रूम्ट

@WillemvanRumpt मुझे ऐसा करना पसंद नहीं है, या तो एक बार, लेकिन एक महान समय में यह एक आरक्षित शब्द से बचने के लिए जिमनास्टिक करने के बीच एक विकल्प के लिए नीचे आता है जो बहुत सारे सिर खरोंच या एक अजीब दिखने वाले पहचानकर्ता को संकेत देता है जो केवल थोड़ा संकेत देता है ।
५३ पर ब्लरफ्ल

6
कोई निर्णय नहीं, बस .... ठंड लगना .... ठंडी हवाएं ...;)
विलेम वैन रूम्ट

1
एक अंडरस्कोर को स्थगित करना एक दोहरे अंतिम पत्र से बेहतर है। (किसी भी वोट के लिए classs?)
nigel222

1
कोडिंग दिशानिर्देश! यह अच्छा होगा! अच्छी बात।
रक्षक एक

2

C # में, आप @ के साथ एक पहचानकर्ता का नाम प्रीपेंड कर सकते हैं । यह संकलक को पहचानकर्ता के नाम के रूप में व्यवहार करने के लिए कहता है न कि संभावित कीवर्ड के रूप में।

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

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