इसलिए, मुझे आश्चर्य है कि यह तकनीक वास्तव में व्यवहार में उपयोग की जाती है? क्या मुझे इसे हर जगह, या सावधानी के साथ उपयोग करना चाहिए?
बेशक इसका उपयोग किया जाता है। मैं इसे लगभग हर वर्ग में अपने प्रोजेक्ट में इस्तेमाल करता हूँ।
PIMPL मुहावरे का उपयोग करने के कारण:
बाइनरी संगतता
जब आप एक पुस्तकालय विकसित कर रहे हैं, तो आप XImpl
अपने ग्राहक के साथ द्विआधारी संगतता को तोड़ने के बिना / जोड सकते हैं / संशोधित कर सकते हैं (जिसका अर्थ क्रैश होगा!)। चूँकि X
जब आप नए फ़ील्ड्स को Ximpl
क्लास में जोड़ते हैं तो क्लास का बाइनरी लेआउट नहीं बदलता है , यह मामूली संस्करणों के अपडेट में लाइब्रेरी में नई कार्यक्षमता जोड़ने के लिए सुरक्षित है।
बेशक, आप द्विआधारी संगतता को तोड़ने के बिना X
/ के XImpl
बिना नए सार्वजनिक / निजी गैर-आभासी तरीकों को भी जोड़ सकते हैं , लेकिन यह मानक हेडर / कार्यान्वयन तकनीक के बराबर है।
डेटा छिपाना
यदि आप एक पुस्तकालय, विशेष रूप से एक मालिकाना विकसित कर रहे हैं, तो यह बताना वांछनीय नहीं हो सकता है कि आपके पुस्तकालय के सार्वजनिक इंटरफ़ेस को लागू करने के लिए अन्य पुस्तकालयों / कार्यान्वयन तकनीकों का क्या उपयोग किया गया था। या तो बौद्धिक संपदा मुद्दों के कारण, या क्योंकि आप मानते हैं कि उपयोगकर्ताओं को कार्यान्वयन के बारे में खतरनाक धारणाएं लेने के लिए लुभाया जा सकता है या बस भयानक कास्टिंग ट्रिक्स का उपयोग करके इनकैप्सुलेशन को तोड़ सकते हैं। PIMPL हल करता है / कम करता है।
संकलन का समय
संकलन का समय कम हो जाता है, क्योंकि X
जब आप फ़ील्ड जोड़ते हैं और हटाते हैं , तो केवल स्रोत (कार्यान्वयन) की फ़ाइल को XImpl
वर्ग में और / या विधियों को जोड़ा जाता है (जो मानक तकनीक में निजी क्षेत्रों / विधियों को जोड़ने के लिए मैप करता है)। व्यवहार में, यह एक सामान्य ऑपरेशन है।
मानक हेडर / कार्यान्वयन तकनीक (PIMPL के बिना) के साथ, जब आप एक नया क्षेत्र जोड़ते हैं X
, तो हर ग्राहक जो कभी भी आवंटित करता है X
(या तो ढेर पर, या ढेर पर) उसे फिर से जोड़ने की आवश्यकता होती है, क्योंकि उसे आवंटन के आकार को समायोजित करना होगा। खैर, हर ग्राहक कभी आवंटित नहीं है कि एक्स भी कंपाइल करने की आवश्यकता है, लेकिन यह सिर्फ भूमि के ऊपर (क्लाइंट साइड पर जिसके परिणामस्वरूप कोड एक ही हो जाएगा) है।
क्या अधिक है, मानक हेडर / क्रियान्वयन पृथक्करण के साथ XClient1.cpp
भी जब एक निजी विधि X::foo()
को जोड़ा X
और X.h
बदला गया, तब भी इसे पुन: संकलित करने की आवश्यकता होती है , भले ही XClient1.cpp
संभवतः इस विधि को एनकैप्सुलेशन कारणों से नहीं कहा जा सकता है! ऊपर की तरह, यह शुद्ध उपरि है और वास्तविक जीवन C ++ बिल्ड सिस्टम के काम करने के तरीके से संबंधित है।
बेशक, पुनर्संयोजन की आवश्यकता नहीं है जब आप सिर्फ तरीकों के कार्यान्वयन को संशोधित करते हैं (क्योंकि आप हेडर को नहीं छूते हैं), लेकिन यह मानक हेडर / कार्यान्वयन तकनीक के बराबर है।
क्या इस तकनीक को एम्बेडेड सिस्टम (जहां प्रदर्शन बहुत महत्वपूर्ण है) में उपयोग करने की सिफारिश की गई है?
यह इस बात पर निर्भर करता है कि आपका लक्ष्य कितना शक्तिशाली है। हालाँकि इस प्रश्न का एकमात्र उत्तर यह है: मापें और मूल्यांकन करें कि आप क्या हासिल करते हैं और क्या खोते हैं। इसके अलावा, ध्यान रखें कि यदि आप अपने ग्राहकों द्वारा एम्बेडेड सिस्टम में उपयोग की जाने वाली लाइब्रेरी का प्रकाशन नहीं कर रहे हैं, तो केवल संकलन का समय ही लागू होता है!
struct XImpl : public X
। यह मुझे अधिक स्वाभाविक लगता है। क्या कोई और मुद्दा है जो मैंने याद किया है?