दिलचस्प पोस्ट
MySQLdb का उपयोग कर "SELECT … WHERE … IN …" निष्पादित कर रहा है मैं पर्ल में वास्तविक सरणी संदर्भ के लिए सरणी संदर्भ के stringified संस्करण को कैसे रूपांतरित कर सकता हूँ? पायथन पंडों में सभी डुप्लिकेट पंक्तियों को छोड़ दें ऑरेकल में चुनिंदा क्वेरी के लिए डिफ़ॉल्ट पंक्ति क्रम कॉलम जोड़ना जिसमें दूसरे कॉलम के बिन मूल्य शामिल हैं गतिशील रूप से निर्मित तत्वों के लिए मैं ट्विटर बूटस्ट्रैप टूलटिप्स कैसे बाँटूं? enum को आधुनिक सी ++ 11 / सी ++ 14 और भविष्य में सी ++ 17 / सी ++ 20 संरचना पैडिंग और पैकिंग पायथन 2 से स्ट्रिंग (फ्लोट) पायथन 3 में अधिक अंक क्यों वापस करता है? OpenID और OAuth के बीच क्या अंतर है? WPF / MVVM लाइट टूलकिट के साथ विंडो समापन ईवेंट को संभालना मैं फ़ाइल पथ प्राप्त करने के लिए ड्रैग-एंड-ड्रॉप इन स्विंग का उपयोग कैसे कर सकता हूं? WPF विंडो में बाहरी ऐप को होस्ट करना क्या ओपनसीएल प्रणाली बाएं हाथ या दाएं हाथ से समन्वय करता है? ऐप एक्सेस टोकन प्राप्त करने का प्रयास कर रहा है

क्या पीआईएमपीएल मुहावरे वास्तव में अभ्यास में प्रयोग किया जाता है?

मैं हर्ब सटर द्वारा पुस्तक "असाधारण सी ++" पढ़ रहा हूं, और उस पुस्तक में मैंने पीआईएमपीएल मुहावरों के बारे में सीखा है असल में, विचार एक class के private वस्तुओं के लिए एक संरचना बनाने और गतिशील रूप से संकलन समय को कम करने के लिए उन्हें आवंटित करना है (और एक बेहतर तरीके से निजी कार्यान्वयन भी छिपाना)।

उदाहरण के लिए:

 class X { private: C c; D d; } ; 

इसमें बदला जा सकता है:

 class X { private: struct XImpl; XImpl* pImpl; }; 

और, सीपीपी में, परिभाषा:

 struct X::XImpl { C c; D d; }; 

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

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

वेब के समाधान से एकत्रित समाधान "क्या पीआईएमपीएल मुहावरे वास्तव में अभ्यास में प्रयोग किया जाता है?"

तो, मैं सोच रहा हूं कि यह तकनीक वास्तव में अभ्यास में प्रयोग की जाती है? क्या मैं इसे हर जगह, या सावधानी के साथ उपयोग करना चाहिए?

बेशक यह प्रयोग किया जाता है, और लगभग हर कक्षा में, मेरे प्रोजेक्ट में, आपने कई कारणों के लिए:

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

क्या इस तकनीक को एम्बेडेड सिस्टम में उपयोग करने की सलाह दी जाती है (जहां प्रदर्शन बहुत महत्वपूर्ण है)?

यह आपके लक्ष्य कितने शक्तिशाली है पर निर्भर करता है हालांकि इस सवाल का केवल उत्तर है: उपाय और मूल्यांकन करें कि आप क्या हासिल करते हैं और हारते हैं

ऐसा लगता है कि वहां से बहुत सारे पुस्तकालयों का उपयोग उनके एपीआई में स्थिर रहने के लिए होता है, कम से कम कुछ संस्करणों के लिए।

लेकिन सभी चीजों के लिए, आपको सावधानी के बिना कहीं भी हर जगह का उपयोग नहीं करना चाहिए। हमेशा इसे इस्तेमाल करने से पहले सोचें यह आपको बताए गए फायदे का मूल्यांकन करें, और यदि वे मूल्य आपके द्वारा भुगतान किए गए हैं

यह आपको ये लाभ दे सकता है :

  • साझा पुस्तकालयों की बाइनरी संगतता रखने में मदद करता है
  • कुछ आंतरिक विवरण छुपा रहे हैं
  • पुन: संक्रिया चक्र घटाना

वे या आपके लिए वास्तविक लाभ नहीं हो सकते हैं मेरे लिए, मुझे कुछ मिनटों का पुनः संसंवकरण समय की परवाह नहीं है अंत उपयोगकर्ता आमतौर पर भी नहीं करते, क्योंकि वे इसे एक बार और शुरुआत से हमेशा संकलित करते हैं

संभावित नुकसान हैं (यहां भी, कार्यान्वयन के आधार पर और क्या वे आपके लिए वास्तविक नुकसान हैं):

  • भोले प्रकार से अधिक आवंटन के कारण स्मृति उपयोग में वृद्धि
  • बढ़ती रखरखाव प्रयास (आपको कम से कम अग्रेषण कार्य लिखना है)
  • प्रदर्शन हानि (संकलक सामग्री को इनलाइन करने में सक्षम नहीं हो सकता है क्योंकि यह आपकी कक्षा के एक भोलेपन के कार्यान्वयन के साथ है)

तो ध्यान से सब कुछ एक मूल्य दे, और अपने लिए इसका मूल्यांकन करें मेरे लिए, यह लगभग हमेशा पता चला है कि पिंपल मुहावरों का उपयोग करने के प्रयास के लायक नहीं है। केवल एक ही मामला है जहां मैं व्यक्तिगत रूप से इसका इस्तेमाल करता हूं (या कम से कम ऐसा कुछ):

लिनक्स stat कॉल के लिए मेरी सी + + आवरण सी हेडर से #defines अलग-अलग हो सकता है, जो #defines सेट कर रहे हैं पर निर्भर करता है। और जब से मेरी आवरण #include <sys/stat.h> उन सभी को नियंत्रित नहीं कर सकता, मैं केवल #include <sys/stat.h> फ़ाइल में #include <sys/stat.h> को शामिल करता हूं और इन समस्याओं से बचने के लिए

माल के बारे में अन्य सभी लोगों से सहमत हूं, लेकिन मुझे सबूतों को एक सीमा में डाल दिया: टेम्पलेट्स के साथ अच्छी तरह से काम नहीं करता है

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

आप अभी भी मंदिर के उपनगरों का उल्लेख कर सकते हैं, लेकिन जब से आपको उन सभी को शामिल करना है, तो संकलन करने के लिए "कार्यान्वयन डिकॉप्लिंग" का हर लाभ (हर जगह प्लेटोफॉर्म विशिष्ट कोड को शामिल करने से बचने, संकलन छोटा) खो दिया है

क्लासिक OOP (वंशानुक्रम आधारित) के लिए एक अच्छा प्रतिमान है लेकिन सामान्य प्रोग्रामिंग (विशेषज्ञता आधारित) के लिए नहीं।

अन्य लोगों ने पहले ही तकनीकी अप / डाउनसाइड्स प्रदान की है, लेकिन मुझे लगता है कि निम्नलिखित टिप्पणियां लायक हैं:

पहला और सबसे महत्वपूर्ण, कट्टरपंथी नहीं है। यदि आपकी स्थिति के लिए पीआईएमपीएल काम करता है, तो इसका इस्तेमाल करें – इसका उपयोग न करें क्योंकि "यह ओओ बेहतर है क्योंकि यह वास्तव में कार्यान्वयन को छुपाता है" आदि। सी ++ अकसर किये गए सवाल का हवाला देते हुए:

encapsulation कोड के लिए है, न कि लोगों ( स्रोत )

बस आपको ओपन सोर्स सॉफ़्टवेयर का एक उदाहरण देने के लिए जहां इसका उपयोग किया जाता है और क्यों: ओपन थ्रैड्स, ओपनसीन्नेग्रेट द्वारा प्रयुक्त थ्रेडिंग लाइब्रेरी। मुख्य विचार है हेडर (जैसे <Thread.h> ) सभी प्लेटफ़ॉर्म-विशिष्ट कोड से निकालना, क्योंकि आंतरिक राज्य चर (जैसे धागा हैंडल) प्लेटफ़ॉर्म से लेकर प्लेटफ़ॉर्म तक भिन्न होते हैं। इस तरह से कोई अन्य प्लेटफार्मों के किसी भी ज्ञान के बिना अपनी लाइब्रेरी के खिलाफ कोड संकलित कर सकता है, क्योंकि सब कुछ छुपा हुआ है

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

प्रत्येक कक्षा के लिए पीआईएमपीएल का उपयोग करने के लिए, मैं सतर्कता पर विचार करता हूं क्योंकि ये सभी लाभ एक लागत पर आते हैं: कार्यान्वयन के तरीकों का उपयोग करने के लिए एक अतिरिक्त स्तर का indirection आवश्यक है।

मुझे लगता है कि यह decoupling के लिए सबसे बुनियादी उपकरणों में से एक है।

मैं एम्बेडेड प्रोजेक्ट (SetTopBox) पर पीमप्ल (और अपवाद सी ++ से अन्य कई मुहावरों) का उपयोग कर रहा था।

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

मैं इस तकनीक का इस्तेमाल अतीत में बहुत हुआ करता था लेकिन फिर से इसे अपने से दूर जा रहा पाया।

बेशक यह आपकी कक्षा के उपयोगकर्ताओं के कार्यान्वयन के विस्तार को छिपाने का एक अच्छा विचार है हालांकि आप यह भी कर सकते हैं कि क्लास के उपयोगकर्ताओं को एक अमूर्त इंटरफ़ेस का इस्तेमाल करने और कार्यान्वयन के विवरण को कंक्रीट वर्ग के रूप में प्राप्त कर सकते हैं।

पीआईएमपीएल के फायदे हैं:

  1. यह मानते हुए कि इस इंटरफ़ेस का सिर्फ एक ही कार्यान्वयन है, यह स्पष्ट कक्षा / ठोस क्रियान्वयन का उपयोग नहीं कर रहा है

  2. यदि आपके पास वर्गों (एक मॉड्यूल) का एक सूट है, जैसे कि कई वर्ग एक ही "इंपोला" तक पहुंचते हैं लेकिन मॉड्यूल के उपयोगकर्ता केवल "एक्सप्लेक्टेड" कक्षाओं का उपयोग करेंगे

  3. कोई वी-टेबल नहीं है यदि यह एक बुरी चीज है

मैं पीआईएमपीएल का पाया गया नुकसान (जहां अमूर्त अंतरफलक बेहतर काम करता है)

  1. एक अमूर्त अंतरफलक का उपयोग करके आप केवल एक "उत्पादन" क्रियान्वयन कर सकते हैं, लेकिन आप एक "नकली" असर बना सकते हैं जो इकाई परीक्षण में काम करता है।

  2. (सबसे बड़ी समस्या) अद्वितीय_प्रतिकार के दिनों से पहले और आगे बढ़ने से आपने पीआईएमपीएल को कैसे स्टोर किया जा सकता है, इसके विकल्प को प्रतिबंधित कर दिया था। एक कच्चा पॉइंटर और आपको अपने क्लास के बारे में समस्याएं थीं- नकल योग्य नहीं है एक पुराने auto_ptr अग्रेषित घोषित वर्ग के साथ काम नहीं करेगा (वैसे भी सभी कंपाइलर्स पर नहीं) इसलिए लोगों ने share_ptr का उपयोग करना शुरू कर दिया, जो आपके वर्ग को कॉपी करने में अच्छा था लेकिन बेशक दोनों प्रतियों में एक ही अंतर्निहित shared_ptr था, जिसे आप उम्मीद नहीं कर सकते (एक को संशोधित करें और दोनों को संशोधित किया गया)। इसलिए समाधान अक्सर आंतरिक एक के लिए कच्चे पॉइंटर का उपयोग करने के लिए और क्लास को गैर-प्रतिलिपि बनाने और उसके बजाय एक shared_ptr लौटाता था तो दो कॉल करने के लिए नए। (वास्तव में 3 दिए गए पुरानी साझा आईपीटीआर ने आपको दूसरा एक दिया)।

  3. तकनीकी रूप से वास्तव में सही-सही नहीं है क्योंकि एक सदस्य सूचक के माध्यम से कंस्ट्रेशन का प्रचार नहीं किया जाता है

सामान्य तौर पर मैं इन वर्षों में पीआईएमपीएल से और अलग-अलग इंटरफ़ेस उपयोग में (और कारखाने के तरीकों को उदाहरण बनाने के लिए) स्थानांतरित कर दिया है।

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

इसका इस्तेमाल कई परियोजनाओं में किया जाता है यह उपयोगी है परियोजना की तरह पर भारी निर्भर करता है। इस का उपयोग करते हुए अधिक प्रमुख प्रोजेक्ट्स में से एक क्यूटी है , जहां मूल विचार उपयोगकर्ता से कार्यान्वयन या प्लेटफ़ॉर्म-विशिष्ट कोड को छिपाना है (अन्य डेवलपर क्यूटी का उपयोग कर)

यह एक महान विचार है लेकिन इसके लिए एक वास्तविक दोष है: डीबगिंग जब तक निजी प्रूफमेंट में छिपा हुआ कोड प्रीमियम गुणवत्ता का है, यह सब अच्छी तरह से है, लेकिन अगर वहाँ कीड़े हैं, तो उपयोगकर्ता / डेवलपर को एक समस्या है, क्योंकि यह एक छिपे कार्यान्वयन के लिए सिर्फ एक गूंगा सूचक है, भले ही उसका कार्यान्वयन सोर्स कोड हो।

इसलिए लगभग सभी डिजाइन निर्णयों में वहां एक पेशेवर और विपक्ष है

एक लाभ जो मैं देख सकता हूं यह है कि यह प्रोग्रामर को काफी तेजी से कुछ कार्यों को क्रियान्वित करने की अनुमति देता है:

 X( X && move_semantics_are_cool ) : pImpl(NULL) { this->swap(move_semantics_are_cool); } X& swap( X& rhs ) { std::swap( pImpl, rhs.pImpl ); return *this; } X& operator=( X && move_semantics_are_cool ) { return this->swap(move_semantics_are_cool); } X& operator=( const X& rhs ) { X temporary_copy(rhs); return this->swap(temporary_copy); } 

पुनश्च: मुझे आशा है कि मैं गलती नहीं बोलने वाले शब्दों को गलत कर रहा हूं।

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