2009-05-29 12 views
47

ओओ पृष्ठभूमि (सी #/जावा) से आ रहा है मैं शुद्ध सी प्रोग्रामों को अच्छी तरह से डिजाइन करने के तरीके के बारे में जानने के लिए संसाधनों की तलाश में हूं।सी प्रोग्राम डिजाइन सीखने के लिए संसाधन

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

संपादित करें: मुझे सी में प्रोग्रामिंग के प्रयोजनों के लिए पूरी तरह से ओओ छोड़ने में खुशी है, मेरी रूचि सीखने में है कि ओओ के बिना प्रोग्राम कैसे तैयार किया जाए, मैं प्रक्रियात्मक भाषाओं जैसे कार्यक्रमों को डिजाइन करने के अच्छे तरीकों के बारे में जानना चाहता हूं सी

+8

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

+0

बहुत बढ़िया सवाल, मैं एक ही स्थिति में हूं। सी स्वयं बल्कि छोटा है लेकिन बड़े अनुप्रयोगों को लिखते समय, मैं भी उन्हें डिजाइन करने के लिए अटक गया हूं ... –

उत्तर

45

This posting द्वारा जो भी शामिल है क्लासिक सी/यूनिक्स के सबसे काम करता है यूनिक्स पुस्तकों की एक सूची है। विंडोज़ पर सी प्रोग्रामिंग के लिए, पेटज़ोल्ड के Programming Windows शायद सबसे अच्छी शुरुआत है।

सी प्रोग्राम डिज़ाइन के लिए, कुछ यूनिक्स प्रोग्रामिंग पुस्तकें आपको स्निपेट बताएंगी लेकिन मुझे 'सी प्रोग्राम आर्किटेक्चर' पुस्तक से अवगत नहीं है।

आप जावा के लिए पसंद करते हैं तो सी कार्यक्रमों की के लिए कुछ सुझाव हैं:

  1. Makeuseofstack। अक्सर जब आप एक प्रक्रिया को कॉल करते हैं तो आप कॉलर के स्टैक फ्रेम में आवंटित चर और उन बिंदुओं को पास करने के लिए चाहते हैं जिन्हें आप कॉल करना चाहते हैं। malloc() के साथ गतिशील रूप से आवंटित स्मृति की तुलना में यह काफी तेज़ होगा और बहुत कम त्रुटि प्रवण होगी। जहां भी उचित हो यह करो।

  2. सी तो गतिशील garbage collection, नहीं करता है डेटा आइटम आवंटन अधिक बारीकियों है और आप make sure they get freed. चर ढेर पर आवंटित (1 देखें) अधिक 'मुहावरेदार' जहां वे लागू कर रहे हैं करने के लिए उन पर नज़र रखना है। इसके अलावा, आपको उन्हें मुक्त करने की ज़रूरत नहीं है - यह स्थानीय चर के लिए एक बोनस है।

  3. (2) के Apropos, एक आर्किटेक्चर पर विचार करें जहां आपके फ़ंक्शन एक स्थिति या त्रुटि कोड लौटाते हैं और स्टैक का उपयोग करके डेटा को बाहर और बाहर पास करते हैं (1)।

  4. पता करें कि setjmp() और longjmp() क्या करें। वे संरचित अपवाद हैंडलिंग कार्यक्षमता के बदले सामान्य त्रुटि हैंडलर तंत्र के लिए काफी उपयोगी हो सकते हैं।

  5. C does not support exceptions. देखें (3)।

  6. Lint आपका मित्र है। Splint भी दोस्ताना है।

  7. जानें कि preprocessor क्या करता है और यदि आप कर सकते हैं तो आपको इसके साथ क्या नहीं करना चाहिए।

  8. endian-ness, word alignment, pointer arithmetic और अन्य निम्न-स्तरीय आर्किटेक्चरल आर्कना के इन्स और आउट जानें। लोकप्रिय राय के विपरीत ये रॉकेट विज्ञान नहीं हैं। यदि आप उत्सुक महसूस कर रहे हैं, तो असेंबली भाषा में डबलिंग करने का प्रयास करें और इसके बारे में एक कार्य ज्ञान प्राप्त करें। आपके सी प्रोग्राम में क्या हो रहा है, इसकी समझ के लिए यह बहुत कुछ करेगा।

  9. सी मॉड्यूल गुंजाइश की कोई अवधारणा नहीं है, तो भी शामिल है, प्रोटोटाइप घोषणाओं, और extern और static के उपयोग निजी स्कोप और आयात पहचानकर्ता बनाने के लिए के आपके उपयोग की योजना है।

  10. सी में

    जीयूआई प्रोग्रामिंग पर allplatforms.

  11. के अनुरूप कठिन है (10) कम से कम एक पटकथा भाषा के सी एपीआई जानने जैसे Tcl, Lua या कई मामलों में Python. सी का सबसे अच्छा उपयोग है एक ऐसे अनुप्रयोग पर एक कोर उच्च प्रदर्शन इंजन के रूप में जो कुछ और में लिखा गया है।

  12. एक कन्स्ट्रक्टर के बराबर एक प्रारंभिक कार्य है जहां आप उस आइटम को पॉइंटर में पास करते हैं जिसे आप सेट अप करना चाहते हैं। अक्सर आप इसे setup_foo(&my_foo) जैसा दिखने वाले फ़ंक्शन पर कॉल के रूप में देख सकते हैं। आवंटन से आवंटन को अलग करना बेहतर है, क्योंकि आप इस फ़ंक्शन का उपयोग स्टैक पर आवंटित किए गए आइटम को आरंभ करने के लिए कर सकते हैं। एक समान सिद्धांत विनाशकों पर लागू होता है।

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

  14. सी/यूनिक्स किताबें, देर से डब्ल्यू रिचर्ड स्टीवंस द्वारा लिखे गए लोगों की तरह वास्तव में अच्छे लोग अमेज़ॅन बाजार के माध्यम से काफी सस्ते में उपलब्ध हैं। किसी विशेष क्रम में, K&R, स्टीवंस APUE और UNP 1& 2, की एक प्रति प्राप्त Dragon book,Rochkind,Programming Pearls,Petzold और Richter (अगर विंडोज पर काम कर रहा है) और अन्य क्लासिक सी के किसी भी/यूनिक्स काम करता है। पढ़ें, एक पेंसिल के साथ उन पर लिखे और आमतौर पर किताबों के साथ बातचीत।

  15. वेब पर कई अच्छे C/Unix programming संसाधन हैं।

  16. Ten Commandments of C Programming और कुछ मेटा चर्चा को पढ़ें और समझें कि आज्ञाओं के पीछे क्यों और कहां है। यह अपनी उम्र को कुछ हद तक दिखा रहा है, हालांकि इसमें से अधिकांश अभी भी प्रासंगिक हैं और अस्पष्ट कंपाइलर अभी भी quite common in the embedded systems world हैं।

  17. Lex and Yacc यदि आप पार्सर्स लिखना चाहते हैं तो आपका मित्र हैं।

  18. Navicore points out below (+1) के रूप में, हैन्सन के 'C Interfaces and Implementations' एक उदाहरण के एक समूह के साथ मॉड्यूलर वास्तुकला के लिए इंटरफ़ेस/कार्यान्वयन डिजाइन पर संक्षिप्त जानकारी दी गई है। मैंने वास्तव में इस पुस्तक के बारे में सुना है और इसके बारे में अच्छी बातें सुनी हैं, हालांकि मैं इसे पढ़ने का दावा नहीं कर सकता।मैंने ऊपर वर्णित सी मुहावरे के अलावा, यह अवधारणा तर्कसंगत रूप से अच्छी प्रक्रियात्मक डिजाइन का मूल है। वास्तव में, मॉड्यूल -2 जैसे अन्य प्रक्रियात्मक भाषाएं वास्तव में इस अवधारणा को उनके डिजाइन में स्पष्ट बनाती हैं। प्रिंट में 'सी प्रोग्राम आर्किटेक्चर' पुस्तक के लिए यह सबसे नज़दीकी चीज हो सकती है।

  19. C FAQ पढ़ें।

+2

ये निश्चित रूप से कुछ अच्छे बुलेट पॉइंट हैं। मुझे लगता है कि setjmp और longjmp इतनी प्रमुखता से उल्लेख किया है। शक्तिशाली होने पर, इन दोनों का उपयोग बहुत दुर्लभ होना चाहिए, नहीं? अगर आपको लगता है कि गोटो का दुरुपयोग खराब है (ज्यादातर लोग ऐसा करते हैं), setjmp और longjmp (yikes!) के दुरुपयोग की कल्पना करें।दृढ़ता से, मैं यह भी जोड़ूंगा कि यह आपकी खुद की असेंबली लिखने में न केवल महत्वपूर्ण है, बल्कि सी कंपाइलर द्वारा उत्पन्न असेंबली का विश्लेषण करने के लिए भी महत्वपूर्ण है कि वास्तव में क्या हो रहा है। –

+1

Setjmp गोटो से थोड़ा अधिक करता है। यह समारोह के स्थानीय संदर्भ को गिलहरी करता है। आप आमतौर पर संरचित अपवाद तंत्र के बदले जेनेरिक त्रुटि हैंडलर बनाने के लिए इसका उपयोग करेंगे। सलाह यह समझना है कि यह तंत्र कैसे काम करता है। – ConcernedOfTunbridgeWells

+2

सी में जावा में कोई अपवाद नहीं है, और कुछ ऐसा करने के लिए गोटो का उपयोग करना सही काम है। – hlovdal

2

सी में ओओ प्रोग्रामिंग के संबंध में एक अलग प्रश्न से कुछ interesting responses यहां दिया गया है। मैंने कुछ सी कोड के बारे में एक पोस्ट बनाया है जिसके साथ मैंने काम किया है, जो मूल रूप से प्रत्यारोपित ऑब्जेक्ट ओरिएंटेशन वर्चुअल विधियों सहित नहीं है।

अगर मैं सी कोडिंग कर रहा था, तो मैं 'ऑब्जेक्ट' को परिभाषित करने के लिए इस तकनीक का उपयोग करूंगा।

मुझे लगता है कि Design Patterns को ध्यान में रखना हमेशा सहायक होता है, और अधिकांश भाषाओं में इसे कार्यान्वित किया जा सकता है।

यहां एक अच्छा पीडीएफ object oriented C programming पर चर्चा कर रहा है।

+1

यदि आप सी में ओओ करना चाहते हैं, तो आपको वास्तव में सी ++ का उपयोग करना चाहिए। यदि आप सी का उपयोग करना चाहते हैं, तो आपको अच्छा, स्पष्ट प्रक्रियात्मक कोड लिखना चाहिए। –

+1

"यदि आप सी का उपयोग करना चाहते हैं, तो आपको अच्छा, स्पष्ट प्रक्रियात्मक कोड लिखना चाहिए।" क्या आप यह सीखने के लिए किसी संसाधन को अनुशंसा करने में सक्षम होंगे? यह वह चीज है जिसे मैं ढूंढ रहा हूं। – Kingsley

+0

ऐसे मामले हैं जहां सी का उपयोग करना आवश्यक है। सभी प्रोसेसर में सी ++ कंपाइलर्स नहीं होते हैं - खासकर यदि आप एक एम्बेडेड स्थिति में जा रहे हैं। जब आप कम-स्तर वाले हार्डवेयर पर चलाने के लिए कोड के साथ काम कर रहे हों, तो यह अभी भी सी में कोड करने के लिए आपकी सबसे अच्छी रुचि में है, और उसके बाद एक C++ wrapper है। – Kieveli

6

मेरे OO से सी के लिए जा रहा वापस चिंताओं डेविड हैन्सन के 'सी इंटरफेस और कार्यान्वयन "में संबोधित कर रहे थे।

C Interfaces and Implementations

गंभीरता से, अपने दृष्टिकोण गलती से बचने धागा है कि कई गैर ऊ सिस्टम के रूप में हवा की बड़ी गेंद के निर्माण में एक बहुत बड़ा अंतर बना दिया।

+1

+1 - मुझे याद दिलाने के लिए धन्यवाद। मैंने इस पुस्तक के बारे में सुना है लेकिन मैंने इसे कभी नहीं पढ़ा है। इंटरफेस/कार्यान्वयन एक महत्वपूर्ण प्रक्रियात्मक पद्धति है और मॉड्यूल -2 में स्पष्ट किया गया है। मेरी पोस्ट में यह इंगित करेगा क्योंकि मुझे लगता है कि यह 'सी आर्किटेक्चर' पुस्तक की सबसे नज़दीकी चीज हो सकती है जिसे मैंने कभी सुना है। अच्छी सोच 99; -} – ConcernedOfTunbridgeWells

0

हालांकि यह कुछ हद तक भाषा-अज्ञेय पाठ के रूप में लिखा गया है, Code Complete निर्माण प्रथाओं के साथ कोड संरचना और संगठन पर बहुत अच्छा मार्गदर्शन प्रदान करता है।

1

बड़े अनुप्रयोग? सी की ताकत तब होती है जब आपको डिवाइस स्तरीय, शेड्यूलर और अन्य ओएस स्वादयुक्त चीज़ों जैसे निम्न स्तर की चीज़ों से निपटना होता है।

आप सी कि OO की तरह संचालित कर सकते हैं, लेकिन यह है कि utlimately में एक अभ्यास की तरह महसूस होगा फिर से खोज करने पहिया ..

+0

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

+0

ओह ठीक है - ठीक है, ऐप को मॉड्यूल में विभाजित करने का प्रयास करने के लिए एक आम तरीका है और फिर प्रत्येक मॉड्यूल को .c फ़ाइल में असाइन करें, हेडर (.h) फ़ाइलों में अपनी योग्यता का विज्ञापन करें, और फिर स्रोत का समाधान करने के लिए # शामिल करें निर्भरता। कुछ केएलओसी तक बहुत अच्छी तरह से काम करता है। जहां चीजें आम तौर पर सभी नाशपाती आकार जाती हैं, तब निर्भरता नियंत्रण से बाहर हो जाती है, और .h फाइलें अन्य .h फ़ाइलों सहित शुरू होती हैं, या एकाधिक स्रोत निर्देशिका आवश्यक हो जाती हैं, या अंतिम डरावनी, कोई भी .h फ़ाइलों में परिवर्तनीय घोषणाएं शुरू करता है .. – JustJeff

1

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

फिर, एक बोनस के रूप में, vim में 'जी.डी.' कमांड हमेशा एक समारोह की परिभाषा के लिए, जाना होगा अगर यह एक ही फाइल में है :)

+1

प्रोटोटाइप और शरीर को सिंक में रखने के अलावा, एक .c फ़ाइल के सिर पर प्रोटोटाइप का एक अच्छा ब्लॉक सामग्री के लिए दस्तावेज़ीकरण का एक आसान हिस्सा है। – ConcernedOfTunbridgeWells

संबंधित मुद्दे