आप सही हैं - कॉपी-पेस्ट बढ़िया काम करता है, और DRY का कोई मतलब नहीं है जब आपका कार्य एक प्रोग्राम तैयार करना है जिसके लिए या तो कॉपी किए गए टेम्पलेट या कॉपी को भविष्य में बनाए या विकसित नहीं करना होगा। जब उन दो सॉफ़्टवेयर घटकों में एक पूरी तरह से अलग जीवन चक्र होता है, तो उन्हें एक साथ साझा करके समान कोड को एक आम काम में बदल दिया जाता है जो कि भारी विकास के अंतर्गत होता है, वास्तव में प्रयास के लिए अप्रत्याशित प्रभाव हो सकते हैं। दूसरी ओर, जब एक प्रोग्राम या प्रोग्राम सिस्टम के अंदर कोड सेक्शन को कॉपी करते हैं, तो इन सभी हिस्सों में आमतौर पर एक ही जीवन चक्र होता है। मैं नीचे बताऊंगा कि DRY और परियोजना प्रबंधन के लिए इसका क्या अर्थ है।
गंभीरता से, इस तरह के बहुत सारे कार्यक्रम हैं: उदाहरण के लिए, कंप्यूटर गेम उद्योग बहुत सारे प्रोग्राम तैयार करता है जिन्हें कुछ महीनों या एक वर्ष की छोटी अवधि में बनाए रखना पड़ता है, और जब वह समय समाप्त हो जाता है, तो कॉपी-पेस्ट करना पिछले गेम से पुराना कोड जहां रखरखाव की अवधि समाप्त हो जाती है, एक नए गेम के कोड बेस में पूरी तरह से ठीक है और चीजों को गति दे सकता है।
दुर्भाग्यवश, पिछले वर्षों में मुझे जिन कार्यक्रमों से जूझना पड़ा, उनका जीवन चक्र इससे बहुत अलग है। आवश्यकताओं का 98% या बग फिक्स अनुरोध जो मेरे पास आए थे वे परिवर्तन अनुरोध थेमौजूदा कार्यक्रमों के लिए। और जब भी आपको सॉफ़्टवेयर के किसी मौजूदा टुकड़े में कुछ बदलने की ज़रूरत हो, "प्रोजेक्ट मैनेजमेंट" या प्लानिंग सबसे अच्छा काम करती है, जब आपके परीक्षण और डिबगिंग के प्रयास काफी कम होते हैं - जो एक ही जगह पर कुछ बदलने पर कॉपी के कारण नहीं होगा भुना हुआ व्यावसायिक तर्क आप आसानी से भूल जाते हैं कि आपको कोड आधार में एक दर्जन अन्य स्थानों को भी बदलना होगा। और यहां तक कि अगर आप उन सभी स्थानों को खोजने का प्रबंधन करते हैं, तो उन सभी को बदलने का समय (और परिवर्तनों का परीक्षण) शायद बहुत अधिक है जैसे कि आपके पास बदलने के लिए केवल एक ही स्थान है। इसलिए यहां तक कि आप बदलाव के लिए एक सटीक अनुमान लगा सकते हैं, लागत की तुलना में एक दर्जन गुना अधिक होने की आवश्यकता आसानी से परियोजना के बजट के साथ टकरा सकती है।
TLDR - जब भी आप ऐसे प्रोग्राम का विकास करते हैं जहाँ मूल या कॉपी के बगफिक्सिंग और रखरखाव के लिए कोई आवश्यकता या जिम्मेदारी नहीं है, तो बेझिझक कॉपी करें। लेकिन अगर आप, आपकी टीम या आपकी कंपनी जिम्मेदार है या हो सकता है, तो जब भी आप कर सकते हैं DRY लागू करें।
उदाहरण
एक परिशिष्ट के रूप में, मुझे बताएं कि "बगफिक्सिंग और रखरखाव" का क्या मतलब है, और यह कैसे नियोजन में अप्रत्याशितता की ओर जाता है, विशेष रूप से एक उत्पाद के अंदर, एक वास्तविक दुनिया उदाहरण के द्वारा। मैंने वास्तव में इस तरह की चीजों को वास्तव में होते देखा है, शायद 100 उदाहरणों के साथ नहीं, लेकिन समस्याएँ तब भी शुरू हो सकती हैं जब आपके पास सिर्फ एक डुप्लिकेट उदाहरण हो।
कार्य: एक आवेदन के लिए 100 अलग-अलग रिपोर्ट बनाते हैं, प्रत्येक रिपोर्ट बहुत समान दिखती है, रिपोर्ट के बीच कुछ आवश्यकता अंतर, कुछ अलग तर्क, लेकिन सभी सभी में, कई अंतर नहीं।
जिस देव को यह कार्य मिलता है वह पहले एक बनाता है (यह कहने में 3 दिन लगते हैं), क्यूए और ग्राहक के निरीक्षण के कारण कुछ बदलाव या मामूली बग ठीक होने के बाद, यह ठीक चलता है। फिर उन्होंने कॉपी-पेस्ट करके और पूरी चीज़ को संशोधित करके अगली रिपोर्ट बनाना शुरू कर दिया, फिर अगली, और प्रत्येक नई रिपोर्ट के लिए उन्हें औसतन ~ 1 दिन की आवश्यकता थी। पहली नजर में बहुत ही अनुमानित ...
अब, 100 रिपोर्ट "तैयार" होने के बाद, कार्यक्रम वास्तविक उत्पादन के लिए चला जाता है, और कुछ समस्याएं होती हैं जिन्हें क्यूए के दौरान अनदेखा किया गया था। हो सकता है कि प्रदर्शन की समस्याएं हों, हो सकता है कि रिपोर्टें नियमित रूप से दुर्घटनाग्रस्त हों, हो सकता है कि अन्य चीजें उद्देश्य के अनुसार काम न करें। अब, जब DRY सिद्धांत लागू किया गया था, उन 90% समस्याओं को कोड आधार को एक स्थान पर बदलकर हल किया जा सकता था। लेकिन कॉपी-पेस्ट के दृष्टिकोण के कारण, समस्या को एक बार के बजाय 100 बार हल करना पड़ता है। और एक रिपोर्ट से दूसरी रिपोर्ट में पहले से ही लागू किए गए परिवर्तनों के कारण, देवता पहले रिपोर्ट के फिक्स को दूसरे 99 के लिए जल्दी से कॉपी-पेस्ट नहीं कर सकता है। उसे सभी 100 रिपोर्टों को देखना होगा, उन्हें पढ़ना होगा, बदलाव को संशोधित करना होगा। रिपोर्ट करें, इसका परीक्षण करें, और शायद व्यक्तिगत रूप से इसमें से प्रत्येक को डीबग करें। पीएम के लिए, यह वास्तव में कठिन होने लगता है - वह निश्चित रूप से एक "नियमित" बग फिक्स के लिए समय ले सकता है (कहते हैं, 3 घंटे) और इसे 100 से गुणा करें, लेकिन वास्तव में, यह शायद सबसे गलत अनुमान है, कुछ सुधार हो सकते हैं दूसरों की तुलना में बनाना आसान है, दूसरों को कठिन हो सकता है। और अगर यह अनुमान सही है, तो डिबगिंग की लागत 100 गुना अधिक है, क्योंकि उन्हें आपकी कंपनी के बहुत सारे पैसे खर्च होंगे।
अगली बार ऐसा ही होगा जब ग्राहक उन सभी रिपोर्टों में अपनी कंपनी के प्रतीक का रंग बदलने के लिए कहता है, पृष्ठ आकार को विन्यास योग्य बनाने के लिए, या कुछ अन्य नई आवश्यकता से जो सभी रिपोर्टों को समान तरीके से प्रभावित करता है। इसलिए यदि ऐसा होता है, तो आप लागतों का अनुमान लगा सकते हैं और ग्राहक को उस कीमत का 100 गुना बिल दे सकते हैं, जब कोड डीआरवाई हो चुका होता है। हालाँकि, इसे कुछ बार आज़माएँ और फिर ग्राहक इस परियोजना को रद्द कर देगा क्योंकि वह शायद आपकी अत्यधिक खर्चीली लागत का भुगतान करने को तैयार नहीं होगा। और शायद उस बिंदु पर कोई यह सवाल पूछेगा कि ऐसा क्यों हुआ और उस व्यक्ति पर उंगली से इशारा करना चाहिए जिसने इस कॉपी-पेस्ट प्रोग्रामिंग के लिए निर्णय लिया था।
मेरा कहना है: जब आप दूसरों के लिए सॉफ़्टवेयर का उत्पादन करते हैं, तो आपके पास हमेशा कम से कम समय के लिए काम करने की जिम्मेदारी होती है, बग को ठीक करना, बदलती आवश्यकताओं के लिए कार्यक्रम को अनुकूलित करना आदि। यहां तक कि एक ग्रीन-फील्ड प्रोजेक्ट में, ये भागों शुरू में विकास के प्रयास की तुलना में कहीं अधिक तेजी से जोड़ सकते हैं। और विशेष रूप से जब आपके सभी कॉपी-पेस्ट किए गए कोड एक उत्पाद के अंदर होते हैं, तो जिम्मेदारी का समय सभी भागों के लिए समान होता है, जो उस स्थिति से काफी अलग होता है जहां आप एक पुराने प्रोजेक्ट से कुछ पुराने कोड को कॉपी-पेस्ट करते हैं जो अब नहीं है सक्रिय रखरखाव के तहत।