डिज़ाइन पैटर्न (कंप्यूटर विज्ञान)
सॉफ्टवेयर इंजीनियरिंग में, डिज़ाइन पैटर्न आम तौर पर सॉफ्टवेयर डिज़ाइन में होने वाली समस्या के लिए एक सामान्य पुन: प्रयोज्य समाधान है। एक डिज़ाइन पैटर्न एक पूर्ण डिज़ाइन नहीं है जिसे सीधे कोड में बदला जा सके। समस्या का कैसे निदान किया जाए, इसका यह एक विवरण या खाका है जिसे कई विभिन्न स्थितियों में इस्तेमाल किया जा सकता है। ऑब्जेक्ट-उन्मुख डिज़ाइन पैटर्न, इसमें शामिल अंतिम अनुप्रयोग वर्गों या ऑब्जेक्ट को निर्दिष्ट किए बिना, आम तौर पर वर्गों या ऑब्जेक्ट के बीच संबंधों और पारस्परिक क्रिया को दर्शाते हैं।
डिज़ाइन पैटर्न, मॉड्यूल और इंटरकनेक्शन के प्रभाव क्षेत्र में रहते हैं। उच्च स्तर पर, ऐसे वास्तुकला पैटर्न मौजूद होते हैं, जिनका विस्तार अपेक्षाकृत बड़ा होता हैं, जो आम तौर पर एक पूरी प्रणाली द्वारा अनुसरण किए जाने वाले एक समग्र पैटर्न का वर्णन करते हैं।
सभी सॉफ्टवेयर पैटर्न, डिज़ाइन पैटर्न नहीं होते. उदाहरण के लिए, कलनविधि, सॉफ्टवेयर डिज़ाइन समस्याओं के बजाय परिकलन समस्याओं को सुलझाता है।
पैटर्न, क्रिस्टोफर एलेक्ज़ांडर (1977/79) द्वारा एक वास्तुकला अवधारणा के रूप में उत्पन्न हुए. 1987 में, केंट बैक और वार्ड कनिंघम ने प्रोग्रामिंग पर पैटर्न लागू करने के विचार के साथ प्रयोग शुरू किया और उस वर्ष OOPSLA सम्मेलन में अपने परिणाम प्रस्तुत किये। बाद के वर्षों में, बेक, कनिंघम और दूसरों ने इस पर काम करना जारी रखा।
"" (गामा व अन्य) पुस्तक के 1994 में प्रकाशित होने के बाद, डिज़ाइन पैटर्न ने कंप्यूटर विज्ञान में लोकप्रियता हासिल की। उसी साल प्रोग्रामिंग की पैटर्न भाषाएं पर पहला सम्मेलन आयोजित हुआ और अगले वर्ष पोर्टलैंड पैटर्न भंडार को डिज़ाइन पैटर्न के प्रलेखन के लिए स्थापित किया गया। इस शब्दावली का कार्यक्षेत्र विवाद का विषय बना हुआ है। डिज़ाइन पैटर्न शैली की उल्लेखनीय पुस्तकों में शामिल हैं:
हालांकि डिज़ाइन पैटर्न का व्यावहारिक अनुप्रयोग एक तथ्य है, तथापि डिज़ाइन पैटर्न की अवधारणा को नियमनिष्ठ करने का कार्य कई वर्षों तक अटका रहा।
डिज़ाइन पैटर्न, विकास प्रक्रिया को सिद्ध और परखे हुए विकास मानदंड प्रदान करते हुए तेज़ कर सकता है। प्रभावी सॉफ्टवेयर डिज़ाइन में उन मुद्दों पर विचार करने की आवश्यकता होती है, जो कार्यान्वयन में बाद तक दिखाई नहीं दे सकते हैं। डिज़ाइन पैटर्न का पुनर्प्रयोग कुछ सूक्ष्म मुद्दों को रोकने में मदद करता है, जो व्यापक समस्या पैदा कर सकते हैं और यह कोड लिखने वालों और वास्तुकारों के लिए, जो पैटर्न से परिचित हैं, कोड पठनीयता में सुधार करता है।
लचीलापन प्राप्त करने के लिए, डिज़ाइन पैटर्न आम तौर पर परोक्ष उपाय का अतिरिक्त स्तर पेश करते हैं, जो कुछ मामलों में परिणामी डिज़ाइन को जटिल और अनुप्रयोग प्रदर्शन को चोट पहुंचा सकते हैं।
परिभाषा के अनुसार, एक पैटर्न का उसका उपयोग करने वाले प्रत्येक अनुप्रयोग में नए सिरे से प्रोग्रामिंग किया जाना चाहिए। चूंकि कुछ लेखक इसे घटकों द्वारा उपलब्ध कराए गए अनुसार सॉफ्टवेयर पुनःप्रयोग से एक पिछड़े कदम के रूप में देखते हैं, शोधकर्ताओं ने पैटर्न को घटकों में बदलने के लिए काम किया। मेयेर और अर्नोट, सर्वाधिक ज्ञात पैटर्न को घटक में परिवर्तित करने में दो तिहाई सफलता दर का दावा करते हैं।
अक्सर लोग, कुछ सॉफ्टवेयर डिज़ाइन तकनीकों को कुछ समस्याओं के लिए कैसे लागू करें, बस इतना ही समझते हैं। इन तकनीकों को समस्याओं की एक व्यापक श्रेणी के लिए लागू करना कठिन है। डिज़ाइन पैटर्न सामान्य समाधान प्रदान करते हैं, जो एक ऐसे प्रारूप में प्रलेखित होता है, जिसे किसी विशिष्ट समस्या से बंधे विनिर्देशन की आवश्यकता नहीं होती है।
डिज़ाइन पैटर्न कई वर्गों से रचे होते हैं (नीचे प्रलेखन देखें). संरचना, प्रतिभागी और सहयोग खंड विशेष रूप से दिलचस्प हैं। ये वर्ग एक "डिज़ाइन आकृति" की व्याख्या करते हैं: एक आद्य रूप "माइक्रो-आर्कीटेक्चर" जिसे डेवलपर्स कॉपी करते हैं और डिज़ाइन पैटर्न द्वारा वर्णित आवर्ती समस्या के समाधान हेतु अपने विशिष्ट डिज़ाइन के लिए अनुकूलित करते हैं। माइक्रो-आर्कीटेक्चर, प्रोग्राम घटकों (जैसे, वर्ग, तरीके...) और उनके संबंधों का एक सेट है। डेवलपर्स, इस आद्य रूप माइक्रो-आर्कीटेक्चर के अपने डिज़ाइनों में प्रवर्तन द्वारा डिज़ाइन पैटर्न का उपयोग करते हैं, जिसका मतलब है कि उनके डिज़ाइनों में माइक्रो-आर्कीटेक्चर की संरचना और संगठन, चयनित डिज़ाइन आकृति के समान होगा।
इसके अतिरिक्त, पैटर्न, डेवलपर्स को सॉफ्टवेयर की परस्पर क्रिया के लिए अच्छी तरह से ज्ञात, अच्छी तरह से समझे हुए नाम के प्रयोग से संवाद करने की अनुमति देते हैं। आम डिज़ाइन पैटर्न को "अस्थाई" डिज़ाइन से अधिक मजबूत बनाते हुए, समय के साथ सुधारा जा सकता है।
डिज़ाइन पैटर्न को विशेष डोमेन में कोडबद्ध करने के प्रयास भी किये गए हैं, जिसमें वर्तमान डिज़ाइन पैटर्न के उपयोग सहित डोमेन विशिष्ट डिज़ाइन पैटर्न शामिल है। उदाहरणों में शामिल हैं प्रयोक्ता अंतरफलक डिज़ाइन पैटर्न, सूचना विज़ुअलाइज़ेशन, "सुरक्षित प्रयोज्यता" और वेब डिज़ाइन.
वार्षिक पैटर्न लैंग्वेजेस ऑफ़ प्रोग्रामिंग सम्मेलन की कार्यवाही में डोमेन विशेष पैटर्न के कई उदाहरण शामिल हैं।
डिज़ाइन पैटर्न को मूलतः क्रिएशनल पैटर्न, स्ट्रक्चरल पैटर्न और बिहेविअरल पैटर्न श्रेणियों में बांटा गया है और उनकी व्याख्या डेलिगेशन, एग्रीगेशन और कंसल्टेशन की अवधारणाओं के उपयोग द्वारा की गई है। ऑब्जेक्ट-उन्मुख डिज़ाइन की अधिक पृष्ठभूमि जानने के लिए कपलिंग और कोहीज़न देखें. ऑब्जेक्ट-उन्मुख प्रोग्रामिंग की अधिक पृष्ठभूमि के लिए, इन्हेरिटेंस, इंटरफ़ेस और पॉलीमोर्फिज़म देखें. एक अन्य वर्गीकरण ने आर्कीटेक्चरल डिज़ाइन पैटर्न की धारणा को भी पेश किया है, जिसे सॉफ्टवेयर के आर्कीटेक्चर स्तर पर लागू किया जा सकता है जैसे कि मॉडल-व्यू-कंट्रोलर पैटर्न.
एक डिज़ाइन पैटर्न के लिए प्रलेखन, उस संदर्भ, जिसमें इस पैटर्न का उपयोग किया गया है, संदर्भ के अंदर के फ़ोर्स जिसे पैटर्न सुलझाने का प्रयास करता है और प्रस्तावित समाधान की व्याख्या करता है। डिज़ाइन पैटर्न को प्रलेखित करने के लिए कोई एक मानक प्रारूप नहीं है। बल्कि, विभिन्न पैटर्न लेखकों द्वारा विभिन्न प्रकार के प्रारूपों का प्रयोग किया गया है। तथापि, मार्टिन फोलर के अनुसार, कुछ निश्चित पैटर्न प्रारूप अन्य प्रारूपों की तुलना में ज्यादा लोकप्रिय हो गए हैं और फलस्वरूप पैटर्न लेखन के नए प्रयासों के लिए एक आम आरंभिक चरण बन गए हैं। आम तौर पर इस्तेमाल किये जाने वाले प्रलेखन प्रारूप का एक उदाहरण है, एरिक गामा, रिचर्ड हेम, राल्फ जॉनसन और जॉन लिसिडेस (जो सामूहिक रूप से "द गैंग ऑफ़ फोर" या संक्षेप में Gof के तौर पर जाने जाते हैं) द्वारा उनकी पुस्तक "डिज़ाइन पैटर्न" में प्रयुक्त प्रारूप. इसमें निम्नलिखित वर्ग हैं:कंप्यूटर विज्ञान के क्षेत्र में, डिज़ाइन पैटर्न की अवधारणा के बारे में कुछ आलोचनाएं मौजूद हैं।
डिज़ाइन पैटर्न का दुरुपयोग, अनावश्यक कोड को लागू करने में परिणत हो सकता है। यह कुशल सॉफ्टवेयर विकास की सादगी के प्रतिमान के विपरीत है।
डाइनमिक प्रोग्रामिंग लैंग्वेज के उपयोगकर्ताओं ने कई डिज़ाइन पैटर्न की भाषाओं, जैसे C++ और Java की सीमाओं के लिए वर्कअराउंड के रूप में चर्चा की है। उदाहरण के लिए, विज़िटर पैटर्न को उस भाषा में लागू करने की जरूरत नहीं है, जो मुल्टीमेथड्स का समर्थन करती है। विज़िटर का उद्देश्य मौजूदा वर्गों में, उन्हें बिना संशोधित किए नई संक्रियाएं जोड़ना है। C++ में, एक वर्ग को एक विशिष्ट और बंद तरीकों के सेट वाले, सिंटैक्टिक स्ट्रक्चर के रूप में घोषित किया गया है। मुल्टीमेथड्स वाली एक भाषा में, जैसे कॉमन लिस्प वर्ग के लिए तरीके, उस वर्ग संरचना से बाहर होते हैं और व्यक्ति उन्हें बिना बदले नए तरीके जोड़ सकता है। इसी तरह, डेकोरेटर पैटर्न, डाइनेमिक डेलीगेशन के कार्यान्वयन के बराबर है, जैसा कि कॉमन लिस्प, ऑब्जेक्टिव C, सेल्फ और JavaScript में पाया जाता है।
पीटर नोर्विग ने "डिज़ाइन पैटर्न इन डाइनमिक प्रोग्रामिंग" में डाइनमिक भाषाओं में विभिन्न पैटर्न को कार्यान्वित करने की घिसी-पिटी बात की चर्चा करते हैं। नोर्विग और अन्य ने उन भाषा गुणों की व्याख्या की है, जो विभिन्न पैटर्न को आवेष्टित या स्थानापन्न करते हैं, जिसे C++ के उपयोगकर्ता को स्वयं के लिए लागू करना जरूरी होगा।
कुछ लेखकों का आरोप है कि डिज़ाइन पैटर्न, एब्स्ट्रेक्शन के अन्य रूपों से महत्वपूर्ण रूप से भिन्न नहीं हैं और प्रोग्रामिंग के क्षेत्र में मौजूदा तथ्यविषयक वर्णन के लिए नई शब्दावली का प्रयोग (आर्कीटेक्चर समुदाय से लिया गया) अनावश्यक है। मॉडल-व्यू-कनट्रोलर प्रतिमान को "पैटर्न" के एक उदाहरण के रूप में उद्धृत किया गया है, जो "डिज़ाइन पैटर्न" की अवधारणा से कई वर्षों पहले से व्याप्त है। इस पर कुछ और लोग तर्क देते हैं कि डिज़ाइन पैटर्न समुदाय का प्राथमिक योगदान (और गैंग ऑफ़ फोर बुक) अलेक्जेंडर की पैटर्न भाषा का इस्तेमाल प्रलेखन के एक रूप में करना था; एक अभ्यास जिसे अक्सर साहित्य में नजरअंदाज किया गया है।