एक विरोधी पैटर्न क्या है?


193

मैं पैटर्न और विरोधी पैटर्न का अध्ययन कर रहा हूं। मुझे पैटर्न के बारे में स्पष्ट जानकारी है, लेकिन मुझे पैटर्न के बारे में जानकारी नहीं है। वेब और विकिपीडिया की परिभाषाएँ मुझे बहुत भ्रमित करती हैं।

क्या कोई मुझे सरल शब्दों में समझा सकता है कि एक विरोधी पैटर्न क्या है? उद्देश्य क्या है? वो क्या करते हैं? यह बुरी बात है या अच्छी बात है?




यह बुरा माना जाता है, लेकिन एकमात्र समाधान हो सकता है। दो बार सोचो और जाओ।
Константин Ван

जवाबों:


245

सॉफ़्टवेयर विकास में एंटी-पैटर्न कुछ पैटर्न होते हैं जिन्हें खराब प्रोग्रामिंग प्रथा माना जाता है।

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

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

उदाहरण के लिए:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

ऊपर दिए गए उदाहरण में एक ऑब्जेक्ट है जो सब कुछ करता है । ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, कोड को कम युग्मित रखने और अंततः अधिक बनाए रखने के लिए विभिन्न वस्तुओं के लिए अच्छी तरह से परिभाषित जिम्मेदारियां रखना बेहतर होगा:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

लब्बोलुआब यह है कि आमतौर पर इस्तेमाल किए जाने वाले पैटर्न ( डिजाइन पैटर्न ) के साथ सॉफ्टवेयर विकसित करने के अच्छे तरीके हैं , लेकिन ऐसे भी तरीके हैं जिन्हें सॉफ्टवेयर विकसित और कार्यान्वित किया जाता है जिससे समस्याएं हो सकती हैं। खराब सॉफ्टवेयर विकास प्रथाओं को माना जाता है कि पैटर्न प्रतिमान हैं।


9
GodObject के बगल में एंटी-पैटर्न्स का कोई अन्य उदाहरण?
टॉमाज़ मूलार्किज

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

@ टॉमाज़ कुछ भी जो बुरा है, लेकिन कुछ लोगों द्वारा किया जाता है, एक एंटीपैटर्न है। जैसे, try: <do something>; except: passपायथन में कार्डिनल सिन एंटीपैटर्न हो सकता है। इसे देखें: realpython.com/blog/python/…
eric

1
क्या एक सिंगलटन को एक विरोधी पैटर्न माना जा सकता है क्योंकि यह समानांतर में परीक्षण को मॉक और रन करना कठिन बनाता है (चूंकि सभी परीक्षण एक ही सिंगलटन का उपयोग करते हैं और उत्परिवर्तित करते हैं, जिसके परिणामस्वरूप असंगतताएं होती हैं)?
खोया

63

जब भी मैं एंटी-पैटर्न के बारे में सुनता हूं, मैं एक और शब्द को याद करता हूं। गंध सूँघना।

"डिजाइन की गंध डिजाइन में कुछ संरचनाएं हैं जो मौलिक डिजाइन सिद्धांतों के उल्लंघन का संकेत देती हैं और डिजाइन की गुणवत्ता को नकारात्मक रूप से प्रभावित करती हैं।" ("सॉफ्टवेयर डिजाइन की बदबू आ रही है: तकनीकी ऋण का प्रबंधन")

डिजाइन सिद्धांतों का उल्लंघन करने के आधार पर कई डिज़ाइन की महक को वर्गीकृत किया गया है:

अमूर्त गंध

मिसिंग एब्सट्रैक्शन: यह गंध तब उत्पन्न होती है जब डेटा का क्लाम्प्स या एन्कोडेड स्ट्रिंग्स का उपयोग क्लास या इंटरफ़ेस बनाने के बजाय किया जाता है।

इम्पीरेटिव एब्स्ट्रेक्शन: यह गंध तब उत्पन्न होती है जब किसी ऑपरेशन को क्लास में बदल दिया जाता है।

अधूरा अमूर्त: यह गंध तब उत्पन्न होती है जब एक अमूर्त पूरी तरह से पूरक या परस्पर संबंधित विधियों का समर्थन नहीं करता है।

मल्टीफ़ैसेटेड एब्स्ट्रेक्शन: यह गंध तब उत्पन्न होती है, जब एब्सट्रैक्शन को एक से अधिक जिम्मेदारी सौंपी जाती है।

अनावश्यक अमूर्तता : यह गंध तब होती है जब एक अमूर्त पदार्थ की वास्तव में आवश्यकता नहीं होती है (और इस तरह से बचा जा सकता था) एक सॉफ्टवेयर डिजाइन में पेश किया जाता है।

अभेद्य अमूर्त: यह गंध तब उत्पन्न होती है जब एक अमूर्त अप्रयुक्त छोड़ दिया जाता है (या तो सीधे उपयोग नहीं किया जाता है या पहुंच योग्य नहीं है)।

डुप्लिकेट एब्सट्रैक्शन: यह गंध तब उत्पन्न होती है जब दो या अधिक अमूर्त समान नाम या समान कार्यान्वयन या दोनों होते हैं।

इनकैप्सुलेशन से बदबू आती है

डेफिसिएंसी इनकैप्सुलेशन: यह गंध तब होती है जब एक अमूर्त के एक या अधिक सदस्यों की घोषित पहुंच वास्तव में आवश्यक होती है।

लीकेज एनकैप्सुलेशन: यह गंध तब उत्पन्न होती है जब एक एब्सट्रैक्शन "एक्सपोज़" या "लीक" कार्यान्वयन विवरण अपने सार्वजनिक इंटरफ़ेस के माध्यम से होता है।

मिसिंग एनकैप्सुलेशन: यह गंध तब होता है जब कार्यान्वयन भिन्नता एक अमूर्त या पदानुक्रम के भीतर समझाया नहीं जाता है।

Unexploited एन्कैप्सुलेशन: यह गंध तब उत्पन्न होती है जब क्लाइंट कोड स्पष्ट प्रकार की जांच (जंजीर if- अन्यथा या ऑब्जेक्ट के प्रकार की जांच करने वाले स्विच का उपयोग करके) का उपयोग करता है, बजाय एक पदानुक्रम के भीतर पहले से ही टाइप किए गए प्रकारों में भिन्नता का दोहन करने के।

संशोधन से बदबू आती है

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

अपर्याप्त संशोधन: यह गंध तब उत्पन्न होती है जब एक अमूर्त मौजूद होता है जो पूरी तरह से विघटित नहीं हुआ है, और एक और अपघटन इसके आकार, कार्यान्वयन जटिलता या दोनों को कम कर सकता है।

साइक्ली-डिपेंडेंट मॉड्युलराइजेशन: यह गंध तब उत्पन्न होती है जब दो या दो से अधिक एब्स्ट्रैक्ट एक-दूसरे पर प्रत्यक्ष या अप्रत्यक्ष रूप से निर्भर होते हैं (एब्सट्रैक्ट के बीच एक टाइट कपलिंग बनाते हैं)।

हब-लाइक मॉडर्लाइज़ेशन: यह गंध तब उत्पन्न होती है जब एक अमूर्त में निर्भरता (आने वाली और बाहर जाने वाली) दोनों अन्य बड़ी संख्या में होते हैं।

पदानुक्रम में बदबू आती है

गुम पदानुक्रम: यह गंध तब उत्पन्न होती है जब एक कोड खंड सशर्त तर्क (आमतौर पर "टैग किए गए प्रकार" के साथ संयोजन में) का उपयोग स्पष्ट रूप से व्यवहार में भिन्नता का प्रबंधन करने के लिए करता है जहां एक पदानुक्रम बनाया जा सकता था और उन विविधताओं को संक्षिप्त करने के लिए उपयोग किया जा सकता था।

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

अनियंत्रित पदानुक्रम: यह गंध तब उत्पन्न होती है जब पदानुक्रम में प्रकारों के बीच अनावश्यक दोहराव होता है।

वाइड पदानुक्रम: यह गंध तब उत्पन्न होती है जब एक वंशानुगत पदानुक्रम "बहुत" व्यापक होता है जो यह दर्शाता है कि मध्यवर्ती प्रकार गायब हो सकते हैं।

सट्टा पदानुक्रम: यह गंध तब उत्पन्न होती है जब पदानुक्रम में एक या एक से अधिक प्रकार सट्टा प्रदान किया जाता है (यानी, वास्तविक आवश्यकताओं के बजाय कल्पना आवश्यकताओं के आधार पर)।

गहरी पदानुक्रम: यह गंध तब पैदा होती है जब एक वंशानुक्रम पदानुक्रम "अत्यधिक" गहरा होता है।

विद्रोही पदानुक्रम: यह गंध तब उत्पन्न होती है जब एक उपप्रकार अपने सुपरपेप्ट (ओं) द्वारा प्रदान की गई विधियों को खारिज कर देता है।

टूटी हुई पदानुक्रम: यह गंध तब पैदा होती है जब एक सुपरपाइप और इसके उपप्रकार एक "IS- A" रिश्ते को साझा रूप से तोड़-मरोड़ के परिणामस्वरूप साझा नहीं करते हैं।

मल्टीपाथ पदानुक्रम: यह गंध तब उत्पन्न होती है जब एक उपप्रकार सीधे दोनों के साथ-साथ अप्रत्यक्ष रूप से एक पदानुक्रम से विरासत में पदानुक्रम में अनावश्यक विरासत पथों की ओर जाता है।

चक्रीय पदानुक्रम: यह गंध तब उत्पन्न होती है जब पदानुक्रम में एक सुपरपाइप उसके किसी भी उपप्रकार पर निर्भर करता है।


उपरोक्त परिभाषा और वर्गीकरण का वर्णन "सॉफ्टवेयर डिज़ाइन की महक: तकनीकी ऋण का प्रबंध " में किया गया है। कुछ और प्रासंगिक संसाधन यहां मिल सकते हैं


41

एक पैटर्न एक विचार है कि किसी वर्ग की समस्या को कैसे हल किया जाए। एक एंटी-पैटर्न एक विचार है कि इसे कैसे हल नहीं किया जाना चाहिए क्योंकि उस विचार को लागू करने से खराब डिजाइन का परिणाम होगा।

एक उदाहरण: एक "पैटर्न" कोड पुन: उपयोग के लिए एक फ़ंक्शन का उपयोग करना होगा, एक "प्रतिमान" उसी के लिए कॉपी-पेस्ट का उपयोग करना होगा। दोनों एक ही समस्या को हल करते हैं, लेकिन एक फ़ंक्शन का उपयोग आमतौर पर कॉपी-पेस्ट की तुलना में अधिक पठनीय और बनाए रखने योग्य कोड की ओर जाता है।


18

एक विरोधी पैटर्न एक समस्या को हल नहीं करने का एक तरीका है। लेकिन इसके अलावा भी बहुत कुछ है: यह एक ऐसा तरीका भी है जिसे समस्या को हल करने के प्रयासों में अक्सर देखा जा सकता है।


13

अगर आप वास्तव में एंटीपैटर्न का अध्ययन करना चाहते हैं, तो एंटीपैटर्न (ISBN-13: 978-0471197133 ) पुस्तक प्राप्त करें ।

इसमें, वे परिभाषित करते हैं "एक एंटीपैटर्न एक साहित्यिक रूप है जो एक समस्या के लिए आमतौर पर होने वाले समाधान का वर्णन करता है जो निश्चित रूप से नकारात्मक परिणाम उत्पन्न करता है।"

इसलिए, यदि यह एक बुरा प्रोग्रामिंग अभ्यास है, लेकिन एक आम नहीं - एक अनुप्रयोग, एक कंपनी या एक प्रोग्रामर तक सीमित है, तो यह एंटीपैटर्न परिभाषा के "पैटर्न" भाग को पूरा नहीं करता है।


9

गड़बड़ी करने का एक सामान्य तरीका। उदाहरण के लिए, भगवान / रसोई की कक्षा (सब कुछ करता है) की तरह।


6

दिलचस्प रूप से किसी समस्या को हल करने का एक तरीका एक पैटर्न और एक विरोधी पैटर्न दोनों हो सकता है। सिंगलटन इसका प्रमुख उदाहरण है। यह साहित्य के दोनों सेटों में दिखाई देगा।


6

एक विरोधी पैटर्न एक डिजाइन पैटर्न का पूरक है । एक विरोधी पैटर्न एक टेम्पलेट समाधान है जिसे आपको एक निश्चित स्थिति में उपयोग नहीं करना चाहिए।


6

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


4

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

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

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


2

एंटी-पैटर्न सामान्य तरीके हैं जो लोग गलत तरीके से प्रोग्राम करते हैं, या कम से कम इतना अच्छा तरीका नहीं है।


0

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

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

आप प्रश्न की जाँच कर सकते हैं कि एकल के बारे में क्या बुरा है? इस पर अलग-अलग राय समझने के लिए।


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

0

जैसे एल्गोरिथ्म में आप ब्रूट बल का उपयोग करके समाधान प्राप्त कर सकते हैं, लेकिन स्थिति जटिल हो जाने पर आपको बहुत भुगतान करना होगा।

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