O C कार्यक्रमों के लिए सर्वोत्तम अभ्यास [बंद]


19

"यदि आप वास्तव में OO चीनी चाहते हैं - C ++ का उपयोग करें" - यह पूछने पर मुझे मेरे एक मित्र से तत्काल प्रतिक्रिया मिली। मैं जानता हूं कि दो चीजें यहां गलत हैं। पहला OO 'चीनी' नहीं है, और दूसरा, C ++ ने C को अवशोषित नहीं किया है।

हमें सी में एक सर्वर लिखने की ज़रूरत है (सामने का छोर जो पायथन में होगा), और इसलिए मैं बड़े सी कार्यक्रमों को प्रबंधित करने के लिए बेहतर तरीके तलाश रहा हूं।

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

क्या आप अपने सिस्टम की ज़रूरतों के लिए OO सार प्रदान करने के लिए एक कस्टम लाइब्रेरी बनाते हैं? ऑब्जेक्ट्स, इनकैप्सुलेशन, इनहेरिटेंस, पॉलीमोर्फिज़्म, अपवाद, पब / सब (इवेंट्स / सिग्नल), नेमस्पेस, इंट्रोस्पेक्शन , आदि (उदाहरण के लिए GObject या COS ) जैसी चीजें

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

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

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

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

नोट: कृपया सलाह न दें कि C का उपयोग C ++ के पक्ष में क्यों नहीं किया जाना चाहिए। हम उस अवस्था में अच्छी तरह से आगे बढ़ चुके हैं।


3
आप C ++ सर्वर लिख सकते हैं ताकि यह बाहरी इंटरफ़ेस है extern "C"और इसका उपयोग अजगर से किया जा सकता है। आप इसे मैन्युअल रूप से कर सकते हैं या आप इसके साथ SWIG की मदद ले सकते हैं । तो अजगर सामने वाले के लिए इच्छा सी ++ का उपयोग नहीं करने का कोई कारण नहीं है। इसलिए ऐसा नहीं है कि सी के साथ रहने के लिए कोई मान्य कारण नहीं हैं
जनवरी हडेक

1
इस प्रश्न को स्पष्टीकरण की आवश्यकता है। वर्तमान में, पैराग्राफ 4 और 5 मूल रूप से पूछते हैं कि किसी को क्या दृष्टिकोण रखना चाहिए, लेकिन फिर आप कहते हैं कि "आप इसे कैसे नहीं पूछ रहे हैं" और इसके बजाय सर्वोत्तम प्रथाओं को चाहते हैं (एक सूची?)। यदि आप इसे C में करने के लिए HOW की तलाश नहीं कर रहे हैं, तो क्या आप सामान्य रूप से OOP से संबंधित "सर्वोत्तम प्रथाओं" की सूची मांग रहे हैं? यदि हां, तो ऐसा कहें, लेकिन इस बात से अवगत रहें कि व्यक्तिपरक होने के कारण प्रश्न बंद हो जाएगा ।
कालेब

:) मैं वास्तविक उदाहरण (कोड या अन्यथा) के लिए पूछ रहा हूं कि यह कहां किया गया है - और वे मुद्दे जो उन्हें करते समय सामना करना पड़ा।
ट्रेकरोड

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

आप "ऑब्जेक्ट-ओरिएंटेड मॉडलिंग और डिज़ाइन" पर एक नज़र डालना चाहते हैं। (रूंबा एट अल।): सी जैसी भाषाओं के लिए ओओ डिज़ाइनों की मैपिंग पर एक खंड है
जियोर्जियो

जवाबों:


16

मेरे जवाब से मुझे C में जटिल परियोजनाओं को कैसे करना चाहिए (OO नहीं बल्कि C में जटिलता के प्रबंधन के बारे में):

कुंजी प्रतिरूपकता है। यह डिजाइन, कार्यान्वयन, संकलन और रखरखाव आसान है।

  • अपने ऐप में मॉड्यूल की पहचान करें, जैसे OO ऐप में कक्षाएं।
  • प्रत्येक मॉड्यूल के लिए अलग इंटरफ़ेस और कार्यान्वयन, इंटरफ़ेस में रखा गया है जो अन्य मॉड्यूल द्वारा आवश्यक है। याद रखें कि सी में कोई नाम स्थान नहीं है, इसलिए आपको अपने इंटरफेस में सब कुछ अद्वितीय बनाना होगा (जैसे, उपसर्ग के साथ)।
  • कार्यान्वयन में वैश्विक चर छिपाएँ और पढ़ने / लिखने के लिए एक्सेसर कार्यों का उपयोग करें।
  • वंशानुक्रम के संदर्भ में मत सोचो, लेकिन रचना के संदर्भ में। एक सामान्य नियम के रूप में, C ++ में C ++ की नकल करने की कोशिश न करें, यह पढ़ना और बनाए रखना बहुत मुश्किल होगा।

मेरे उत्तर से , ओ ओ सी सार्वजनिक और निजी कार्यों के लिए विशिष्ट नामकरण सम्मेलन क्या हैं (मुझे लगता है कि यह एक सर्वोत्तम अभ्यास है):

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

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

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

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

इसके अलावा, कई यूएमएल उपकरण यूएमएल आरेखों से सी कोड उत्पन्न करने में सक्षम हैं। एक खुला स्रोत एक टॉपकेस है


लिंक के लिए +1 मैं
treecoder

1
बहुत बढ़िया जवाब। प्रतिरूपकता के लिए निशाना लगाओ। OO इसे प्रदान करने वाला है, लेकिन 1) व्यवहार में यह OO स्पेगेटी के साथ समाप्त होने के लिए बहुत आम है और 2) यह एकमात्र तरीका नहीं है। वास्तविक जीवन में कुछ उदाहरणों के लिए, लिनक्स कर्नेल (C- शैली प्रतिरूपकता) और प्रोजेक्ट्स पर गौर करें जो glib (C- शैली OO) का उपयोग करते हैं। मुझे दोनों शैलियों के साथ काम करने का अवसर मिला है, और IMO C- शैली प्रतिरूपकता जीतती है।
जोह

और वास्तव में रचना विरासत से बेहतर दृष्टिकोण क्यों है? औचित्य और सहायक संदर्भों का स्वागत है। या आप केवल C कार्यक्रमों की बात कर रहे थे?
अलेक्जेंडर ब्लेक ऑक्ट

1
@AleksandrBlekh - हां मैं केवल C की बात कर रहा हूं।
मौविसील

16

मुझे लगता है कि आपको इस चर्चा में OO और C ++ को अलग करने की आवश्यकता है।

वस्तुओं को लागू करना सी में संभव है, और यह बहुत आसान है - बस फ़ंक्शन पॉइंटर्स के साथ संरचनाएं बनाएं। वह आपका "दूसरा दृष्टिकोण" है, और मैं इसके साथ जाऊंगा। एक अन्य विकल्प संरचना में फ़ंक्शन पॉइंटर्स का उपयोग नहीं करना होगा, बल्कि "कॉल" सूचक के रूप में सीधे कॉल में डेटा की संरचना को पास करना होगा। यह बेहतर है, IMHO, क्योंकि यह अधिक पठनीय है, और अधिक आसानी से पता लगाने योग्य है, और संरचना को बदलने के बिना कार्यों को जोड़ने की अनुमति देता है (यदि कोई डेटा नहीं जोड़ा गया है तो विरासत में आसान)। यह वास्तव में है कि कैसे C ++ आमतौर पर thisपॉइंटर को लागू करता है ।

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

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

नामस्थान, अपवाद, टेम्प्लेट आदि के अनुसार - मुझे लगता है कि यदि आप C तक सीमित हैं - तो आपको बस उन पर ध्यान देना चाहिए। मैंने C में OO लिखने पर काम किया है, अगर मेरे पास कोई विकल्प नहीं है (काम की उस जगह पर जो मैंने सचमुच C ++ को शुरू करने में अपना रास्ता बनाया है, और प्रबंधकों को "आश्चर्य" हुआ कि इसे एकीकृत करना कितना आसान है अंत में सी मॉड्यूल के बाकी के साथ।)।

बिना यह कहे चला जाता है कि यदि आप C ++ का उपयोग कर सकते हैं - C ++ का उपयोग करें। कोई वास्तविक कारण नहीं है।


दरअसल, आप एक संरचना से विरासत में प्राप्त कर सकते हैं और डेटा जोड़ सकते हैं: बस बच्चे के ढांचे के पहले आइटम को एक चर के रूप में घोषित करें जिसका प्रकार मूल संरचना है। फिर आप की जरूरत के रूप में डाली।
मौविसील

1
@ माउवीसील - हाँ। मैंने कहा कि। " ... इसलिए आपको या तो अपने चाइल्ड क्लास में पेरेंट स्ट्रक्चर को शामिल करना होगा, या ... "
littleadv

5
विरासत को लागू करने की कोशिश करने का कोई कारण नहीं। कोड पुन: उपयोग को प्राप्त करने के साधन के रूप में, यह एक त्रुटिपूर्ण विचार है जिसके साथ शुरू करना है। ऑब्जेक्ट रचना आसान और बेहतर है।
KaptajnKold 12

@KaptajnKold - सहमत हैं।
littleadv

8

सी में ऑब्जेक्ट ओरिएंटेशन बनाने के तरीके की मूल बातें यहां दी गई हैं

1. ऑब्जेक्ट्स और एनकैप्सुलेशन बनाना

आमतौर पर - जैसे कोई वस्तु बनाता है

object_instance = create_object_typex(parameter);

विधियाँ यहाँ दो तरीकों में से एक में परिभाषित की जा सकती हैं।

object_type_method_function(object_instance,parameter1)
OR
object_instance->method_function(object_instance_private_data,parameter1)

ध्यान दें कि ज्यादातर मामलों में, object_instance (or object_instance_private_data)लौटाया जाता है प्रकार void *.का है आवेदन इस संदर्भ के सदस्य या कार्य नहीं कर सकते हैं।

इसके बाद प्रत्येक विधि बाद के तरीके के लिए इन object_instance का उपयोग करती है।

2. बहुरूपता

हम रन टाइम में कुछ कार्यक्षमता को ओवरराइड करने के लिए कई फ़ंक्शन और फ़ंक्शन पॉइंटर्स का उपयोग कर सकते हैं।

उदाहरण के लिए - सभी object_methods को एक फ़ंक्शन पॉइंटर के रूप में परिभाषित किया जाता है जिसे सार्वजनिक और साथ ही निजी तरीकों तक बढ़ाया जा सकता है।

हम फ़ंक्शन को एक सीमित अर्थ में ओवरलोडिंग भी लागू कर सकते हैं, इसके उपयोग के तरीके var_args जो प्रिंटफ़ में परिभाषित तर्कों की चर संख्या के समान है। हां, C ++ में यह उतना लचीला नहीं है - लेकिन यह सबसे करीबी तरीका है।

3. वंशानुक्रम को परिभाषित करना

वंशानुक्रम को परिभाषित करना थोड़ा मुश्किल है, लेकिन एक संरचना के साथ निम्नलिखित कर सकता है।

typedef struct { 
     int age,
     int sex,
} person; 

typedef struct { 
     person p,
     enum specialty s;
} doctor;

typedef struct { 
     person p,
     enum subject s;
} engineer;

// use it like
engineer e1 = create_engineer(); 
get_person_age( (person *)e1); 

यहाँ doctorऔर engineerव्यक्ति से ली गई है और यह उच्च स्तर पर यह टाइपकास्ट के लिए संभव है कहते हैं person

इसका सबसे अच्छा उदाहरण GObject में उपयोग किया गया है और इससे प्राप्त वस्तुएं हैं।

4. आभासी कक्षाएं बनाना मैं एक लाइब्रेरी द्वारा एक वास्तविक जीवन उदाहरण उद्धृत कर रहा हूं जिसे जेपी डिकोडिंग के लिए सभी ब्राउज़रों द्वारा उपयोग किया जाने वाला लिबजप्रेस कहा जाता है। यह एक आभासी वर्ग बनाता है जिसे error_manager कहा जाता है, जो एप्लिकेशन ठोस उदाहरण बना सकता है और वापस आपूर्ति कर सकता है -

struct djpeg_dest_struct {
  /* start_output is called after jpeg_start_decompress finishes.
   * The color map will be ready at this time, if one is needed.
   */
  JMETHOD(void, start_output, (j_decompress_ptr cinfo,
                               djpeg_dest_ptr dinfo));
  /* Emit the specified number of pixel rows from the buffer. */
  JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
                                 djpeg_dest_ptr dinfo,
                                 JDIMENSION rows_supplied));
  /* Finish up at the end of the image. */
  JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
                                djpeg_dest_ptr dinfo));

  /* Target file spec; filled in by djpeg.c after object is created. */
  FILE * output_file;

  /* Output pixel-row buffer.  Created by module init or start_output.
   * Width is cinfo->output_width * cinfo->output_components;
   * height is buffer_height.
   */
  JSAMPARRAY buffer;
  JDIMENSION buffer_height;
};

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


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

इसके अलावा, कई तर्क होंगे कि यह बिल्कुल सही संपत्ति नहीं होगी C ++ समकक्ष की । मुझे पता है कि C-Oont में OO अपनी परिभाषा के अनुसार सख्त है। लेकिन इस तरह से काम करना कुछ मुख्य सिद्धांतों को समझेगा।

महत्वपूर्ण बात यह नहीं है कि O ++ C ++ और JAVA की तरह सख्त है। यह है कि कोई व्यक्ति ओओ सोच के साथ कोड को संरचनात्मक रूप से व्यवस्थित कर सकता है और इसे इस तरह से संचालित कर सकता है।

मैं दृढ़ता से लोगों को libjpeg का वास्तविक डिज़ाइन देखने की सलाह दूंगा और निम्नलिखित संसाधनों

ए। C
b में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग । यह एक अच्छी जगह है जहां लोग विचारों का आदान-प्रदान करते हैं
c। और यहाँ पूरी किताब है


3

ऑब्जेक्ट-ओरिएंटेशन तीन चीजों को उबालता है:

1) स्वायत्त वर्गों के साथ मॉड्यूलर कार्यक्रम डिजाइन।

2) निजी एनकैप्सुलेशन के साथ डेटा का संरक्षण।

3) वंशानुक्रम / बहुरूपता और विभिन्न अन्य सहायक वाक्यविन्यास जैसे निर्माणकर्ता / विध्वंसक, टेम्पलेट आदि।

1 दूर से सबसे महत्वपूर्ण है, और यह पूरी तरह से भाषा-स्वतंत्र भी है, यह सभी कार्यक्रम डिजाइन के बारे में है। C में आप एक .h फ़ाइल और एक .c फ़ाइल से मिलकर स्वायत्त "कोड मॉड्यूल" बनाकर ऐसा करते हैं। इसे एक OO वर्ग के समकक्ष माना जाता है। आप तय कर सकते हैं कि इस मॉड्यूल के अंदर क्या रखा जाना चाहिए, सामान्य ज्ञान, UML या OO डिज़ाइन की जो भी विधि आप C ++ प्रोग्राम के लिए उपयोग कर रहे हैं।

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

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

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

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

इसलिए मेरी सलाह है कि 1) और 2) को लागू करें और बाकी को छोड़ दें। यह सी कार्यक्रमों को लिखने का एक तरीका है जो 20 वर्षों में अच्छी तरह से सफल साबित हुआ है।


2

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

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

यह एक सामान्य-उद्देश्य OO लाइब्रेरी का एक हिस्सा है, जिसे कई डेवलपर्स को एक-दूसरे की कक्षाओं का उपयोग करने और विस्तारित करने की अनुमति देने के लिए डिज़ाइन किया गया है, इसलिए यह आपके अपने प्रोजेक्ट के लिए ओवरकिल हो सकता है। मैंने अक्सर सी परियोजनाओं को संरचनाओं और कार्यों का उपयोग करके "स्थिर" वर्ग-उन्मुख परियोजनाओं के रूप में डिज़ाइन किया है: - प्रत्येक वर्ग एक सी संरचना की परिभाषा है जो आइवर लेआउट को निर्दिष्ट करता है - प्रत्येक उदाहरण केवल इसी संरचना का एक उदाहरण है - ऑब्जेक्ट नहीं हो सकते "गड़बड़", लेकिन विधि-जैसे दिखने वाले फ़ंक्शन MyClass_doSomething(struct MyClass *object, …)परिभाषित हैं। यह ओबीजीसी दृष्टिकोण की तुलना में कोड में चीजों को स्पष्ट करता है लेकिन इसमें लचीलापन कम है।

जहां व्यापार-बंद झूठ आपके स्वयं के प्रोजेक्ट पर निर्भर करता है: ऐसा लगता है कि अन्य प्रोग्रामर आपके सी इंटरफेस का उपयोग नहीं करेंगे, इसलिए पसंद आंतरिक वरीयताओं के लिए नीचे आती है। बेशक, यदि आप तय करते हैं कि आप objc रनटाइम लाइब्रेरी की तरह कुछ चाहते हैं, तो क्रॉस-प्लेटफॉर्म objc रनटाइम लाइब्रेरी हैं जो सेवा करेंगे।


1

GObject वास्तव में किसी भी जटिलता को नहीं छिपाता है और इसकी कुछ जटिलता का परिचय देता है। मैं कहूंगा कि जब तक आपको उन्नत GObject सामान जैसे सिग्नल या इंटरफ़ेस मशीनरी की आवश्यकता नहीं है, तब तक Ad-hoc चीज GObject से आसान है।

सीओएस के साथ बात थोड़ी अलग है क्योंकि यह एक प्रीप्रोसेसर के साथ आता है जो कुछ सी ओ ओ निर्माणों के साथ सी सिंटैक्स का विस्तार करता है। गो ऑब्जेक्ट , जी ऑब्जेक्ट बिल्डर के लिए एक समान प्रीप्रोसेसर है ।

आप Vala प्रोग्रामिंग भाषा भी आज़मा सकते हैं, जो पूर्ण उच्च स्तरीय भाषा है जो C से संकलित होती है और एक तरह से जो सादे C कोड से Vala पुस्तकालयों का उपयोग करने की अनुमति देती है। यह या तो GObject का उपयोग कर सकता है, यह स्वयं ऑब्जेक्ट फ्रेमवर्क है या तदर्थ तरीके (सीमित सुविधाओं के साथ)।


1

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

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

यदि आपके पास वास्तव में निर्णय लेने के लिए कोई डिज़ाइन नहीं है, तो एक स्पाइक करें और देखें कि कोड आपको क्या बताता है।

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

संपादित करें: तो प्रबंधन द्वारा निर्णय सही तो पहले बिंदु को अनदेखा करता है।

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