Modern C++ Design
मॉडर्न सी + + डिज़ाइनः जेनेरिक प्रोग्रामिंग एंड डिज़ाइन पैटर्न एप्लाइड आंद्रेई अलेक्जेंड्रेस्कु द्वारा लिखित एक पुस्तक है, जिसे 2001 में एडिसन-वेस्ले द्वारा प्रकाशित किया गया था। स्कॉट मेयर्स द्वारा इसे "सबसे महत्वपूर्ण सी + + पुस्तकों में से एक" माना गया है। यह पुस्तक टेम्पलेट मेटाप्रोग्रामिंग नामक सी + + प्रोग्रामिंग तकनीक का उपयोग करती है और इसकी खोज करती है। जबकि अलेक्जेंड्रेस्कु ने तकनीक का आविष्कार नहीं किया था, उन्होंने इसे प्रोग्रामरों के बीच लोकप्रिय बना दिया है। उनकी पुस्तक में व्यावहारिक समस्याओं के समाधान हैं जिनका सामना सी + + प्रोग्रामर कर सकते हैं। पुस्तक के कई वाक्यांश अब सी + + समुदाय के भीतर सामान्य शब्दों के रूप में उपयोग किए जाते हैंः आधुनिक सी + + (सी/सी + + शैली के विपरीत), नीति-आधारित डिजाइन और टाइपलिस्ट। पुस्तक में वर्णित सभी कोड उनके पुस्तकालय लोकी में मुफ्त में उपलब्ध हैं। इस पुस्तक को 2001 से कई भाषाओं में पुनः प्रकाशित और अनुवादित किया गया है। नीति-आधारित डिजाइन नीति-आधारित डिजाइन, जिसे नीति-आधारित वर्ग डिजाइन या नीति-आधारित प्रोग्रामिंग के रूप में भी जाना जाता है, वह शब्द है जिसका उपयोग आधुनिक सी + + डिजाइन में सी + + के लिए एक मुहावरे पर आधारित डिजाइन दृष्टिकोण के लिए किया जाता है जिसे नीतियों के रूप में जाना जाता है। इसे रणनीति पैटर्न के संकलन-समय संस्करण के रूप में वर्णित किया गया है, और इसका सी + + टेम्पलेट मेटाप्रोग्रामिंग के साथ संबंध है। इसे पहली बार सी + + में आंद्रेई अलेक्जेंड्रेस्कु द्वारा मॉडर्न सी + + डिज़ाइन के साथ और सी/सी + + यूज़र्स जर्नल में अपने कॉलम जेनेरिक <प्रोग्रामिंग> के साथ लोकप्रिय बनाया गया था, और यह वर्तमान में सी + + और डी के साथ निकटता से जुड़ा हुआ है क्योंकि इसके लिए टेम्प्लेट के लिए अत्यधिक मजबूत समर्थन के साथ एक संकलक की आवश्यकता होती है, जो लगभग 2003 से पहले आम नहीं था। मानकीकृत सामान्य कोड के आधार पर इस डिजाइन दृष्टिकोण के पिछले उदाहरणों में एम. एल. भाषाओं के पैरामीट्रिक मॉड्यूल (फंक्शन) और स्मृति प्रबंधन नीति के लिए सी + + एलोकेटर शामिल हैं। नीति-आधारित डिजाइन में केंद्रीय मुहावरा एक वर्ग टेम्पलेट (जिसे मेजबान वर्ग कहा जाता है) है, जो कई प्रकार के मापदंडों को इनपुट के रूप में लेता है, जिन्हें उपयोगकर्ता द्वारा चुने गए प्रकारों (जिन्हें नीति वर्ग कहा जाता है) के साथ त्वरित किया जाता है, प्रत्येक एक विशेष अंतर्निहित इंटरफेस (जिसे नीति कहा जाता है) को लागू करता है, और तत्काल मेजबान वर्ग के व्यवहार के कुछ ऑर्थोगोनल (या ज्यादातर ऑर्थोगोनल) पहलू को समाहित करता है। प्रत्येक नीति के लिए अलग-अलग, डिब्बाबंद कार्यान्वयनों के एक सेट के साथ संयुक्त एक मेजबान वर्ग की आपूर्ति करके, एक पुस्तकालय या मॉड्यूल विभिन्न व्यवहार संयोजनों की एक घातीय संख्या का समर्थन कर सकता है, जिसे संकलन समय पर हल किया जाता है, और मेजबान वर्ग टेम्पलेट के त्वरितकरण में विभिन्न आपूर्ति किए गए नीति वर्गों को मिलाकर और मिलान करके चुना जाता है। इसके अतिरिक्त, किसी दी गई नीति के कस्टम कार्यान्वयन को लिखकर, एक नीति-आधारित पुस्तकालय का उपयोग उन स्थितियों में किया जा सकता है जिनमें पुस्तकालय कार्यान्वयनकर्ता द्वारा अप्रत्याशित व्यवहार की आवश्यकता होती है। यहां तक कि ऐसे मामलों में भी जहां प्रत्येक नीति के एक से अधिक कार्यान्वयन का कभी उपयोग नहीं किया जाएगा, एक वर्ग को नीतियों में विघटित करने से मॉडुलरिटी को बढ़ाकर और ठीक-ठीक जहां ऑर्थोगोनल डिजाइन निर्णय लिए गए हैं, उन्हें उजागर करके डिजाइन प्रक्रिया में सहायता मिल सकती है। जबकि विनिमेय मॉड्यूल से बाहर सॉफ्टवेयर घटकों को इकट्ठा करना एक नई अवधारणा से बहुत दूर है, नीति-आधारित डिजाइन एक व्यक्तिगत वर्ग के व्यवहार को परिभाषित करने के (अपेक्षाकृत कम) स्तर पर उस अवधारणा को लागू करने के तरीके में एक नवाचार का प्रतिनिधित्व करता है। पॉलिसी वर्गों में कॉलबैक के साथ कुछ समानता है, लेकिन इसमें भिन्नता है, एक एकल कार्य से युक्त होने के बजाय, एक पॉलिसी वर्ग में आम तौर पर कई संबंधित कार्य (विधियाँ) होते हैं, जो अक्सर राज्य चर या अन्य सुविधाओं जैसे कि नेस्टेड प्रकारों के साथ संयुक्त होते हैं। एक नीति-आधारित मेजबान वर्ग को एक प्रकार के मेटाफ़ंक्शन के रूप में सोचा जा सकता है, जिसमें इनपुट के रूप में प्रकारों द्वारा दर्शाए गए व्यवहारों का एक समूह लिया जाता है, और आउटपुट के रूप में एक प्रकार की वापसी होती है जो उन व्यवहारों को एक कार्यात्मक समग्र में संयोजित करने के परिणाम का प्रतिनिधित्व करती है। (एम. पी. एल. मेटाफ़ंक्शंस के विपरीत, हालांकि, आउटपुट को आमतौर पर एक नेस्टेड आउटपुट प्रकार के बजाय तत्काल होस्ट वर्ग द्वारा ही दर्शाया जाता है।) नीति मुहावरे की एक प्रमुख विशेषता यह है कि, आमतौर पर (हालांकि यह सख्ती से आवश्यक नहीं है), मेजबान वर्ग (सार्वजनिक) एकाधिक विरासत का उपयोग करते हुए अपने प्रत्येक नीति वर्ग से व्युत्पन्न होगा (खुद को एक बाल वर्ग बनाएगा)। (विकल्प मेजबान वर्ग के लिए केवल प्रत्येक नीति वर्ग प्रकार के एक सदस्य चर को शामिल करना है, या अन्यथा निजी तौर पर नीति वर्गों को विरासत में प्राप्त करना है; हालाँकि सार्वजनिक रूप से नीति वर्गों को विरासत में प्राप्त करने का प्रमुख लाभ यह है कि एक नीति वर्ग नए तरीकों को जोड़ सकता है, जो तत्काल मेजबान वर्ग द्वारा विरासत में मिले हैं और अपने उपयोगकर्ताओं के लिए सुलभ हैं, जिनके बारे में मेजबान वर्ग को स्वयं जानने की भी आवश्यकता नहीं है।) नीति मुहावरे के इस पहलू की एक उल्लेखनीय विशेषता यह है कि, वस्तु-उन्मुख प्रोग्रामिंग के सापेक्ष, नीतियां आधार वर्ग और व्युत्पन्न वर्ग के बीच संबंधों को उलट देती हैं-जबकि ओ. ओ. पी. इंटरफेस में पारंपरिक रूप से (अमूर्त) आधार वर्गों और व्युत्पन्न वर्गों द्वारा इंटरफेस के कार्यान्वयन द्वारा दर्शाया जाता है, नीति-आधारित डिजाइन में व्युत्पन्न (मेजबान) वर्ग इंटरफेस का प्रतिनिधित्व करता है और आधार (नीति) वर्ग उन्हें लागू करते हैं। नीतियों के मामले में, सार्वजनिक विरासत मेजबान और नीति वर्गों के बीच एक संबंध का प्रतिनिधित्व नहीं करती है। हालांकि इसे पारंपरिक रूप से ओ. ओ. पी. संदर्भों में एक डिजाइन दोष का प्रमाण माना जाएगा, यह नीति मुहावरे के संदर्भ में लागू नहीं होता है। उनके वर्तमान अवतार में नीतियों का एक नुकसान यह है कि नीति इंटरफेस में कोड में प्रत्यक्ष, स्पष्ट प्रतिनिधित्व नहीं है, बल्कि बतख टाइपिंग के माध्यम से निहित रूप से परिभाषित किया गया है, और टिप्पणियों में अलग से और मैन्युअल रूप से प्रलेखित किया जाना चाहिए। मुख्य विचार यह है कि प्रकार को निश्चित कार्यान्वयन और इंटरफेस, नीति-आधारित वर्ग और विभिन्न नीतियों में विभाजित करने के लिए समानता-परिवर्तनशीलता विश्लेषण का उपयोग किया जाए। चाल यह जानना है कि मुख्य वर्ग में क्या जाता है, और कौन सी नीतियां बनानी चाहिए। ऊपर वर्णित लेख निम्नलिखित उत्तर देता हैः जहाँ भी हमें एक संभावित सीमित डिजाइन निर्णय लेने की आवश्यकता होगी, हमें उस निर्णय को स्थगित कर देना चाहिए, हमें इसे एक उचित नाम वाली नीति को सौंपना चाहिए। नीति वर्गों में कार्यान्वयन, प्रकार परिभाषाएँ आदि शामिल हो सकते हैं। मूल रूप से, मुख्य टेम्पलेट वर्ग का डिजाइनर यह परिभाषित करेगा कि नीति वर्गों को क्या प्रदान करना चाहिए, उन्हें किन अनुकूलन बिंदुओं को लागू करने की आवश्यकता है। नीतियों का एक अच्छा समूह बनाना एक नाजुक काम हो सकता है, बस सही संख्या (जैसे, न्यूनतम आवश्यक)। अलग-अलग अनुकूलन बिंदु, जो एक साथ संबंधित हैं, एक नीति तर्क में जाने चाहिए, जैसे कि भंडारण नीति, सत्यापन नीति आदि। ग्राफिक डिजाइनर अपनी नीतियों को एक नाम देने में सक्षम होते हैं, जो अवधारणाओं का प्रतिनिधित्व करते हैं, न कि वे जो संचालन या मामूली कार्यान्वयन विवरण का प्रतिनिधित्व करते हैं। नीति-आधारित डिजाइन में अन्य उपयोगी तकनीकें शामिल हो सकती हैं। उदाहरण के लिए, संकलन समय के लिए टेम्पलेट विधि पैटर्न की पुनः व्याख्या की जा सकती है, ताकि एक मुख्य वर्ग में एक कंकाल एल्गोरिथ्म हो, जो अनुकूलन कुछ नीतियों के उपयुक्त कार्यों को इंगित करता है। यह सी + + के भविष्य के संस्करणों में अवधारणाओं द्वारा गतिशील रूप से प्राप्त किया जाएगा। नीचे प्रस्तुत सरल उदाहरण सी + + हैलो वर्ल्ड प्रोग्राम का एक सरल (कल्पित) उदाहरण है, जहाँ मुद्रित किए जाने वाले पाठ और इसे छापने की विधि को नीतियों का उपयोग करके विघटित किया जाता है। इस उदाहरण में, हैलोवर्ल्ड एक मेजबान वर्ग है जहाँ यह दो नीतियों को लेता है, एक यह निर्दिष्ट करने के लिए कि एक संदेश को कैसे दिखाया जाना चाहिए और दूसरा वास्तविक संदेश को मुद्रित करने के लिए। ध्यान दें कि सामान्य कार्यान्वयन रन में है और इसलिए कोड को तब तक संकलित नहीं किया जा सकता है जब तक कि दोनों नीतियां (प्रिंट और संदेश) प्रदान नहीं की जाती हैं। #include <आईओस्ट्रीम> #include <स्ट्रिंग> टेम्पलेट <टाइपनाम आउटपुट पॉलिसी, टाइपनाम लैंग्वेज पॉलिसी> क्लास हैलोवर्ल्डः प्राइवेट आउटपुट पॉलिसी, प्राइवेट लैंग्वेज पॉलिसी {सार्वजनिकः// व्यवहार विधि। शून्य रन () कॉन्स्ट {// दो नीति विधियाँ। प्रिंट (संदेश ());} निजीः लैंग्वेजपोलीसी का उपयोगःः संदेश; आउटपुटपोलीसी का उपयोगःः प्रिंट;}; वर्ग आउटपुटपोलीसी राइट टूकाउट {संरक्षितः टेम्पलेट <टाइपनाम मैसेजटाइप> शून्य प्रिंट (मैसेजटाइप & & संदेश) कॉन्स्ट {एसटीडीः: cout <<संदेश <<एसटीडीः: एंडल;}; वर्ग लैंग्वेजपोलीसी इंग्लिश {संरक्षितः एसटीडीः: स्ट्रिंग मैसेज () कॉन्स्ट {रिटर्न "हैलो, वर्ल्ड! ";}}; वर्ग भाषा नीति जर्मन {संरक्षितः std:: स्ट्रिंग संदेश () स्थिरांक {लौटें" हैलो वेल्ट! ";}}; इंट मेन () {// उदाहरण 1 का उपयोग करके हैलोवर्ल्डइंग्लिश = हैलोवर्ल्ड <आउटपुटपॉलिसी राइट टूकाउट, लैंग्वेजपॉलिसीइंग्लिश>; हैलोवर्ल्डइंग्लिश हैलो _ वर्ल्ड; hello_world.Run ();// प्रिंट करता है" हैलो, वर्ल्ड! " //उदाहरण 2// वही करता है, लेकिन एक अन्य भाषा नीति का उपयोग करता है। हैलोवर्ल्डगर्मन = हैलोवर्ल्ड <आउटपुटपोलीसीराईट टूकाउट, लैंग्वेजपोलीसीगर्मन>; हैलोवर्ल्डगर्मन हैलो _ वर्ल्ड2; hello_world2.Run ();// प्रिंट "हैलो वेल्ट!". का उपयोग करते हुए। डिजाइनर आसानी से सदस्य कार्य प्रिंट के साथ नई कक्षाओं को जोड़कर अधिक आउटपुट नीतियों को लिख सकते हैं और उन्हें नई आउटपुट नीतियों के रूप में ले सकते हैं। लोकी पुस्तकालय लोकी एक सी + + सॉफ्टवेयर पुस्तकालय का नाम है जिसे आंद्रेई अलेक्जेंड्रेस्कु ने अपनी पुस्तक मॉडर्न सी + + डिज़ाइन के हिस्से के रूप में लिखा है। पुस्तकालय सी + + टेम्पलेट मेटाप्रोग्रामिंग का व्यापक उपयोग करता है और कई सामान्य रूप से उपयोग किए जाने वाले उपकरणों को लागू करता हैः टाइपलिस्ट, फ़ंक्टर, सिंगलटन, स्मार्ट पॉइंटर, ऑब्जेक्ट फैक्ट्री, विज़िटर और मल्टीमेथोड्स। मूल रूप से पुस्तकालय केवल दो सबसे मानक अनुरूप सी + + संकलकों (कोड वॉरियर और कोमो सी/सी + +) के साथ संगत थाः बाद के प्रयासों ने इसे संकलकों की एक विस्तृत श्रृंखला के साथ उपयोग करने योग्य बना दिया है (जिसमें पुराने दृश्य सी + + 6, बोरलैंड सी + + बिल्डर 6, क्लैंग और जीसीसी शामिल हैं)। संकलक विक्रेताओं ने लोकी का उपयोग एक संगतता बेंचमार्क के रूप में किया, जिससे अनुपालन संकलकों की संख्या में और वृद्धि हुई। लोकी के रखरखाव और आगे के विकास को एक सोर्सफोर्ज परियोजना के रूप में पीटर कुमेल और रिचर्ड स्पोसाटो के नेतृत्व में एक ओपन-सोर्स समुदाय के माध्यम से जारी रखा गया है। कई लोगों के निरंतर योगदान से पुस्तकालय की समग्र मजबूती और कार्यक्षमता में सुधार हुआ है। लोकी अब पुस्तक से बंधी नहीं है क्योंकि इसमें पहले से ही बहुत सारे नए घटक हैं (जैसे। स्ट्रॉन्गपीटीआर, प्रिंटएफ और स्कोपगार्ड)। लोकी ने इसी तरह के उपकरणों और कार्यक्षमता को प्रेरित किया जो अब बूस्ट पुस्तकालय संग्रह में भी मौजूद हैं। बूस्ट (सी + + पुस्तकालय) मिक्सिन संदर्भ बाहरी लिंक अलेक्जेंड्रेस्कु की वेबसाइट (पुस्तक त्रुटि के साथ) स्मार्ट पॉइंटर्स (पुस्तक से नमूना अध्याय) पुस्तक प्रकाशक से मूल स्रोत कोड 2001 गैर-काल्पनिक किताबें सी + + के बारे में किताबें