क्या C में कोई "डिज़ाइन पैटर्न" हैं? [बन्द है]


84

मुझे पता है कि डिज़ाइन पैटर्न आमतौर पर कुछ ऐसा होता है जो OO प्रोग्रामिंग से जुड़ा होता है, लेकिन क्या आपके पास कुछ पैटर्न हैं जो आप अक्सर उपयोग करते हैं जब आप सी प्रोग्राम करते हैं?

मुझे शास्त्रीय OO पैटर्न के सरल अनुवादों में कोई दिलचस्पी नहीं है और कृपया डफ के उपकरण का उल्लेख न करें। ;-)

जवाबों:


86

एडम टॉर्नहिल द्वारा मेरा पसंदीदा "पैटर्न इन सी" श्रृंखला है :

इसके अलावा: मैं हमेशा gotoडेकोरेटर पैटर्न के लिए एक महान गरीब आदमी के उपकरण के रूप में सोचता हूं ।

अपडेट : मैं अत्यधिक Rust ( जंग-lang.org ) का उपयोग करने की सिफारिश करूंगा बजाय सी के जहां आपको सी का उपयोग करना आवश्यक है। रस्ट में सी के सभी फायदे हैं, जिसमें सी के साथ गति और बाइनरी लाइब्रेरी संगतता शामिल है, लेकिन यह सुनिश्चित करने के लिए कंपाइलर बहुत संभालता है कि कोड मेमोरी सुरक्षित है और इसमें डेटा रेस नहीं है। यह पोर्टेबल भी है, सामान्य कार्यों के लिए एक मानक पुस्तकालय है, और विभिन्न डिज़ाइन पैटर्न के साथ प्रोग्राम करना बहुत आसान है।


9
क्या आप विस्तार से बता सकते हैं कि gotoसज्जाकारों के साथ क्या करना है?
गुई प्राग

1
यह एडम टॉर्नहिल (पीटरसन) की एक बहुत छोटी श्रृंखला है। उनकी पूरी पुस्तक उपलब्ध है। पैटर्न का यह छोटा सेट आपको सी में एक लंबा रास्ता तय करेगा
क्लिंट पाचल

10

डिज़ाइन पैटर्न को भाषा की अनुपलब्ध सुविधाओं के रूप में देखा जा सकता है। डिजाइन पैटर्न का परिचय : पुन: प्रयोज्य वस्तु उन्मुख सॉफ्टवेयर के तत्व :

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

इटैलिक में वाक्य आपके प्रश्न का उत्तर है।


7

कॉलबैक के माध्यम से बहुरूपता, जैसे मानक पुस्तकालय का qsortकार्य। सभी की जरूरत है दो तत्वों की तुलना करने का एक तरीका है, और यह उनमें से एक सरणी को सॉर्ट कर सकता है।

आप एक प्रकार के प्रासंगिक गुणों का प्रतिनिधित्व करने के लिए फ़ंक्शन (vtables) के सेट का उपयोग करके इससे बहुत अधिक परिष्कृत हो सकते हैं ताकि एक सामान्य दिनचर्या इसे उपयोगी रूप से संसाधित कर सके। उदाहरण के लिए, पढ़ने, लिखने, आदि एक खुली फ़ाइल, या नेटवर्क पोर्ट पर कॉल करता है।


मुझे कॉलबैक का उपयोग पसंद है। आप एक सामान्य डेटा संरचना ट्रैवर्सिंग फ़ंक्शन बना सकते हैं जो प्रत्येक तत्व पर कॉलबैक फ़ंक्शन निष्पादित करता है।
15

5

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

उदाहरण (आलसी प्रारंभ)


हाँ, वे शायद हैं, लेकिन आप आमतौर पर C में इनमें से किसी एक पैटर्न को कैसे लागू करेंगे?
14

2
बेहतर बिंदु यह है कि आपको सी में ख़राब डिज़ाइन पैटर्न (जैसे सिंगलटन, उर्फ ​​ग्लोबल वैरिएबल) को लागू नहीं करना चाहिए या उस मामले में किसी भी भाषा में नहीं करना चाहिए।
आर .. गिटहब स्टॉप हेल्पिंग ICE

4
@ आर .: मुझे वास्तव में नहीं लगता कि सिंगलटन एक खराब पैटर्न है। यह कर सकते हैं उपयोगी और कुछ मामलों में उत्पादक हो, कर सकते हैं कुछ मामलों में कोड गुणवत्ता के लिए हानिकारक हो। लेकिन डेवलपर को डिजाइन पेटेंट के फायदे और नुकसान को जानना चाहिए , और उनका उपयोग विवेकपूर्ण तरीके से करना चाहिए।
Vlad


2

डिज़ाइन पैटर्न अक्सर ऐसी चीजों को मॉडल करते हैं जो मौजूदा वातावरण प्रदान करता है से सिर्फ एक स्तर पर हैं। यदि आप C को उसके मानक पुस्तकालय के साथ लेते हैं तो पर्यावरण के रूप में एक प्रख्यात डिज़ाइन पैटर्न ऑब्जेक्ट ओरिएंटेशन है।


2

वर्चुअल फ़ाइल सिस्टम डिज़ाइन पैटर्न सीखने के लिए एक आदर्श उदाहरण है।

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