C [बंद] में चर और कार्यों के लिए उपयोग किए जाने वाले नामकरण


13

जबकि CI में एक बड़ी परियोजना कोडिंग एक समस्या पर आया था। अगर मैं और कोड लिखता रहूंगा तो एक समय आएगा जब मेरे लिए कोड को व्यवस्थित करना मुश्किल होगा। मेरा मतलब है कि कार्यक्रम के विभिन्न हिस्सों के लिए कार्यों और चर के लिए नामकरण मिला-जुला लग सकता है।

तो मैं सोच रहा था कि क्या उपयोगी नामकरण परंपराएं हैं जो मैं सी चर और कार्यों के लिए उपयोग कर सकता हूं?

अधिकांश भाषाएं एक नामकरण सम्मेलन का सुझाव देती हैं। लेकिन सी के लिए केवल एक चीज जो मैंने अब तक पढ़ी है, वह नाम कोड पठनीयता के लिए वर्णनात्मक होना चाहिए।

संपादित करें:

सुझाए गए नामकरण सम्मेलनों के कुछ उदाहरणों के उदाहरण:

मैंने जावा के लिए कुछ और नामकरण सम्मेलनों को पढ़ा, लेकिन याद नहीं आ रहा था।


सुझाए गए नामकरण सम्मेलनों के साथ भाषाओं के कुछ उदाहरणों का हवाला देते हैं। और जहां हम उन नामकरण सम्मेलनों को पा सकते हैं।
फिलिप

@Philip ने उदाहरण पेश किए
Bansal

1
चरों के साथ कोई समस्या नहीं होनी चाहिए क्योंकि आप ग्लोबल्स का उपयोग नहीं करते हैं। और समारोह नाम के लिए: मॉड्यूल का नाम है अगर order.c, आप कार्यों नाम दे सकते हैं order_add(), order_del()और इस तरह के। पुरानी प्रणालियां हो सकती हैं जो आपको बताती हैं कि पहले 8 अक्षरों के भीतर नाम अद्वितीय होना चाहिए। जब आप दुर्घटना के बाद c ++ में बदल जाते हैं, तो आपको लिखना अच्छा लगेगा order::add()और order::del()फिर।
ott--

जवाबों:


17

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

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

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

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

व्यक्तिगत पहचानकर्ताओं के स्तर पर, ये मोटे तौर पर व्यक्तिवाद के बढ़ते क्रम में हैं:

  1. एक सम्मेलन चुनें और इसके साथ रहें
    • जैसे, function_like_this(struct TypeLikeThis variable)आम है
  2. निश्चित रूप से हंगेरियन नोटेशन से बचें (क्षमा करें JNL)

    • जब तक आप मूल रूप से इरादा के रूप में इसका उपयोग करने के लिए तैयार नहीं होते हैं, जिसका अर्थ है कि सिमोनी के ऐप नोटेशन भयानक सिस्टम संस्करण के बजाय

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

  3. जब तक वे वास्तव में अपारदर्शी कुकी प्रकार के नहीं होते हैं, तब तक पॉइंटर टाइपडिफ्स से बचें - वे केवल चीजों को भ्रमित करते हैं

    struct Type *ok;
    typedef struct Type *TypePtr;
    TypePtr yuck;

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

    उदाहरण के लिए, एक डेटाबेस लाइब्रेरी एक इंटरफ़ेस को उजागर कर सकती है जैसे

    /* Lots of buffering, IPC and metadata magic held in here.
       No, you don't get to look inside. */
    struct DBContextT;
    /* In fact, you only ever get a pointer, so let's give it a nice name */
    typedef struct DBContexT *DBContext;
    
    DBContext db_allocate_context(/*maybe some optional flags?*/);
    void db_release_context(DBContext);
    int db_connect(DBContext, const char *connect);
    int db_disconnect(DBContext);
    int db_execute(DBContext, const char *sql);

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


डिजाइन पर एक नोट

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

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

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

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

आप यह भी देख सकते हैं कि एक ही चिंता होने से इन कार्यों को एक साथ करने के लिए एक उपसर्ग चुनना आसान हो गया है।

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


क्या आप मुझे यह समझने में मदद कर सकते हैं कि हंगेरियन से परहेज क्यों है? बस इसके बारे में अधिक जानने के लिए उत्सुक हैं। :)
JNL

@JNL: ठीक से समझाने के लिए एक टिप्पणी बहुत छोटी है। मेरा सुझाव है कि आप इसे एक नए प्रश्न के रूप में पोस्ट करें।
बार्ट वैन इनगेन शेनॉ

with low coupling and high cohesion। इसका क्या मतलब है? और कृपया अपारदर्शी कुकी प्रकारों के बारे में बताएं। मुझे उसका मतल नही पाता।
असीम बंसल

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

मैं कुछ दिनों के बाद जवाब दे रहा हूं। उसके लिए खेद है। मैंने आपका वर्णन पढ़ा low coupling and high cohesion। तो इसका मूल रूप से मतलब यह है कि जब मैं कर सकता हूं तो चीजों को इनकैप्सुलेट करना चाहिए और यह इस तरह से किया जाना चाहिए कि जिन कार्यों की वास्तव में आवश्यकता है, उनकी पहुंच होनी चाहिए। कुछ चीजें मेरे सिर पर चली गईं लेकिन फिर भी मुझे लगता है कि मुझे आपकी बात मिल गई।
असेम बंसल

5

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

कहा जा रहा है कि यदि आप इस विषय पर अन्य पहलुओं पर एक नज़र रखना चाहते हैं तो नामकरण सम्मेलनों के विकिपीडिया पृष्ठ में उन चीजों की एक अच्छी सूची है जिन्हें आपको ध्यान में रखना चाहिए। यह C और C ++ पर एक धर्म भी है:

C और C ++ में, कीवर्ड और मानक लाइब्रेरी पहचानकर्ता अधिकतर निचले हिस्से में होते हैं। C मानक लाइब्रेरी में, संक्षिप्त नाम सबसे आम हैं (जैसे कि फ़ंक्शन वर्ण अल्फ़ान्यूमेरिक है या नहीं, इसके लिए फ़ंक्शन परीक्षण के लिए isalnum), जबकि C ++ मानक लाइब्रेरी अक्सर एक शब्द विभाजक के रूप में एक अंडरस्कोर का उपयोग करता है (जैसे out_of- व्यवस्था)। पहचानकर्ता मैक्रोज़ का प्रतिनिधित्व करते हैं, सम्मेलन द्वारा, केवल ऊपरी मामलों के अक्षरों और अंडरस्कोर का उपयोग करके लिखा जाता है (यह स्थिरांक के लिए सभी ऊपरी मामलों के पहचानकर्ताओं का उपयोग करने की कई प्रोग्रामिंग भाषाओं में सम्मेलन से संबंधित है)। डबल अंडरस्कोर या एक अंडरस्कोर और एक कैपिटल लेटर के साथ शुरू होने वाले नामों को कार्यान्वयन (कंपाइलर, स्टैंडर्ड लाइब्रेरी) के लिए आरक्षित किया जाता है और इसका उपयोग नहीं किया जाना चाहिए (जैसे आरक्षित__ या _Reserved)। [५] [६] यह स्ट्रैपिंग के समान सतही है, लेकिन शब्दार्थ अलग है:


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

1
@ भयानक सलाह। हर कोई आपके समान IDE का उपयोग नहीं करेगा।
जेम्स

6
@ जेम्स उन्हें जरूरत नहीं है, वे किसी भी सभ्य आईडीई का उपयोग कर सकते हैं। फिर आपको उत्पादकता के लिए स्पष्टता का त्याग नहीं करना पड़ेगा।
जोएल

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

5

सी में एकमात्र कठिन बाधा यह है कि कोई नामस्थान नहीं हैं। इसलिए, आप बनाने के लिए एक रास्ता खोजने के लिए है rename()अपने के समारोह फाइल सिस्टम पुस्तकालय से अलग rename()अपने के समारोह मीडिया पुस्तकालय। सामान्य समाधान एक उपसर्ग है, जैसे: filesystem_rename()और media_rename()

अन्य सामान्य सलाह यह है: एक परियोजना या एक टीम के भीतर बने रहें। पठनीयता में सुधार होगा।


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

2

यदि आप एक वैश्विक रूप से स्वीकृत प्रारूप के लिए देख रहे हैं

MISRA / JSF / AUTOSAR नामकरण और C / C ++ कोड को व्यवस्थित करने के लिए किसी भी और हर उद्योग-मानक का लगभग 100% कवर करता है। समस्या यह है कि वे मुक्त होने के लिए नहीं होंगे अर्थात प्रत्येक गाइडबुक में कुछ पैसे खर्च होंगे। मुझे पता है कि MISRA 2008 C / C ++ कोडिंग मानक पुस्तक की लागत लगभग 50 USD है।

जब आप कोई पत्रिका लिखते हैं तो आप उन्हें ग्रन्थ सूची के लिए हार्वर्ड रेफरेंसिंग और इसके अलावा पढ़ने के रूप में सोच सकते हैं। मैंने MISRA का उपयोग किया है और यह आपके कार्यों और चर को नाम देने और उन्हें उचित उपयोग के लिए व्यवस्थित करने का एक अच्छा तरीका है।

यदि आप अस्थायी मंदिर के लिए देख रहे हैं

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

1) यह स्पष्ट रूप से पालन करना आसान था।

2) उत्पादन कोड आवश्यकताओं ने सुरक्षा-महत्वपूर्ण सॉफ़्टवेयर सिस्टम मानकों के आधार को नहीं छुआ।

3) उस प्रारूप में लिगेसी कोड (किसी तरह) था।

4) Doxygen ने Javadoc sytle को टिप्पणी करने की अनुमति दी। उस समय, हम उत्पादन लोगों के लिए प्रलेखन उत्पन्न करने के लिए डॉक्सीजन का उपयोग कर रहे थे।

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

आशा है कि यह मदद की !?


वास्तव में मैं व्यक्तिगत सी कोड के लिए यह पूछ रहा था। लेकिन मुझे आपका सुझाव याद रहेगा।
असेम बंसल

@AseemBansal व्यक्तिगत या पेशेवर, वे सीखने में अच्छे हैं और आपके सीवी पर डालने के लिए भी अच्छे हैं :) .... अप टू यू।
नागफनी जूल

0

नामकरण करते समय कुछ महत्वपूर्ण बातों पर विचार किया जाएगा;

  1. ActionObject या ObjectAction प्रकार पर देखें। (ऑब्जेक्ट सी के लिए नहीं है लेकिन सामान्य रूप से जब आप अन्य ऑब्जेक्ट ओरिएंटेड भाषाओं में जाते हैं) तो यह मदद करनी चाहिए

  2. बाकी सुनिश्चित करने के लिए संक्षिप्त, संक्षिप्त और वर्णनात्मक होगा।

  3. इसके अलावा, परिभाषित किए गए प्रत्येक चर और फ़ंक्शन का एकमात्र उद्देश्य है, जैसे: यदि इसका मान अस्थायी रूप से संग्रहीत करना है, तो इसे nTempV के रूप में नाम दें
  4. चर संज्ञा होनी चाहिए और विधियां क्रिया होनी चाहिए।

6
हंगेरियन नोटेशन (टाइप को दर्शाते हुए अक्षरों के साथ एक चर को उपसर्ग करते हुए) दर्द का कोई अंत नहीं है। यह शुक्र है कि ज्यादातर फैशन से बाहर हो गया है।
रोबोट

@StevenBurnap सिर्फ उत्सुक था कि हंगेरियन प्रारूप को क्यों टाला गया? मेरा मानना ​​है कि उन्होंने हमें स्कूल में पढ़ाया है और मैंने कुछ काम स्थानों में भी ऐसा कोड देखा है। यदि आप हंगेरियन नहीं तो किसकी सलाह लेंगे। धन्यवाद
JNL

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

2
यहाँ मूल आशय और हंगामे
रेसडूम

@Residuum यह एक अच्छी कड़ी थी। बहुत मदद की। इसकी प्रशंसा करना।
JNL

0

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

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

हो सकता है आगे भी जाएं और अपने निर्यात किए गए प्रतीकों को समूहित करें: libcurl वैश्विक इंटरफेस के लिए curl_ * का उपयोग करता है, अलग-अलग इंटरफेस के लिए curl_easy_ *, curl_multi_ *, और curl_share_ *। इसलिए सभी कार्यों के लिए कर्ल_ * का उपयोग करने के अलावा, उन्होंने अलग-अलग इंटरफेस के लिए "नेमस्पेस" का एक और स्तर जोड़ा है: कर्ल_मेसि_ * फंक्शन को कर्ल_मुल्ति_ * पर कॉल करना अब गलत दिखता है, http: // कर्ल पर फ़ंक्शन नाम देखें । haxx.se/libcurl/c/

निर्यात किए गए प्रतीकों के नियमों को ध्यान में रखते हुए, आपको #includeएड फ़ाइलों में स्थिर कार्यों के लिए उपयोग करना चाहिए : इन कार्यों के लिए एक सामान्य उपसर्ग खोजने का प्रयास करें। शायद आपके पास "my_string" नामक फ़ाइल में स्थिर स्ट्रिंग उपयोगिता फ़ंक्शन हैं? My_string_ * के साथ उन सभी कार्यों को उपसर्ग करें।


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