क्या डिजाइन पैटर्न आमतौर पर अच्छे या बुरे के लिए एक बल है? [बन्द है]


33

मैंने सुना है यह तर्क दिया है कि कटा हुआ ब्रेड के बाद से डिज़ाइन पैटर्न सबसे अच्छी बात है। मैंने यह भी सुना है कि डिज़ाइन पैटर्न "सेकंड सिस्टम सिंड्रोम" को समाप्त करने के लिए करते हैं, कि वे बड़े पैमाने पर उपयोग किए जाते हैं, और यह कि वे अपने उपयोगकर्ताओं को लगता है कि वे वास्तव में हैं की तुलना में बेहतर डिजाइनर हैं।

मैं पूर्व शिविर के करीब आता हूं, लेकिन हाल ही में मैं ऐसे डिजाइन देख रहा हूं, जहां लगभग हर एक बातचीत में एक पर्यवेक्षक संबंध और सब कुछ एक सिंगलटन के साथ बदल दिया जाता है।

तो, लाभ और समस्याओं पर विचार करते हुए, डिजाइन पैटर्न आमतौर पर अच्छे या बुरे होते हैं, और क्यों?

जवाबों:


53

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

एलेक्स: अरे, कॉन्फ़िगर फाइल कैसे बनाई जाती हैं?

बॉब: वे एक कारखाने द्वारा उत्पन्न होते हैं, जो अंदर रहता है config.h

अब एलेक्स को पता है कि कॉन्फ़िगरेशन फ़ाइलों के निर्माण में गैर-तुच्छ तैयारी शामिल है, क्योंकि अन्यथा उनकी रचना एक कारखाने में संलग्न नहीं होगी।

हालाँकि, यदि बॉब एक ​​पैटर्न-हेडेड फोनी था, और बस इधर-उधर के पैटर्न का उपयोग करता था, तो एलेक्स कॉन्फिगरेशन के बारे में कुछ नहीं बता सकता था, क्योंकि बॉब ने हर जगह फैक्ट्री का इस्तेमाल किया था। इससे कार्यक्रम में अत्यधिक जटिलता भी होगी।

तो, पहले प्रोग्राम, फिर अपने कोड में पैटर्न स्पॉट करें, इसके विपरीत नहीं। यही कारण है कि वे प्रभावी ढंग से उपयोग किया जाता है।


11
+1 वैसे भी, लेकिन विशेष रूप से "तब स्पॉट पैटर्न" के लिए - यह ठीक है कि हमें पहली जगह में पैटर्न कैसे मिला, लेकिन आवर्ती समस्याओं की तलाश में
फ्रैंक शियर

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

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

अच्छा जवाब। गोद लेने की मेरी परिभाषा: किसी भी तकनीक को निर्माण श्रृंखला में निष्पादन योग्य, संकलित विरूपण साक्ष्य के रूप में पहचाने जाने के बाद ही अपनाया जाना माना जाता है। एक निर्माण श्रृंखला में एक भी वास्तविक निर्देश के लायक किताबें, ब्लॉग और हार्डब्रीडिंग की कोई राशि नहीं।

14

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


10

यदि सही ढंग से उपयोग किया जाए तो डिजाइन पैटर्न बहुत अच्छे हैं।

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

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

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


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

7

मुझे लगता है कि डिजाइन पेटेंट अधिक " सलाह पेटेंट " के एक अपरिवर्तनीय अनुबंध की तुलना में जिसे पूरी तरह से पालन किया जाना चाहिए। क्यूं कर? आपके द्वारा बताए गए कारण के लिए ठीक है। हर चीज में एक डिजाइन पैटर्न का पालन करना कोड की एक बड़ी गड़बड़ी की ओर जाता है जो पहली जगह में एक पैटर्न का उपयोग करने के उद्देश्य को पराजित करता है।

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

टीएल; डीआर: डिजाइन पेटेंट का उपयोग करें। बस उनका दुरुपयोग न करें


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

2

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


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

मेरे विचार से भी।
8

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

@Kramii: उदाहरण के लिए, अनिवार्य प्रोग्रामिंग भाषाओं में "फ़ंक्शन ऑब्जेक्ट" / "फ़ंक्टर" कार्यात्मक भाषाओं की तुलना में बॉयलरप्लेट कोड है, जहां फ़ंक्शन प्रथम श्रेणी हैं। आपको वहां कुछ भी कोड करने की आवश्यकता नहीं है, यह भाषा में समर्थित है। इसके विपरीत, आपको अनुक्रमिक, अनिवार्य I / O प्राप्त करने के लिए हास्केल में "IO मोनाड" नामक एक "डिज़ाइन पैटर्न" का उपयोग करना होगा, जो आपको अनिवार्य भाषाओं में मुफ्त में मिलता है। मैं सलाह देता हूं कि मैं जिस धागे से जुड़ा हुआ हूं, उसका पालन करूं।
लेनीप्रोग्रामर्स

1
@ Lenny222: मैंने लिंक पढ़ा है और आपकी बात से सहमत हूं कि पैटर्न किसी भाषा की कमियों को दूर करते हैं। हालांकि, मैं "बॉयलरप्लेट" शब्द के आपके उपयोग से असहमत हूं। बॉयलरप्लेट आमतौर पर एक ही कोड के बार-बार कार्यान्वयन को संदर्भित करता है - अक्सर कॉपी-पेस्ट कोड के बराबर या कम से कम अस्थायी कोड के टुकड़े। OTOH डिजाइन आवश्यकताओं के कार्यान्वयन को आवश्यकताओं के अनुसार अलग-अलग तरीकों से लागू किया जाना चाहिए।
क्रामि ने मोनिका जूल

0

मैं बीच में उन लोगों को पसंद करेंगे। पोस्टर की तरह सही ढंग से बताया गया है, पैटर्न की समझ आपको अच्छा डेवलपर नहीं बनाती है। दूसरी ओर पैटर्न की समझ आपको एक अच्छा डेवलपर बनने में मदद करेगी।

पैटर्न के संबंध को समझना और एक परियोजना में एक पैटर्न को देखना (जबकि गर्भाधान चरण में) वह है जो आपको एक अच्छा डेवलपर बना देगा।


0

यह अक्सर कहा जाता है कि डिज़ाइन पैटर्न प्रोग्रामिंग की समस्याओं के लिए तैयार समाधान प्रदान करता है। वे किस तरह की समस्याएं हैं? "मैं ऑब्जेक्ट व्यवहार को कैसे बदल सकता हूं, लेकिन बाकी सिस्टम से परिवर्तनों को अलग कर सकता हूं?"

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

डिजाइन पैटर्न इनकैप्सुलेशन पदानुक्रम

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


0

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

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


0

दोनों शिविर सही हैं - वे अच्छे के लिए एक बल हैं जब सही तरीके से उपयोग किया जाता है, खराब के लिए एक बल यदि वे सभी जगह बिखरे हुए हैं।


0

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


0

मुझे लगता है कि डिज़ाइन का डेटा कुछ ऐसा नहीं है जिसे आप लगातार अपने कोड पर लागू करने की कोशिश कर रहे हैं। मेरे लिए यह मुख्य रूप से डेवलपर्स के लिए एक सामान्य भाषा के बारे में है। यह कहना आसान है कि "हम एक बिल्डर पैटर्न का पालन करते हैं" पूरी चीज़ को बार-बार समझाने से।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.