सॉफ्टवेयर डिजाइन पैटर्न

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

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

डिजाइन पैटर्न को एक प्रोग्रामिंग प्रतिमान के स्तरों और एक मूर्त अल्गोरिथम  के बीच कंप्यूटर प्रोग्रामिंग मध्यम के लिए एक संरचित दृष्टिकोण के रूप में देखा जा सकता है।

इतिहास
1977 की प्रारम्भ में क्रिस्टोफर अलेक्जेंडर द्वारा एक पैटर्न (वास्तुकला)  के रूप में पैटर्न की उत्पत्ति हुई (c.f. द पैटर्न ऑफ स्ट्रीट्स, जर्नल ऑफ द एआईपी, सितंबर, 1966, वॉल्यूम 32, नंबर 5, पीपी। 273-278)। 1987 में, केंट बेक और वार्ड कनिंघम ने प्रोग्रामिंग के लिए पैटर्न लागू करने के विचार के साथ प्रयोग करना प्रारम्भ किया - विशेष रूप से पैटर्न भाषाओं - और उस वर्ष ओओपीएसएलए सम्मेलन में अपने परिणाम प्रस्तुत किए।  बाद के वर्षों में, बेक, कनिंघम और अन्य लोगों ने इस कार्य को आगे बढ़ाया।

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



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

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

लचीलेपन को प्राप्त करने के लिए, डिज़ाइन पैटर्न सामान्यतः संकेत के अतिरिक्त स्तर पेश करते हैं, जो कुछ मामलों में परिणामी डिज़ाइन को जटिल बना सकते हैं और एप्लिकेशन प्रदर्शन को नुकसान पहुंचा सकते हैं।

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

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

डोमेन-विशिष्ट पैटर्न
विशेष डोमेन में डिज़ाइन पैटर्न को संहिताबद्ध करने के प्रयास भी किए गए हैं, जिसमें मौजूदा डिज़ाइन पैटर्न के साथ-साथ डोमेन-विशिष्ट डिज़ाइन पैटर्न का उपयोग भी सम्मिलित है। उदाहरणों में उपयोगकर्ता इंटरफ़ेस डिज़ाइन पैटर्न सम्मिलित  हैं, सूचना दृश्य, सुरक्षित डिजाइन, सुरक्षित उपयोगिता, वेब डिजाइन और व्यापार मॉडल डिजाइन। प्रोग्रामिंग सम्मेलन की कार्यवाही की वार्षिक पैटर्न भाषाएँ डोमेन-विशिष्ट पैटर्न के कई उदाहरण सम्मिलित करें।

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

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


 * 'पैटर्न का नाम और वर्गीकरण:' एक वर्णनात्मक और अनूठा नाम जो पैटर्न की पहचान करने और उसका संदर्भ देने में मदद करता है।
 * 'इरादा:' पैटर्न के पीछे के लक्ष्य का विवरण और इसका उपयोग करने का कारण।
 * 'इसके रूप में भी जाना जाता है:' पैटर्न के अन्य नाम।
 * 'प्रेरणा (बल):' एक परिदृश्य जिसमें एक समस्या और एक संदर्भ सम्मिलित है जिसमें इस पैटर्न का उपयोग किया जा सकता है।
 * 'प्रयोज्यता:' जिन स्थितियों में यह पैटर्न प्रयोग करने योग्य है; पैटर्न के लिए संदर्भ।
 * 'संरचना:' पैटर्न का एक चित्रमय प्रतिनिधित्व। इस उद्देश्य के लिए यूनिफाइड मॉडलिंग लैंग्वेज#UML क्लास डायग्राम और इंटरेक्शन आरेख  का इस्तेमाल किया जा सकता है।
 * 'प्रतिभागी:' पैटर्न में उपयोग की जाने वाली कक्षाओं और वस्तुओं की सूची और डिजाइन में उनकी भूमिका।
 * 'सहयोग:' पैटर्न में उपयोग की जाने वाली कक्षाएं और ऑब्जेक्ट एक दूसरे के साथ कैसे इंटरैक्ट करते हैं, इसका विवरण।
 * 'परिणाम:' पैटर्न का उपयोग करने के कारण होने वाले परिणामों, साइड इफेक्ट्स और ट्रेड ऑफ का विवरण।
 * 'कार्यान्वयन:' पैटर्न के कार्यान्वयन का विवरण; पैटर्न का साधन भाग।
 * 'नमूना कोड:' प्रोग्रामिंग भाषा में पैटर्न का उपयोग कैसे किया जा सकता है इसका एक उदाहरण।
 * 'ज्ञात उपयोग:' पैटर्न के वास्तविक उपयोग के उदाहरण।
 * 'संबंधित पैटर्न:' अन्य पैटर्न जिनका पैटर्न के साथ कुछ संबंध है; पैटर्न और समान पैटर्न के बीच अंतर की चर्चा।

आलोचना
यह देखा गया है कि डिज़ाइन पैटर्न केवल एक संकेत हो सकता है कि किसी दी गई प्रोग्रामिंग भाषा (उदाहरण के लिए जावा (प्रोग्रामिंग भाषा) या C ++) में कुछ सुविधाएँ गायब हैं। पीटर नॉरविग दर्शाता है कि डिज़ाइन पैटर्न पुस्तक (जो मुख्य रूप से सी ++ पर केंद्रित है) में 23 में से 16 पैटर्न लिस्प (प्रोग्रामिंग भाषा) या डायलन (प्रोग्रामिंग भाषा) में सरलीकृत या समाप्त (प्रत्यक्ष भाषा सपोर्ट के माध्यम से) हैं। संबंधित अवलोकन हैनीमैन और किज़ेलेस द्वारा किए गए थे जिन्होंने पहलू-उन्मुख प्रोग्रामिंग | पहलू-उन्मुख प्रोग्रामिंग भाषा (AspectJ) का उपयोग करके 23 डिज़ाइन पैटर्न में से कई को लागू किया और दिखाया कि 23 डिज़ाइन पैटर्न में से 17 के कार्यान्वयन से कोड-स्तरीय निर्भरताएँ हटा दी गईं। और वह पहलू-उन्मुख प्रोग्रामिंग डिज़ाइन पैटर्न के कार्यान्वयन को सरल बना सकती है। पॉल ग्राहम (कंप्यूटर प्रोग्रामर) भी देखें। पॉल ग्राहम का निबंध रिवेंज ऑफ द नर्ड्स। पैटर्न का अनुचित उपयोग अनावश्यक रूप से जटिलता बढ़ा सकता है।

यह भी देखें

 * अमूर्त सिद्धांत (प्रोग्रामिंग)
 * एल्गोरिथम कंकाल
 * विरोधी पैटर्न
 * आर्किटेक्चरल पैटर्न (कंप्यूटर साइंस)
 * कैनोनिकल प्रोटोकॉल पैटर्न
 * डिबगिंग पैटर्न
 * डिज़ाइन पैटर्न
 * वितरित डिजाइन पैटर्न
 * डबल मौका समारोह
 * एंटरप्राइज आर्किटेक्चर फ्रेमवर्क
 * GRASP (ऑब्जेक्ट-ओरिएंटेड डिज़ाइन)
 * सहायक वर्ग
 * प्रोग्रामिंग में प्रोग्रामिंग मुहावरा
 * इंटरेक्शन डिजाइन पैटर्न
 * सॉफ्टवेयर विकास दर्शन की सूची
 * सॉफ्टवेयर इंजीनियरिंग विषयों की सूची
 * पैटर्न भाषा
 * पैटर्न सिद्धांत
 * शैक्षणिक पैटर्न
 * पोर्टलैंड पैटर्न रिपॉजिटरी
 * पुनर्रचना
 * सॉफ्टवेयर विकास पद्धति