डुप्लीकेट कोड

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

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

उदय
डुप्लीकेट कोड बनाने के कुछ विधि इस प्रकार हैं:


 * कॉपी और पेस्ट प्रोग्रामिंग, जो अकादमिक सेटिंग्स में साहित्यिक चोरी के भाग के रूप में किया जा सकता है


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

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

स्वचालित रूप से जेनरेट किया गया कोड, जहां गति बढ़ाने या विकास में आसानी के लिए डुप्लिकेट कोड रखना डुप्लिकेट का एक और कारण हो सकता है। ध्यान दें कि वास्तविक जनरेटर के स्रोत कोड में डुप्लिकेट नहीं होंगे, केवल उसके द्वारा उत्पादित आउटपुट होगा।

फिक्सिंग
डुप्लिकेट कोड को सामान्यतः कोड को अपनी इकाई (फ़ंक्शन (कंप्यूटर प्रोग्रामिंग) या मॉड्यूल) में ले जाकर और उस यूनिट को उन सभी जगहों से कॉल करके तय किया जाता है जहां मूल रूप से इसका उपयोग किया गया था। विकास की अधिक ओपन-सोर्स शैली का उपयोग करना, जिसमें घटक केंद्रीकृत स्थानों में हैं, दोहराव में भी सहायता कर सकता है।

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

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

स्रोत कोड में कार्यक्षमता की केवल प्रति होने पर ये विचार स्वचालित रूप से जेनरेट किए गए कोड के लिए प्रासंगिक नहीं हैं।

अतीत में, जब मेमोरी स्थान अधिक सीमित था, डुप्लिकेट कोड में अधिक स्थान लेने का अतिरिक्त हानि थी, किंतु आजकल यह कोई समस्या होने की संभावना नहीं है।

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

डुप्लिकेट कोड का पता लगाना
डुप्लिकेट कोड का पता लगाने के लिए कई अलग-अलग एल्गोरिदम प्रस्तावित किए गए हैं। उदाहरण के लिए:
 * ब्रेंडा बेकर का एल्गोरिदम।
 * राबिन-कार्प स्ट्रिंग सर्च एल्गोरिदम।
 * सार सिंटेक्स ट्री का उपयोग करना.[8]
 * विजुअल क्लोन डिटेक्शन।
 * काउंट आव्यूह क्लोन डिटेक्शन।
 * स्थानीयता-संवेदनशील हैशिंग
 * एंटी-यूनिफिकेशन (कंप्यूटर साइंस)

कार्यात्मक रूप से डुप्लिकेट कोड का उदाहरण
पूर्णांक की सरणी डेटा संरचना के औसत की गणना के लिए निम्नलिखित स्निपेट (प्रोग्रामिंग) पर विचार करें

दो छोरों को एकल कार्य के रूप में फिर से लिखा जा सकता है:

या, सामान्यतः सरणी में तत्वों की संख्या को पैरामीटराइज़ करके अधिमानतः।

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



यह भी देखें

 * अमूर्त सिद्धांत (प्रोग्रामिंग)
 * विरोधी पैटर्न
 * डेटा डुप्लिकेशन
 * खुद को न दोहराएं (ड्राई)
 * स्थिर कोड विश्लेषण के लिए उपकरणों की सूची
 * अनावश्यक कोड
 * तीन का नियम (कंप्यूटर प्रोग्रामिंग)

बाहरी संबंध

 * The University of Alabama at Birmingham: Code Clones Literature
 * Finding duplicate code in C#, VB.Net, ASPX, Ruby, Python, Java, C, C++, ActionScript, or XAML