C ++ लाइब्रेरी एपीआई डिज़ाइन


12

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

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

मैं C ++ पुस्तकालयों पर काम करते समय द्विआधारी संगतता रखने के लिए अन्य कैविएट और चीजों की भी तलाश कर रहा हूं।

क्या ऐसी चीजों पर कोई अच्छी वेबसाइट या किताब है?


मैंने इसे इस तरह से संभाला: sivut.koti.soon.fi/~terop/GameApi.html - अर्थात जब लिब के अंदर टेम्प्लेट हैं, तो इसमें से कोई भी एपी में नहीं है ...
tp1

1
std::unique_ptrबहुत नया सामान है। वास्तव में आप क्या सोचते था और अधिक अपने प्रस्तावित API के बारे में उपयुक्त? जिस तरह से आपको सभी संसाधनों को मैन्युअल रूप से प्रबंधित करना पड़ा, वस्तुतः लीक और डबल डिलीट की गारंटी, उदाहरण के लिए? या जिस तरह से आपके कई प्रकार के एक या दो अक्षर के नाम थे, जिससे उनका उद्देश्य असंभव हो गया?
डेडएमजी सेप

1
@ tp1: लेकिन आपने यह देखने के लिए कोई ध्यान नहीं दिया कि मैंने उन्हें संभाल लिया है। आपने अभी इसके बारे में कुछ किए बिना "हैन्डल टेम्प" कहा। मैंने उन्हें नहीं संभाला और अब क्या? एक RAII वर्ग का उपयोग करने के बजाय जो ऐसी गलतियों की अनुमति नहीं देता है। यदि आपने उपयोग unique_ptrकिया होता तो उस तरह कोड लिखना संभव नहीं होता।
डेडएमजी सेप

1
@ tp1: मैंने देखा कि एनव को नष्ट किया जा सकता है। तो इतना ही है। वस्तुओं को प्रबंधित करने के लिए कोई कार्यक्षमता नहीं दिखाई देती है, बिल्कुल भी नहीं। अगर मैं "सब कुछ मैंने कभी बनाया" या "कुछ भी नहीं" की तुलना में स्मृति को अधिक ठीक से प्रबंधित करना चाहता था, तो ऐसा प्रतीत होता है कि मैं खराब हूँ।
डेडएमजी सेप

3
कृपया सॉफ़्टवेयर इंजीनियरिंग चैट के लिए कोई विस्तारित बातचीत करें । क्या किसी उपयोगी जानकारी को प्रश्न या उत्तर में शामिल किया जा सकता है?
ChrisF

जवाबों:


12

वास्तव में एक किताब है जो आप चाहते हैं ठीक है। यह कॉल, उचित रूप से पर्याप्त है, C ++ के लिए एपीआई डिज़ाइन। पुस्तक की वेबसाइट में पुस्तक से स्रोत कोड और इरेटा भी है।


1
पुस्तक के लिए निश्चित +1! मैं यह सुझाव देने के लिए आया था, लेकिन पता चला कि आपने मुझे हरा दिया।
zxcdw

+1: मैं इस पुस्तक को पढ़ रहा हूं और यह एक महान संसाधन है। अत्यधिक सिफारिशित।
कोर्चकिडू

3

यह बहुत असंभव है। साधारण तथ्य यह है कि कभी-कभी, आपको काम करने के लिए कंपाइलर की आवश्यकता होती है, और आप केवल उस आवश्यकता को दूर नहीं कर सकते हैं। ऐसा कोई फ़ंक्शन std::vectorनहीं है जो हेडर-ओनली लाइब्रेरी नहीं बना सकता है। संकलक कई जादूगर काम कर सकते हैं, लेकिन आप इसे लागू किए बिना उन्हें नहीं कर सकते हैं, और यह जीवन का एक तथ्य है।

यहाँ आप क्या कर सकते हैं: उन टेम्पलेट्स का उपयोग न करें जहाँ आपको उनकी आवश्यकता नहीं है। यहाँ आप क्या नहीं कर सकते हैं: कुछ और।

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


2
मैंने उल्लेख किया है कि एक उदाहरण के रूप में सोचने के लिए। मैं जो देख रहा हूं वह अन्य समान मुद्दों पर मार्गदर्शन है, जिन्हें मुझे तैयार करना चाहिए, और उन लोगों को संभालने के लिए सर्वोत्तम अभ्यास।
जोहान्स

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