2010-09-20 12 views
14

क्या निर्भरता के इस तरह का एक पैटर्न है कि सबकुछ केवल हेडर फाइलों में रखना असंभव है? क्या होगा अगर हमने प्रति वर्ग एक वर्ग के नियम को लागू किया हो?क्या हेडर-केवल लाइब्रेरी लिखना असंभव है?

इस सवाल के प्रयोजनों के लिए, हम स्थिर बातें :) उपेक्षा करते

+0

क्या होगा यदि हेडरलेस लाइब्रेरी ए डीएलएल-केवल लाइब्रेरी बी पर निर्भर करता है? या क्या आखिरी वाक्य से इनकार किया गया है? बेशक आप हमेशा इसे हेडर के रूप में पुन: कार्यान्वित कर सकते हैं, इसलिए शायद असंभव नहीं है। – Skurmedel

+0

क्या आपको अन्य भाषाओं से बात करनी है? – Anycorn

+0

@ स्कुरमेडेल: सी ++ कोई डीएलएल जैसी सुविधा को परिभाषित नहीं करता है, इसलिए कुछ भी कार्यान्वित किया जा रहा है। मुझे संदेह है कि यह कोई फर्क पड़ता है हालांकि। –

उत्तर

7

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

+4

"जब भी आपकी लाइब्रेरी बदलती है, तो आप अपने सभी क्लाइंटबेस को अपने पूरे कोडबेस को फिर से कंपाइल करने के लिए मजबूर करते हैं" - इससे भी बदतर, आप उन्हें अपने लाइब्रेरी में बदलाव करते समय अपनी लाइब्रेरी को फिर से कंपाइल करने के लिए बाध्य करते हैं। –

+4

हालांकि यह लाइब्रेरी का उपयोग करने के लिए तुच्छ बनाता है, और जब यह अनुकूलित करता है तो संकलक को मदद करता है। – GManNickG

+2

@GMan: कंपाइलर पर निर्भर करता है। आईआईआरसी, दोनों जीसीसी और एमएसवीसी के पास अब रिलीज बिल्ड के लिए लिंक कोड कोड पीढ़ी की सुविधा है, जो संभावित प्रदर्शन अंतरों में सबसे अधिक (यदि नहीं सभी) को हटा देता है। –

2

प्रति वर्ग नियम एक वर्ग व्यर्थ है। इस काम नहीं करता है:

#include <header1> 
#include <header2> 

तो इस वसीयत के कुछ बदलाव:

#include <header1a> 
#include <header2> 
#include <header1b> 

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

class A 
{ 
// ... 
void *pimpl; 
} 

क्या यह संभव है कि निजी कार्यान्वयन, pimpl, एक की घोषणा पर निर्भर करता है? यदि ऐसा है तो pimpl.cpp (शीर्षलेख के रूप में) दोनों को पहले से पालन करना होगा और एएच का पालन करना होगा। लेकिन चूंकि आप हमेशा एक बार फिर से (शून्य *) का उपयोग कर सकते हैं और पिछले शीर्षकों में इनलाइन फ़ंक्शंस का उपयोग कर सकते हैं, यह किया जा सकता है।

बेशक, मैं गलत हो सकता था। किसी भी मामले में: आईक।

+2

मुझे नहीं लगता कि कोई भी शीर्षलेख केवल लाइब्रेरी में किसी भी प्रकार की पिंपल क्लास का उपयोग क्यों करेगा, यह विचार दिया गया है कि अगर पिंपल मुहावरे अलग-अलग अनुवाद इकाइयों में चीजों को तोड़ना है ... –

+0

मैं मानता हूं कि इसमें कोशिश करने में कोई बात नहीं है एक हेडर केवल लाइब्रेरी बनाते समय कार्यान्वयन स्पष्ट रूप से अनुपयुक्त होता है। शायद यह आपके लिए क्या मतलब नहीं है;) मैंने यह साबित करने के लिए एक उपकरण के रूप में पिंपल लाया है (शब्द 'साबित' शब्द का उपयोग करके बहुत कम हो सकता है)। – paul

5

यह संभव है, मैं कहूंगा, कई भाषा सुविधाओं का उपयोग न करने की स्पष्ट स्थिति में: जैसा कि आपने देखा, static कीवर्ड के कुछ उपयोग।

इसे कुछ चाल की आवश्यकता हो सकती है, लेकिन उनकी समीक्षा की जा सकती है।

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

उन 3 का सम्मान अंक, मेरा मानना ​​है कि आप पूरी तरह से हेडर-लाइब्रेरी लिखने में सक्षम होंगे (कोई भी मुझे कुछ और याद करता है?)

कई बूस्ट लाइब्रेरीज़ ने हेडर-केवल होने के लिए समान चाल का उपयोग किया है, भले ही उनका कोड था पूरी तरह से टेम्पलेट नहीं।उदाहरण के लिए Asio बहुत बूझकर करता है और विकल्प झंडे का उपयोग कर का प्रस्ताव (release notes for Asio 1.4.6 देखें):

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

इस तरह (कीमत पर) लाइब्रेरी देवताओं के हिस्से पर कुछ और प्रयासों के) ग्राहकों को अपना केक मिलता है और इसे भी खाओ। यह मुझे लगता है कि यह एक बहुत अच्छा समाधान है।

नोट: मैं सोच रहा हूँ कि क्या static कार्यों inlined किया जा सकता है, मैं गुमनाम नामस्थान उपयोग करने के लिए अपने आप को इतना वास्तव में इसे में देखा कभी नहीं ... मेरे लंबे कैरियर में

+0

पुनः # 1: क्या आप एक परिदृश्य स्केच कर सकते हैं जहां यह आवश्यक होगा? मैंने एक की कल्पना करने की कोशिश की, लेकिन किसी भी चीज के साथ नहीं आ सकता था जिसे सभी आवश्यक परिभाषाओं के पीछे रेखांकित फ़ंक्शन परिभाषाओं को हल करके हल नहीं किया जा सकता है। – sbi

1

पसंद करते हैं, मैं निर्भरता भर में नहीं आए हैं पैटर्न जो हेडर-केवल कार्यान्वयन को अस्वीकार करेगा।

आपको याद है कि यदि आपके पास कक्षाओं के बीच परिपत्र निर्भरता है, तो आपको या तो अमूर्त इंटरफेस - कंक्रीट कार्यान्वयन प्रतिमान, या टेम्पलेट का उपयोग करने की आवश्यकता हो सकती है (टेम्पलेट का उपयोग करके आप टेम्पलेट पैरामीटर के गुण/संदर्भों को आगे संदर्भित करने की अनुमति देते हैं, जो हैं तत्काल के दौरान बाद में हल)।

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

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