DRY सिद्धांत का उल्लंघन


10

मुझे यकीन है कि इस विरोधी पैटर्न के लिए एक नाम है कहीं; हालाँकि, मैं इसे जानने के लिए प्रतिमान-साहित्य से पर्याप्त परिचित नहीं हूँ।

इस परिदृश्य पर विचार करें:

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

कई प्रोग्रामर बनाए रखते हैं or0इसलिए यह अब संस्करण है orNc0अब संस्करण है cN। दुर्भाग्य से अधिकांश प्रोग्रामर जो क्लास को बनाए रखते थे, or0वे पूरी तरह से अनजान c0थे- जो डीआरवाई सिद्धांत के ज्ञान के लिए मेरे द्वारा सोचा जा सकने वाले सबसे मजबूत तर्कों में से एक है। और इसमें कोड का स्वतंत्र रखरखाव भी हो सकता है c। किसी भी तरह से यह प्रतीत होता है कि or0और c0एक दूसरे से स्वतंत्र बनाए रखा गया था। और, खुशी और खुशी, एक त्रुटि उत्पन्न हो रही है cNजो इसमें नहीं होती है orN

तो मुझे कुछ सवाल पूछने हैं:

1.) क्या इस विरोधी पैटर्न का कोई नाम है? मैंने देखा है ऐसा अक्सर होता है मुझे विश्वास करना मुश्किल होगा कि यह एक नाम-विरोधी पैटर्न नहीं है।

2.) मैं कुछ विकल्प देख सकता हूं:

a।) orNएक पैरामीटर लेने के लिए ठीक करें जो सभी सदस्य चर के मूल्यों को निर्दिष्ट करता है जो इसकी आवश्यकता है। फिर संशोधित सभी आवश्यक मापदंडों के साथ cNकॉल करने के लिए संशोधित करें orN

b।) मैन्युअल रूप से पोर्ट फ़िक्सेस से orNकरने का प्रयास करें cN। (ध्यान रहे आप ऐसा नहीं करना चाहते हैं लेकिन यह एक यथार्थवादी संभावना है।)

सी।) पुनरावृत्ति orNको - cNआघात, हाँ, लेकिन मैं इसे पूर्णता के लिए सूचीबद्ध करता हूं।

डी।) यह पता लगाने की कोशिश करें कि कहां cNटूटी हुई है और फिर इसे स्वतंत्र रूप से मरम्मत करें orN

वैकल्पिक एक लंबे समय में सबसे अच्छा ठीक तरह लगता है, लेकिन मुझे शक है ग्राहक मुझे इसे लागू करने देगा। कभी भी चीजों को ठीक करने के लिए समय या पैसा नहीं, लेकिन हमेशा समय और पैसा एक ही समस्या को ठीक करने के लिए 40 या 50 बार, सही?

क्या कोई अन्य दृष्टिकोण सुझा सकता है जिसे मैंने नहीं माना होगा?


"क्या इस विरोधी पैटर्न का कोई नाम है?" 'उल्लंघन-सूखा' विरोधी पैटर्न? :) IMHO आप बहुत खुद इसे जवाब दिया।
स्टीवन ज्यूरिस

शायद इसे "द ड्राय वायलर" कहा जाए?
FrustratedWithFormsDesigner

2
मैं इसे कॉल करता हूं: DRY बंपिंग।
एजेसी

5
कॉपी और पेस्ट कोडिंग?
टाइलेरमैक सेप

इसे "बहुत सारे रसोइयों को शोरबा को खराब करना" पैटर्न कहा जाता है।
डॉक ब्राउन

जवाबों:


18
  1. इसे सिर्फ डुप्लिकेट कोड कहा जाता है - मुझे इसके लिए किसी और फैंसी नाम की जानकारी नहीं है। दीर्घकालिक परिणाम आपके द्वारा वर्णित किए गए हैं, और बदतर हैं।

  2. बेशक, यदि संभव हो तो दोहराव को खत्म करना आदर्श विकल्प है। इसमें बहुत समय लग सकता है (हाल ही में हमारी विरासत परियोजना में एक मामले में, मेरे पास कई विधियां एक वर्ग पदानुक्रम में 20 से अधिक उपवर्गों में दोहराई गई थीं, जिनमें से कई ने वर्षों में अपने स्वयं के मामूली अंतर / विस्तार को विकसित किया था। मुझे लगभग 1,5 वर्षों के बाद क्रमिक इकाई परीक्षण लेखन और सभी दोहरावों से छुटकारा पाने के लिए फिर से तैयार करना। दृढ़ता हालांकि इसके लायक थी)।

    ऐसे मामले में, आपको अस्थायी सुधारों के रूप में अभी भी एक या एक से अधिक विकल्पों की आवश्यकता हो सकती है, भले ही आप दोहराव को समाप्त करने की दिशा में बढ़ना शुरू करने का फैसला करें। हालांकि, उनमें से कौन बेहतर है, बहुत सारे कारकों पर निर्भर करता है, और अधिक संदर्भ के बिना हम सिर्फ अनुमान लगा रहे हैं।

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


3
+1, यदि न केवल डुप्लिकेट कोड के उल्लेख के लिए, बल्कि कोड रीफैक्टरिंग की आपकी कहानी में शामिल सरासर प्रयास के लिए। : डी
एंड्रियास जोहानसन

9

WET (We Enjoy Typing) पैटर्न का संदर्भ है लेकिन मुझे नहीं पता कि यह एक मानक नाम है।

... सॉफ़्टवेयर लाइसेंस DRY के लिए एक उल्लेखनीय अपवाद है (खुद को दोहराएं नहीं) अभ्यास - सॉफ़्टवेयर लाइसेंसिंग कोड WET (वीज़ टाइपिंग - DRY के विपरीत) का यथासंभव उपयोग करना चाहिए।

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

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


3
WET का मतलब हो सकता है: हर चीज को दो बार लिखें
StuperUser

1
@StuperUser मुझे पता चला कि डेलीवेट पर कल ...
जेरेमी-जॉर्ज

3

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

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

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


3

यदि आप कोड की नकल कर रहे हैं, तो आप दोहरे रखरखाव या अधिक विशेष रूप से: कोड दोहराव का एक तकनीकी ऋण पेश करेंगे ।

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

रिफैक्टर कोड से सहमत होने के लिए अपने ग्राहक को प्राप्त करना मुश्किल हो सकता है क्योंकि तकनीकी ऋण को ठीक करने के लिए गैर-तकनीकी व्यक्ति को समझाना मुश्किल है। तो अगली बार जब आप समय का अनुमान देते हैं, तो केवल उस समय को शामिल करें जिसमें आपके अनुमानों के लिए रिफ्लेक्टर लगता है । अधिकांश ग्राहक यह मान लेते हैं कि जिस समय आप फिक्स करते हैं, उस दौरान आप कोड की सफाई कर रहे होते हैं।


1

मेरे लिए स्पेगेटी कोड की तरह लगता है। सबसे अच्छा फिक्स एक रिफ्लेक्टर / रीराइट है।

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

http://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Spaghetti.jpg/175px-Spaghetti.jpg


-1 रिफैक्टर और पुनर्लेखन दो बहुत अलग विकल्प हैं। कुल पुनर्लेखन, सॉफ्टवेयर को फेंकना, कभी भी अच्छा विचार नहीं है। joelonsoftware.com/articles/fog000000006969.html
P.Brian.Mackey

1
स्पेगेटी कोड आईएमओ एक बहुत अधिक सामान्य है - और शिथिल शब्द। हालांकि इस तरह के कोड में अक्सर डुप्लिकेशन शामिल होते हैं, आप बिना किसी दोहराव के स्पेगेटी कोड रख सकते हैं, और अत्यधिक डुप्लिकेट भी हो सकते हैं लेकिन स्पेगेटी कोड नहीं।
पेटर तोर्क

@ P.Brian.Mackey मैंने कभी नहीं कहा कि Refactor और rewrite एक ही बात थी। ओपी को तय करना चाहिए कि किसका उपयोग करना है।
टॉम स्क्वॉयर

2
मैं उस लेख का प्रशंसक नहीं था। मैं मानता हूं कि पुनर्लेखन में उद्धृत उदाहरण में एक बुरा विचार था, लेकिन सिर्फ इसलिए कि यह उस उदाहरण में एक बुरा विचार था इसका मतलब यह नहीं है कि यह हमेशा एक बुरा विचार है। शुरुआत के लिए, क्या फिर से लिखना किसी अन्य प्रगति को अवरुद्ध करेगा? यदि हां, तो यह बुरा है; यदि नहीं, तो ठीक है कि लगभग उतना बुरा नहीं है।
jhocking

@ हॉकिंग - मेरा मानना ​​है कि नो-रीराइट नीति का मुद्दा अन्य कार्यक्रमों में प्रगति को रोकना नहीं है, बल्कि समय के साथ वास्तविक सुधारों का नुकसान है। उस जादुई "अगर (गोल्डनगेट> 22)" को खराब नाम दिया गया है, फिर भी एक विशिष्ट समस्या को हल करता है, जिसे बिना घंटे या अनुसंधान के दिनों में पहचानना असंभव हो सकता है। अब, उसी डेटा को लेना और उसे सुधारना इसके बजाय क्या किया जाना चाहिए। वह एक रिफलेक्टर है। इसे फेंक देना और यह कहना कि "हम इसे अगली बार सही करेंगे" समय की बर्बादी है। पहले से ही हल की गई समस्याओं को हल करने का एक ही कारण समय की बर्बादी है। बुरे के शीर्ष पर अच्छा कोड जोड़ने से कर्ज बढ़ता है
P.Brian.Mackey

0

आप कहते हैं कि आप पूरी तरह से ए को दोष नहीं दे सकते हैं - लेकिन इस तरह से एक वर्ग की नकल करना वास्तव में अक्षम्य है। यह आपकी कोड समीक्षा प्रक्रिया में एक बड़ी विफलता है। यह संभवतः सबसे भारी विफलता है, जिसमें कोई कोड समीक्षा नहीं है।

यदि आपको कभी लगता है कि आपको एक समय सीमा को पूरा करने के लिए भयानक कोड का उत्पादन करना है, तो उसके बाद रिलीज के लिए पूर्ण सर्वोच्च प्राथमिकता अनुरोध अब भयानक कोड को ठीक करने के लिए होना चाहिए। तो आपकी समस्या दूर हो गई।

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


-3

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

साझा व्यवहार क्या है और कैसे साझा किया गया है, इसके आधार पर, इसे शॉटगन सर्जरी कहा जा सकता है , अंतर यह है कि यहां एक एकल तार्किक सुविधा एक एकल के बजाय कई वर्गों द्वारा प्रदान की जाती है।


1
यह एक ही चीज़ की तरह नहीं दिखता है। डायवर्जेंट चेंज तब होता है जब एक ही क्लास में कई बदलाव किए जाते हैं। ओपी कोड दोहराव का वर्णन करता है। शॉटगन सर्जरी भी एक ही बात नहीं है। शॉटगन सर्जरी कई अलग-अलग वर्गों के लिए किए गए एक ही परिवर्तन का वर्णन करती है।
रॉबर्ट हार्वे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.