डुप्लीकेट कोड
कंप्यूटर प्रोग्रामिंग में डुप्लिकेट कोड स्रोत कोड का अनुक्रम होता है जो से अधिक बार होता है, या तो प्रोग्राम के भीतर या ही इकाई के स्वामित्व वाले या बनाए गए विभिन्न प्रोग्रामों में। डुप्लिकेट कोड को आमतौर पर कई कारणों से कोड गंध माना जाता है।[1] न्यूनतम आवश्यकता आमतौर पर कोड की मात्रा पर लागू होती है जो संयोग से समान होने के बजाय डुप्लिकेट माने जाने के लिए अनुक्रम में दिखाई देनी चाहिए। डुप्लिकेट कोड के अनुक्रम को कभी-कभी कोड क्लोन या सिर्फ क्लोन के रूप में जाना जाता है, स्रोत कोड में दोहराव खोजने की स्वचालित प्रक्रिया को क्लोन डिटेक्शन कहा जाता है।
चरित्र-दर-चरित्र समान होने के बिना दो कोड अनुक्रम दूसरे के डुप्लिकेट हो सकते हैं, उदाहरण के लिए वर्ण-दर-चरित्र समान होने पर केवल सफेद स्थान वर्णों और टिप्पणियों को अनदेखा किया जाता है, या टोकन (पार्सर) | टोकन-के लिए- टोकन समान, या टोकन-टू-टोकन समान सामयिक भिन्नता के साथ। यहां तक कि केवल कार्यात्मक रूप से समान कोड अनुक्रमों को डुप्लिकेट कोड माना जा सकता है।
उदय
डुप्लीकेट कोड बनाने के कुछ तरीके इस प्रकार हैं:
- कॉपी और पेस्ट प्रोग्रामिंग, जो अकादमिक सेटिंग्स में साहित्यिक चोरी के हिस्से के रूप में किया जा सकता है
- छानबीन करना, जिसमें कोड के भाग को इसलिए कॉपी किया जाता है क्योंकि वह काम करता है। ज्यादातर मामलों में इस ऑपरेशन में क्लोन कोड में मामूली संशोधन शामिल होते हैं, जैसे चर का नाम बदलना या कोड डालना/हटाना। भाषा लगभग हमेशा किसी को कोड की प्रति को विभिन्न स्थानों से कॉल करने की अनुमति देती है, ताकि यह कई उद्देश्यों को पूरा कर सके, लेकिन इसके बजाय प्रोग्रामर और प्रतिलिपि बनाता है, शायद इसलिए कि वे
- भाषा ठीक से समझ नहीं आ रही है
- ठीक से करने का समय नहीं है, या
- बढ़े हुए सॉफ्टवेयर सड़ांध की परवाह न करें।
यह भी हो सकता है कि कार्यक्षमता की आवश्यकता होती है जो प्रोग्राम के दूसरे भाग में बहुत समान होती है, और डेवलपर स्वतंत्र रूप से कोड लिखता है जो कि कहीं और मौजूद है। अध्ययनों से पता चलता है कि इस तरह के स्वतंत्र रूप से पुनर्लेखित कोड आमतौर पर वाक्यगत रूप से समान नहीं होते हैं।[2] स्वचालित रूप से उत्पन्न कोड, जहां गति बढ़ाने या विकास में आसानी के लिए डुप्लिकेट कोड होने की इच्छा हो सकती है, दोहराव का और कारण है। ध्यान दें कि वास्तविक जनरेटर में इसके स्रोत कोड में डुप्लीकेट नहीं होंगे, केवल आउटपुट उत्पन्न होता है।
फिक्सिंग
डुप्लिकेट कोड को आमतौर पर कोड को अपनी इकाई (फ़ंक्शन (कंप्यूटर प्रोग्रामिंग) या मॉड्यूल) में ले जाकर और उस यूनिट को उन सभी जगहों से कॉल करके तय किया जाता है जहां मूल रूप से इसका उपयोग किया गया था। विकास की अधिक ओपन-सोर्स शैली का उपयोग करना, जिसमें घटक केंद्रीकृत स्थानों में हैं, दोहराव में भी मदद कर सकता है।
लागत और लाभ
कोड जिसमें डुप्लिकेट कार्यक्षमता शामिल है, समर्थन करना अधिक कठिन है क्योंकि,
- यह केवल लंबा है, और
- यदि इसे अद्यतन करने की आवश्यकता है, तो खतरा है कि कोड की प्रति उसी कोड के अन्य उदाहरणों की उपस्थिति की जांच किए बिना अद्यतन की जाएगी।
दूसरी ओर, यदि कोड की प्रति का उपयोग विभिन्न उद्देश्यों के लिए किया जा रहा है, और इसे ठीक से प्रलेखित नहीं किया गया है, तो खतरा है कि इसे उद्देश्य के लिए अपडेट किया जाएगा, लेकिन यह अपडेट इसके अन्य उद्देश्यों के लिए आवश्यक या उपयुक्त नहीं होगा। उद्देश्यों।
स्रोत कोड में कार्यक्षमता की केवल प्रति होने पर ये विचार स्वचालित रूप से जेनरेट किए गए कोड के लिए प्रासंगिक नहीं हैं।
अतीत में, जब स्मृति स्थान अधिक सीमित था, डुप्लिकेट कोड में अधिक स्थान लेने का अतिरिक्त नुकसान था, लेकिन आजकल यह समस्या होने की संभावना नहीं है।
जब भेद्यता (कंप्यूटिंग) वाले कोड की नकल की जाती है, तो प्रतिलिपि किए गए कोड में भेद्यता बनी रह सकती है यदि डेवलपर को ऐसी प्रतियों के बारे में पता नहीं है।[3] कोड रीफैक्टरिंग डुप्लिकेट कोड कई सॉफ़्टवेयर मेट्रिक्स में सुधार कर सकता है, जैसे कि कोड की पंक्तियाँ, चक्रीय जटिलता और युग्मन (कंप्यूटर प्रोग्रामिंग)। इससे कम संकलन समय, कम संज्ञानात्मक भार, कम मानवीय त्रुटि और कोड के कम भूले हुए या अनदेखे टुकड़े हो सकते हैं। हालाँकि, सभी कोड दोहराव को दोबारा नहीं किया जा सकता है।[4] क्लोन सबसे प्रभावी समाधान हो सकता है यदि प्रोग्रामिंग भाषा अपर्याप्त या अत्यधिक जटिल सार प्रदान करती है, विशेष रूप से यदि यूजर इंटरफेस तकनीकों जैसे साथ संपादन के साथ समर्थित हो। इसके अलावा, रिफैक्टरिंग करते समय कोड को तोड़ने का जोखिम किसी भी रखरखाव लाभ से अधिक हो सकता है। [5] वैगनर, अब्दुलखलेक और काया द्वारा किए गए अध्ययन ने निष्कर्ष निकाला कि जबकि डुप्लिकेट को सिंक में रखने के लिए अतिरिक्त काम किया जाना चाहिए, अगर इसमें शामिल प्रोग्रामर डुप्लिकेट कोड के बारे में जानते हैं, तो अनडुप्लिकेट कोड की तुलना में काफी अधिक दोष नहीं थे। [6]Template:Disputed-inline
डुप्लिकेट कोड का पता लगाना
डुप्लिकेट कोड का पता लगाने के लिए कई अलग-अलग एल्गोरिदम प्रस्तावित किए गए हैं। उदाहरण के लिए:
- ब्रेंडा बेकर का एल्गोरिदम।[7]
- राबिन-कार्प स्ट्रिंग सर्च एल्गोरिदम।
- सार वाक्य रचना का पेड़ का उपयोग करना।[8]
- विजुअल क्लोन डिटेक्शन।[9]
- काउंट मैट्रिक्स क्लोन डिटेक्शन।[10][11]
- स्थानीयता-संवेदनशील हैशिंग
- एंटी-यूनिफिकेशन (कंप्यूटर साइंस) | एंटी-यूनिफिकेशन[12]
== कार्यात्मक रूप से डुप्लिकेट कोड == का उदाहरण
पूर्णांकों की सरणी डेटा संरचना के औसत की गणना के लिए निम्नलिखित स्निपेट (प्रोग्रामिंग) पर विचार करें
extern int array_a[];
extern int array_b[];
int sum_a = 0;
for (int i = 0; i < 4; i++)
sum_a += array_a[i];
int average_a = sum_a / 4;
int sum_b = 0;
for (int i = 0; i < 4; i++)
sum_b += array_b[i];
int average_b = sum_b / 4;
दो छोरों को एकल कार्य के रूप में फिर से लिखा जा सकता है:
int calc_average_of_four(int* array) {
int sum = 0;
for (int i = 0; i < 4; i++)
sum += array[i];
return sum / 4;
}
या, आमतौर पर अधिमानतः, सरणी में तत्वों की संख्या को पैरामीटर करके।
उपरोक्त फ़ंक्शन का उपयोग करने से स्रोत कोड मिलेगा जिसमें कोई लूप दोहराव नहीं है:
extern int array1[];
extern int array2[];
int average1 = calc_average_of_four(array1);
int average2 = calc_average_of_four(array2);
ध्यान दें कि इस तुच्छ मामले में, कंपाइलर फ़ंक्शन में दोनों कॉलों को इनलाइन विस्तार के लिए चुन सकता है, जैसे कि परिणामी मशीन कोड उपरोक्त डुप्लिकेट और गैर-डुप्लिकेट दोनों उदाहरणों के लिए समान है। यदि फ़ंक्शन इनलाइन नहीं है, तो Subroutine#Disadvantages को चलने में अधिक समय लगेगा (अधिकांश उच्च-प्रदर्शन भाषाओं के लिए 10 प्रोसेसर निर्देशों के क्रम में)। सैद्धांतिक रूप से, चलाने के लिए यह अतिरिक्त समय मायने रख सकता है।
यह भी देखें
- अमूर्त सिद्धांत (प्रोग्रामिंग)
- विरोधी पैटर्न
- डेटा डुप्लिकेशन
- खुद को न दोहराएं (DRY)
- स्थिर कोड विश्लेषण के लिए उपकरणों की सूची
- अनावश्यक कोड
- तीन का नियम (कंप्यूटर प्रोग्रामिंग)
संदर्भ
- ↑ Spinellis, Diomidis. "बैड कोड स्पॉटर्स गाइड". InformIT.com. Retrieved 2008-06-06.
- ↑ Code similarities beyond copy & paste by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
- ↑ Li, Hongzhe; Kwon, Hyuckmin; Kwon, Jonghoon; Lee, Heejo (25 April 2016). "CLORIFI: software vulnerability discovery using code clone verification". Concurrency and Computation: Practice and Experience. 28 (6): 1900–1917. doi:10.1002/cpe.3532. S2CID 17363758.
- ↑ Arcelli Fontana, Francesca; Zanoni, Marco; Ranchetti, Andrea; Ranchetti, Davide (2013). "सॉफ्टवेयर क्लोन डिटेक्शन और रीफैक्टरिंग" (PDF). ISRN Software Engineering. 2013: 1–8. doi:10.1155/2013/129437.
- ↑ Kapser, C.; Godfrey, M.W., ""Cloning Considered Harmful" Considered Harmful," 13th Working Conference on Reverse Engineering (WCRE), pp. 19-28, Oct. 2006
- ↑ Wagner, Stefan; Abdulkhaleq, Asim; Kaya, Kamer; Paar, Alexander (2016). "On the relationship of inconsistent software clones and faults: an empirical study". Proc. 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER 2016): 79–89. arXiv:1611.08005. doi:10.1109/SANER.2016.94. ISBN 978-1-5090-1855-0. S2CID 3154845.
- ↑ Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics, 24:49–57, 1992.
- ↑ Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees
- ↑ Visual Detection of Duplicated Code Archived 2006-06-29 at the Wayback Machine by Matthias Rieger, Stephane Ducasse.
- ↑ Yuan, Y. and Guo, Y. CMCD: Count Matrix Based Code Clone Detection, in 2011 18th Asia-Pacific Software Engineering Conference. IEEE, Dec. 2011, pp. 250–257.
- ↑ Chen, X., Wang, A. Y., & Tempero, E. D. (2014). A Replication and Reproduction of Code Clone Detection Studies. In ACSC (pp. 105-114).
- ↑ Bulychev, Peter, and Marius Minea. "Duplicate code detection using anti-unification." Proceedings of the Spring/Summer Young Researchers’ Colloquium on Software Engineering. No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской академии наук, 2008.