क्या C ++ में एक आम पूंजीकरण सम्मेलन है? [बन्द है]


13

मैं पायथन और जावा में बहुत काम करता हूं, और उन दोनों भाषाओं में काफी आम है (हालांकि सार्वभौमिक नहीं है) कि कैसे पहचान में पूंजीकरण का उपयोग किया जाना चाहिए: दोनों PascalCaseवर्ग के नाम और ALL_CAPS"वैश्विक" स्थिरांक के लिए उपयोग करते हैं , लेकिन अन्य पहचानकर्ताओं के लिए बहुत सारे जावा कोड का उपयोग करता है mixedCaseजबकि बहुत सारे पायथन कोड का उपयोग करता है underscore_delimiters। मुझे पता है कि कोई भी भाषा या पुस्तकालय किसी विशेष पूंजीकरण को लागू नहीं करता है , लेकिन मैंने पाया है कि जब मैं जिस भाषा का उपयोग कर रहा हूं, उसके लिए मानक सम्मेलनों से चिपकता हूं, तो मेरा कोड अधिक पठनीय लगता है।

अब मैं C ++ में एक परियोजना शुरू कर रहा हूं, और मैं एक ही विचार लागू करना चाहता हूं। क्या पूंजीकरण के लिए कोई सबसे आम सम्मेलन है जिसके बारे में मुझे पता होना चाहिए?


CamelCase के साथ समस्या यह है कि यह प्रीप्रोसेसर के साथ अच्छी तरह से नहीं खेलता है। एक बड़ी समस्या नहीं है, खासकर जब से प्रीप्रोसेसर को आमतौर पर टाला जा सकता है।
पबबी

मुझे कुछ दिन पहले ही इस फैसले का सामना करना पड़ा था। अंत में, यह एक नो-ब्रेनर था, क्योंकि मानक पुस्तकालय और बढ़ावा दोनों अंडरस्कोर_लॉवरकेस_डेलिमिटर का उपयोग करते हैं। चूंकि मैं एसटीएल बूस्टर के रूप में बूस्ट का उपयोग करता हूं, इसलिए इसे मेरे कोड के बारे में सब कुछ छिड़का जाएगा। मेरे द्वारा उपयोग की जाने वाली अन्य लाइब्रेरियाँ PascalCase (SFML) अधिक आसानी से सम्‍मिलित की जा सकती हैं, इसलिए कोई भी विधि सुंदर मानक है।
मैक्स

@ Pubby8: जिज्ञासा से बाहर: प्रीप्रोसेसर के साथ ऊंट कैसे टकराता है?
जोकिम सोउर

@JoachimSauer कैमलकेस में अलग-अलग शब्दों में एक अलग मामला हो सकता है, लेकिन मैक्रोज़ केस को बदल नहीं सकते। यह एक समस्या बन जाती है यदि आप एक मैक्रो चाहते हैं जो एक तर्क के रूप में एक शब्द का हिस्सा लेता है - आपको तर्क के रूप में दोनों मामलों की आपूर्ति करनी पड़ सकती है: मैक्रो (एक्स, एक्स)। यह एक बहुत छोटी समस्या है, लेकिन अगर आपको प्रीप्रोसेसर का उपयोग करने का इरादा है, तो पता होना चाहिए।
पब्बी

जवाबों:


27

क्या पूंजीकरण के लिए कोई सबसे आम सम्मेलन है जिसके बारे में मुझे पता होना चाहिए?

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

हालाँकि, यदि आप एक नामकरण सम्मेलन की तलाश कर रहे हैं, तो आप मानक पुस्तकालय के नामकरण सम्मेलन को भी देख सकते हैं , क्योंकि यह एकल है जिसे सभी C ++ डेवलपर्स को जानना होगा और उनका उपयोग करना होगा।

हालांकि, जो भी आप सबसे महत्वपूर्ण नियम का उपयोग करते हैं वह है: सुसंगत रहें!

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


जानकारी के लिए धन्यवाद ... इसलिए मानक पुस्तकालय अंडरस्कोर है, फिर? (कम से कम इतना कुछ और से?) मैं उन पंक्तियों के साथ सोच रहा था, लेकिन iostream जैसी चीजों के कारण यह बताना कठिन था, जिसमें आधी विधि के नाम एक ही तरह के शब्‍द-सम्‍मिलित शब्‍द के टुकड़े लगते हैं जैसे ANSI C :-P
डेविड जेड

5
@ डेविड: आईओट्रीम लाइब्रेरी संभवत: 25 साल पुरानी है, और (सी लिब, या कोर्स को छोड़कर) सी ++ एसटीडी लिब का सबसे पुराना हिस्सा हो सकता है। उम्मीद है, उनके दाहिने दिमाग में कोई भी इसे आजकल जिस तरह से डिजाइन करेगा, और उम्मीद है कि उनके दाहिने दिमाग में भी नहीं लोग पहचान नहीं पाएंगे कि वे स्ट्रीम लाइब्रेरी में किस तरह से उपयोग किए जाते हैं। (C'mon, इसमें फ़ंक्शन नाम दिए गए हैं egptr, sputnऔर uflowसाथ ही underflow। यह सिर्फ प्रफुल्लित करने वाला है!) वैसे भी, हाँ, आजकल std lib सभी_lowercase_with_underscores का उपयोग करता है।
sbi

@sbi मुझे पता चला कि iostream लाइब्रेरी अब C ++ के लिए एक मानक लाइब्रेरी पर विचार नहीं करती है। और जैसा कि आप उल्लेख करते हैं, इसके पहचानकर्ता एक प्रोग्रामिंग सम्मेलन के रूप में उपयोगी नहीं हैं ;-)
umlcat

2
@umlcat: iostreams लाइब्रेरी (इसके सीएमपी 03 के लिए स्वीकार किए गए से templatized) को निश्चित रूप से C ++ मानक लाइब्रेरी का हिस्सा माना जाता है।
sbi

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

19

आइए सबसे पहले सहमत हैं कि ALL UPPERCASE एक आंखों की रोशनी है और इसे कम से कम किया जाना चाहिए।

C और C ++ में इसलिए इसे मैक्रोज़, और मैक्रोज़ के लिए एक सम्मेलन के रूप में उपयोग किया जाता है, क्योंकि मैक्रोज़ समान रूप से बदसूरत हैं, बुराई कहने के लिए नहीं।

अर्ली C में कॉन्स्टेंट नहीं था, इसलिए कॉन्स्टेंट को मैक्रोज़ के रूप में व्यक्त किया जाना था। इसके अलावा, उन शुरुआती दिनों के कार्यक्रम बहुत कम थे, ताकि आज जो प्रथाएँ हैं, उनका इस्तेमाल किया जा सके (जैसे IIRC ब्रायन कर्निघन ने बहुत सारे गैर अपरकेस मैक्रोज़ के साथ कोड लिखा है)। और यह भी, उन दिनों में जिन कीबोर्ड में लोअरकेस अक्षर नहीं थे, वे मौजूद थे; मैंने नॉर्वेजियन टंडबर्ग EC-10 कंप्यूटर पर 1980 या 1979 के बारे में ऐसा ही एक प्रयोग किया था, मुझे लगता है कि यह था।

तो, जावा ने सी। से शुरुआती के लिए अपरकेस सम्मेलन को उठाया। इस बीच, और शायद इससे पहले भी (मैं यहाँ कालक्रम के बारे में निश्चित नहीं हूं), सी को निरंतरता मिली। हालाँकि, बेशक कुछ / कई सी प्रोग्रामर स्थिरांक के पहले के सम्मेलन-दर-आवश्यकता में फंस गए थे क्योंकि अपरकेस मैक्रोज़, सी ++ प्रोग्रामर अधिक समझदार थे।

आजकल बड़ी समस्या यह है कि जब लोगों को पहले जावा, या सी (मध्य युग के सम्मेलनों के साथ) पढ़ाया जाता है, और फिर C ++ में आते हैं, तो उनके साथ उस बेईमानी से अधिवेशन लेकर।

इसलिए,

    int const answer = 42;    // Nice, good, OK.
    const int ANSWER = 0x2A;  // Ouch!
    #define COMPANYNAME_ANSWER 052  // Oh kill me, please.

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

वास्तव में मैं अभी भी ऐसा करने की सलाह देता हूं। हम कहाँ पर हैं! हम आगे नहीं बढ़े हैं।

फिलहाल, 2011 तक, मानक C ++ नामों में सामान्य यूनिकोड का समर्थन करता है (और 1998 के बाद से ऐसा किया है), जबकि वास्तविक C ++ कार्यान्वयन नहीं है। विशेष रूप से जी ++ संकलक राष्ट्रीय चरित्र को चुनौती दी है। यह उस अंधेरे युग तकनीकी सीमा से उपजा है।

इसलिए,

    double blueberryJamViscosity  = 0.0;    // OK
    double blåbærsyltetøyViskositet = 0.0;  // Ouch!

अंत में, अंडरस्कोर बनाम चौराहे पर अपरकेस अक्षरों के विषय में,

  • टाइप नामों के लिए एक आसानी से मान्यता प्राप्त फॉर्म को आरक्षित करें
  • मैक्रों के लिए आरक्षित करें।
  • निरतंरता बनाए रखें।

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

चीयर्स एंड हर्थ


अल्फ, ISTR स्ट्रॉस्ट्रुप ने C ++ से D & E C कॉपी में उल्लेख कियाconst है, इसलिए यह बहुत पहले हुआ होगा, और जावा से बहुत पहले, शायद C89 के लिए।
sbi

2
ओह, और +1"लगातार रहो!" इसे पढ़कर मुझे आश्चर्य होता है कि मैं इसका उल्लेख करना क्यों भूल गया, मेरे जवाब में सबसे महत्वपूर्ण, नियम, जब मैं अपने छात्रों को बताना नहीं भूलता था। मुझे लगता है कि आप मुझे माफ कर देंगे अगर मैं अब इसे अपने जवाब के रूप में जोड़ दूं?
sbi

2

मैं आमतौर पर उस कन्वेंशन से चिपके रहता हूं जिसे मैं भाषा के लिए मौजूदा कोडबेस में सबसे ज्यादा देखता हूं। C ++ के मामले में, मैं आमतौर पर ऊंट को देखता हूं। रूबी या PHP के मामले में मैं आमतौर पर stuff_like_this देखता हूं।

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


1

खैर, वहाँ सिस्टम हंगेरियन है जो वास्तव में अब भी आम है, लेकिन मैं सिफारिश करने की बजाय अपना गला काटूंगा। एप्स हंगेरियन बेहतर है क्योंकि इसके एनोटेटिव निशान वास्तव में शब्दार्थ के संकेत हैं, हालांकि मुझे लगता है कि यह संक्षिप्त रूप में बहुत कम उत्सुक है जब एक छोटा शब्द होगा। (उस विकिपीडिया पृष्ठ से उदाहरण का उपयोग करने के लिए, rwपंक्ति के लिए उपयोग क्यों किया rowजाता है जब केवल एक वर्ण लंबा हो? यह ऐसा नहीं है कि कोई वैश्विक स्वर की कमी हो।)

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


1

मैंने जो देखा है, वह परियोजनाओं के बीच भिन्न होता है।

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

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


1

मैंने मानक पुस्तकालय का इस्तेमाल किया है और नामकरण सम्मेलनों के संदर्भ के रूप में बढ़ावा दिया है। हालांकि, इस समाधान के साथ एक समस्या है।

मानक लाइब्रेरी आपके कोड के साथ टकराव को कम करने के प्रयास के लिए डिज़ाइन किए गए एक नामकरण सम्मेलन का उपयोग करती है। समाधान का एक हिस्सा सभी निचले अक्षरों का उपयोग करना है। इसलिए ऊंट के बजाय अंडरस्कोर का उपयोग करें।

मुझे लगता है कि ऊंट पढ़ने योग्य है। PascalCase को अक्सर वर्ग नामों के लिए उपयोग किया जाता है क्योंकि यह एक उचित संज्ञा के समकक्ष का प्रतिनिधित्व करता है। हालांकि, मैं फंक्शनलर्स के लिए उस नियम को तोड़ दूंगा जो क्रिया के अधिक प्रतिनिधि हैं।

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

// instead of a manifest constant
#define HOURS 24

// use const
const int kHours = 24; 

// or enum
enum {
    kHours   = 24,
    kMinutes = 60
};

0

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

पहले के एक जवाब के विपरीत, मैं होता बचने , मेरे अपने कोड में सी ++ स्टैंडर्ड लाइब्रेरी नामकरण परंपरा निम्नलिखित स्टैंडर्ड लाइब्रेरी के साथ से बचने के नाम टकराव के अलावा कोई अन्य कारण के लिए है।

संबंधित विषय पर यह पिछला एसओ उत्तर भी रुचि का हो सकता है: /programming/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier


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