डिज़ाइन पैटर्न (कंप्यूटर विज्ञान)

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

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

सभी सॉफ्टवेयर पैटर्न, डिज़ाइन पैटर्न नहीं होते. उदाहरण के लिए, कलनविधि, सॉफ्टवेयर डिज़ाइन समस्याओं के बजाय परिकलन समस्याओं को सुलझाता है।

इतिहास 
पैटर्न, क्रिस्टोफर एलेक्ज़ांडर (1977/79) द्वारा एक वास्तुकला अवधारणा के रूप में उत्पन्न हुए. 1987 में, केंट बैक और वार्ड कनिंघम ने प्रोग्रामिंग पर पैटर्न लागू करने के विचार के साथ प्रयोग शुरू किया और उस वर्ष OOPSLA सम्मेलन में अपने परिणाम प्रस्तुत किये।  बाद के वर्षों में, बेक, कनिंघम और दूसरों ने इस पर काम करना जारी रखा।

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

 
 
 
 

हालांकि डिज़ाइन पैटर्न का व्यावहारिक अनुप्रयोग एक तथ्य है, तथापि डिज़ाइन पैटर्न की अवधारणा को नियमनिष्ठ करने का कार्य कई वर्षों तक अटका रहा।

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

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

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

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

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

इसके अतिरिक्त, पैटर्न, डेवलपर्स को सॉफ्टवेयर की परस्पर क्रिया के लिए अच्छी तरह से ज्ञात, अच्छी तरह से समझे हुए नाम के प्रयोग से संवाद करने की अनुमति देते हैं। आम डिज़ाइन पैटर्न को अस्थाई डिज़ाइन से अधिक मजबूत बनाते हुए, समय के साथ सुधारा जा सकता है।

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

वार्षिक पैटर्न लैंग्वेजेस ऑफ़ प्रोग्रामिंग सम्मेलन की कार्यवाही में डोमेन विशेष पैटर्न के कई उदाहरण शामिल हैं।

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

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

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

आलोचना 

कंप्यूटर विज्ञान के क्षेत्र में, डिज़ाइन पैटर्न की अवधारणा के बारे में कुछ आलोचनाएं मौजूद हैं।

ओवर-इंजीनियरिंग 
डिज़ाइन पैटर्न का दुरुपयोग, अनावश्यक कोड को लागू करने में परिणत हो सकता है। यह कुशल सॉफ्टवेयर विकास की सादगी के प्रतिमान के विपरीत है।

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

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

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

इन्हें भी देखें 

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

सन्दर्भ

अतिरिक्त पठन 

पुस्तकें

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 वेब साइटें

बाहरी कड़ियाँ 
 Directory of websites that provide pattern catalogs hillside.net पर 
 वार्ड कनिंघम की पोर्टलैंड पैटर्न रिपॉज़िटरी
 
 PerfectJPattern Open Source Project डिज़ाइन पैटर्न लाइब्ररी, जिसका लक्ष्य Java के सभी ज्ञात पैटर्न के पूर्ण या आंशिक संघटकीय संस्करण प्रदान करना है।
 Jt J2EE पैटर्न उन्मुख फ्रेमवर्क
 Printable Design Patterns Quick Reference Cards
 101 Design Patterns & Tips for Developers
 On Patterns and Pattern Languages बुशमन, हेनी और श्मिट द्वारा 
 Patterns for Scripted Applications
 Oodesign.com पर Design Patterns Reference 

सॉफ्टवेयर डिज़ाइन पैटर्न
श्रेष्ठ लेख योग्य लेख
गूगल परियोजना