OO C सार्वजनिक और निजी कार्यों के लिए विशिष्ट नामकरण परंपराएँ क्या हैं? [बन्द है]


12

लघु प्रश्न
क्या OO C परियोजना के 'सार्वजनिक' और 'निजी' सदस्यों के नाम का एक विशिष्ट तरीका है?

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

उदाहरण हैडर

#ifndef _MODULE_X_H_
#define _MODULE_X_H_

bool MOD_X_get_variable_x(void);
void MOD_X_set_variable_x(bool);

#endif /* _MODULE_X_H_ */

उदाहरण स्रोत

// Module Identifier: MOD_X 
#include "module_x.h"

// Private prototypes
static void mod_x_do_something_cool(void);
static void mod_x_do_something_else_cool(void);

// Private Variables
static bool var_x;

// Public Functions - Note the upper case module identifier
bool MOD_X_get_variable_x(void)      {return var_x;}
void MOD_X_set_variable_x(bool input){var_x = input;}

// Private Functions  - Note the lower case module identifier
void mod_x_do_something_cool(void){
     // Some incredibly cool sub routine 
}

void mod_x_do_something_else_cool(void){
     // Another incredibly cool sub routine 
}

2
+1 दिलचस्प विषय के लिए: OO डिज़ाइन C में लागू किया गया! मैं शीर्ष लेख में सार्वजनिक कार्यों को घोषित करने के आपके दृष्टिकोण का पालन करूंगा और निजी लोगों को कार्यान्वयन में स्थिर कार्यों के रूप में .c फ़ाइल। मुझे यकीन नहीं है कि आपको एक विशेष नामकरण सम्मेलन की आवश्यकता क्यों है। क्यों नहीं, उदाहरण के लिए, दोनों सार्वजनिक और निजी कार्यों के लिए अपरकेस?
जियोर्जियो

13
ब्रेज़न स्ट्रॉस्ट्रुप ने ऑब्जेक्ट-ओरिएंटेड सी ...
एंट

C में ऑब्जेक्ट-आधारित प्रोग्रामिंग करने के एक और दिलचस्प तरीके के लिए आप X11 प्रोग्रामर से परिचित Xt ग्राफिक्स टूलकिट को देख सकते हैं। Ref: en.wikipedia.org/wiki/X_Toolkit_Intrinsics
sdg

@ जियोर्जियो: सार्वजनिक और निजी सदस्यों के लिए ऊपरी बनाम निचले मामले की बात यह है कि कोड की समीक्षा करते समय या कोड को बनाए रखने पर यह एक नज़र में पता चल जाता है कि क्या इसकी सार्वजनिक या निजी घोषणा के लिए खोज किए बिना है।
एडम लुईस

@Ant: ऑब्जेक्टिव-सी एक और संभावना है। मुझे लगता है कि यहाँ बिंदु यह है कि यदि आप C में प्रोग्रामिंग कर रहे हैं तो भी आप OO डिज़ाइन का उपयोग कर सकते हैं। बेशक अगर मैं ओओपी का भारी उपयोग करता हूं तो मैं एक ओओ भाषा के लिए जाता हूं।
जियोर्जियो

जवाबों:


17

मेरे द्वारा उपयोग किया जाने वाला सम्मेलन है:

  • सार्वजनिक समारोह (हेडर फ़ाइल में):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
  • निजी फ़ंक्शन (कार्यान्वयन फ़ाइल में स्थिर)

    static functionname(struct Classname * me, other args...)

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

इसके अलावा, ओओ-सी क्या है जिस तरह से वस्तु को पहले तर्क के रूप में पारित किया जाता है।


1
+1 कोई बड़ा सी विशेषज्ञ नहीं है, लेकिन यह ठोस और सही दिखता है (यहां तक ​​कि एन्कैप्सुलेशन शब्दों में, जिसे मैंने कभी भी सी के साथ सहसंबंधित नहीं किया था)।
यम मारकोविक

कुछ संकलक द्वारा लागू पहचानकर्ता वर्ण सीमाओं से सावधान रहें (उदाहरण के लिए कुछ के लिए 31 वर्ण!)
12

8

आमतौर पर अधिवेशन में निजी कार्यों को हेडर में नहीं रखा जाता है

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

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

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


संभवतः C में ऑब्जेक्ट-ओरिएंटेड कोड का सबसे बड़ा टुकड़ा Gnome प्लेटफॉर्म है। आप सबसे आसानी से GObject लाइब्रेरी पर कन्वेंशन देख सकते हैं , जो सबसे निचले स्तर की बेस क्लास प्रदान करता है । यह मोटे तौर पर मैं ऊपर वर्णित है और पूरे सूक्ति में प्रयोग किया जाता है।


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

-1

यदि एक वास्तविक "वर्ग" मौजूद है, एक संरचना के रूप में, अपारदर्शी प्रकार या समान है, तो मैं इसे इसके अनुसार नाम देता हूं:

typedef struct classname_t classname_t; 

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

आपके द्वारा किया जाने वाला अगला काम सभी सार्वजनिक कार्यों के लिए एक नामकरण उपसर्ग के साथ आना है। आमतौर पर कुछ 3 अक्षर वाली बात। "सेब वर्ग" से संबंधित सभी कार्यों को संभवतः नाम दिया जाएगा app_set_something(), app_get_something()आदि।

फिर आप एक सुसंगत नामकरण सम्मेलन का उपयोग करना चाहेंगे। "निर्माता" नाम किया जा सकता है app_init()या app_construct(), "नाशक app_clear(), app_destruct(), app_destroy()या इसी तरह की। अपने सभी वर्गों के लिए एक ही नामकरण परंपरा का उपयोग करें। तब सेटर / गेटर कार्यों के लिए भी ऐसा ही, और इतने पर।

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

मैं ऊपरी मामले को निजी और सार्वजनिक के बीच अंतर करने के तरीके के रूप में उपयोग करने की सिफारिश नहीं करूंगा। लगभग सभी सी कोडिंग मानकों में कन्वेंशन यह है कि सभी अक्षर ऊपरी मामले एक स्थिर, मैक्रो या एक पूर्व-प्रोसेसर परिभाषित इंगित करते हैं। उस कन्वेंशन का उपयोग सी मानक द्वारा, विंडोज एपीआई द्वारा, लिनक्स कर्नेल द्वारा और इसी तरह किया जाता है।


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