डुप्लीकेट कोड: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[कंप्यूटर प्रोग्रामिंग]] में डुप्लिकेट कोड स्रोत कोड का अनुक्रम होता है जो से अधिक बार होता है, या तो प्रोग्राम के भीतर या ही इकाई के स्वामित्व वाले या बनाए गए विभिन्न प्रोग्रामों में। डुप्लिकेट कोड को आमतौर पर कई कारणों से [[कोड गंध]] माना जाता है।<ref>{{cite web|url=http://www.informit.com/articles/article.aspx?p=457502&seqNum=5|title=बैड कोड स्पॉटर्स गाइड|publisher=InformIT.com|access-date=2008-06-06|first=Diomidis|last=Spinellis}}</ref> न्यूनतम आवश्यकता आमतौर पर कोड की मात्रा पर लागू होती है जो संयोग से समान होने के बजाय डुप्लिकेट माने जाने के लिए अनुक्रम में दिखाई देनी चाहिए। डुप्लिकेट कोड के अनुक्रम को कभी-कभी कोड क्लोन या सिर्फ क्लोन के रूप में जाना जाता है, स्रोत कोड में दोहराव खोजने की स्वचालित प्रक्रिया को क्लोन डिटेक्शन कहा जाता है।
कंप्यूटर प्रोग्रामिंग में, डुप्लिकेट कोड स्रोत कोड का अनुक्रम है जो एक प्रोग्राम के अंदर या एक ही इकाई के स्वामित्व वाले या बनाए गए विभिन्न प्रोग्रामों में एक से अधिक बार होता है। डुप्लिकेट कोड को सामान्यतः कई कारणों से अवांछनीय माना जाता है।<ref>{{cite web|url=http://www.informit.com/articles/article.aspx?p=457502&seqNum=5|title=बैड कोड स्पॉटर्स गाइड|publisher=InformIT.com|access-date=2008-06-06|first=Diomidis|last=Spinellis}}</ref> एक न्यूनतम आवश्यकता सामान्यतः कोड की मात्रा पर प्रयुक्त होती है जिसे अनुक्रम में प्रकट होना चाहिए जिससे इसे संयोग से समान के अतिरिक्त डुप्लिकेट माना जा सकता है। डुप्लिकेट कोड के अनुक्रमों को कभी-कभी कोड क्लोन या केवल क्लोन के रूप में जाना जाता है, स्रोत कोड में डुप्लिकेट खोजने की स्वचालित प्रक्रिया को क्लोन डिटेक्शन कहा जाता है।


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


== उदय ==
== उदय ==


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


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


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


यह भी हो सकता है कि कार्यक्षमता की आवश्यकता होती है जो प्रोग्राम के दूसरे भाग में बहुत समान होती है, और डेवलपर स्वतंत्र रूप से कोड लिखता है जो कि कहीं और मौजूद है। अध्ययनों से पता चलता है कि इस तरह के स्वतंत्र रूप से पुनर्लेखित कोड आमतौर पर वाक्यगत रूप से समान नहीं होते हैं।<ref>[https://www.cqse.eu/publications/2010-code-similarities-beyond-copy-paste.pdf Code similarities beyond copy & paste] by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.</ref>
यह भी हो सकता है कि कार्यक्षमता की आवश्यकता होती है जो प्रोग्राम के दूसरे भाग में बहुत समान होती है और डेवलपर स्वतंत्र रूप से कोड लिखता है जो कि कहीं और उपस्थित है। अध्ययनों से पता चलता है कि इस तरह के स्वतंत्र रूप से पुनर्लेखित कोड सामान्यतः वाक्यगत रूप से समान नहीं होते हैं।<ref>[https://www.cqse.eu/publications/2010-code-similarities-beyond-copy-paste.pdf Code similarities beyond copy & paste] by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.</ref>
स्वचालित रूप से उत्पन्न कोड, जहां गति बढ़ाने या विकास में आसानी के लिए डुप्लिकेट कोड होने की इच्छा हो सकती है, दोहराव का और कारण है। ध्यान दें कि वास्तविक जनरेटर में इसके स्रोत कोड में डुप्लीकेट नहीं होंगे, केवल आउटपुट उत्पन्न होता है।
 
स्वचालित रूप से जेनरेट किया गया कोड, जहां गति बढ़ाने या विकास में आसानी के लिए डुप्लिकेट कोड रखना डुप्लिकेट का एक और कारण हो सकता है। ध्यान दें कि वास्तविक जनरेटर के स्रोत कोड में डुप्लिकेट नहीं होंगे, केवल उसके द्वारा उत्पादित आउटपुट होगा।


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


== लागत और लाभ ==
== व्यय और लाभ ==


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


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


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


अतीत में, जब स्मृति स्थान अधिक सीमित था, डुप्लिकेट कोड में अधिक स्थान लेने का अतिरिक्त नुकसान था, लेकिन आजकल यह समस्या होने की संभावना नहीं है।
अतीत में, जब मेमोरी स्थान अधिक सीमित था, डुप्लिकेट कोड में अधिक स्थान लेने का अतिरिक्त हानि थी, किंतु आजकल यह कोई समस्या होने की संभावना नहीं है।
 
जब [[भेद्यता (कंप्यूटिंग)]] वाले कोड की नकल की जाती है, तो प्रतिलिपि किए गए कोड में भेद्यता बनी रह सकती है यदि डेवलपर को ऐसी प्रतियों के बारे में पता नहीं है।<ref>{{cite journal|last1=Li|first1=Hongzhe|last2=Kwon|first2=Hyuckmin|last3=Kwon|first3=Jonghoon|last4=Lee|first4=Heejo|title=CLORIFI: software vulnerability discovery using code clone verification|journal=Concurrency and Computation: Practice and Experience|date=25 April 2016|volume=28|issue=6|pages=1900–1917|doi=10.1002/cpe.3532|s2cid=17363758}}</ref> [[कोड रीफैक्टरिंग]] डुप्लिकेट कोड कई सॉफ़्टवेयर मेट्रिक्स में सुधार कर सकता है, जैसे कि [[कोड की पंक्तियाँ]], चक्रीय जटिलता और [[युग्मन (कंप्यूटर प्रोग्रामिंग)]]। इससे कम संकलन समय, कम संज्ञानात्मक भार, कम मानवीय त्रुटि और कोड के कम भूले हुए या अनदेखे टुकड़े हो सकते हैं। हालाँकि, सभी कोड दोहराव को दोबारा नहीं किया जा सकता है।<ref>{{cite journal|last1=Arcelli Fontana|first1=Francesca|last2=Zanoni|first2=Marco|last3=Ranchetti|first3=Andrea|last4=Ranchetti|first4=Davide|title=सॉफ्टवेयर क्लोन डिटेक्शन और रीफैक्टरिंग|journal=ISRN Software Engineering|date=2013|volume=2013|pages=1–8|doi=10.1155/2013/129437|url=https://boa.unimib.it/bitstream/10281/42633/1/clone.pdf|doi-access=free}}</ref> क्लोन सबसे प्रभावी समाधान हो सकता है यदि प्रोग्रामिंग भाषा अपर्याप्त या अत्यधिक जटिल सार प्रदान करती है, विशेष रूप से यदि यूजर इंटरफेस तकनीकों जैसे [[एक साथ संपादन|साथ संपादन]] के साथ समर्थित हो। इसके अलावा, रिफैक्टरिंग करते समय कोड को तोड़ने का जोखिम किसी भी रखरखाव लाभ से अधिक हो सकता है।
<ref>Kapser, C.; Godfrey, M.W., [http://plg2.cs.uwaterloo.ca/~migod/papers/2006/wcre06-clonePatterns.pdf ""Cloning Considered Harmful" Considered Harmful]," 13th Working Conference on Reverse Engineering (WCRE), pp. 19-28, Oct. 2006</ref> वैगनर, अब्दुलखलेक और काया द्वारा किए गए अध्ययन ने निष्कर्ष निकाला कि जबकि डुप्लिकेट को सिंक में रखने के लिए अतिरिक्त काम किया जाना चाहिए, अगर इसमें शामिल प्रोग्रामर डुप्लिकेट कोड के बारे में जानते हैं, तो अनडुप्लिकेट कोड की तुलना में काफी अधिक दोष नहीं थे।
<ref>{{Cite journal|last1=Wagner|first1=Stefan|last2=Abdulkhaleq|first2=Asim|last3=Kaya|first3=Kamer|last4=Paar|first4=Alexander|date=2016|title=On the relationship of inconsistent software clones and faults: an empirical study|url=http://elib.uni-stuttgart.de/opus/volltexte/2016/10526/|journal=Proc. 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER 2016)|pages=79–89|doi=10.1109/SANER.2016.94|arxiv=1611.08005|isbn=978-1-5090-1855-0|s2cid=3154845}}</ref>{{disputed-inline|date=June 2019|1=Concern by 173.177.203.139}}


जब सॉफ़्टवेयर भेद्यता वाले कोड की प्रतिलिपि बनाई जाती है, तो डेवलपर को ऐसी प्रतियों के बारे में जानकारी न होने पर कॉपी किए गए कोड में भेद्यता उपस्थित रह सकती है।<ref>{{cite journal|last1=Li|first1=Hongzhe|last2=Kwon|first2=Hyuckmin|last3=Kwon|first3=Jonghoon|last4=Lee|first4=Heejo|title=CLORIFI: software vulnerability discovery using code clone verification|journal=Concurrency and Computation: Practice and Experience|date=25 April 2016|volume=28|issue=6|pages=1900–1917|doi=10.1002/cpe.3532|s2cid=17363758}}</ref> डुप्लिकेट कोड को रीफैक्टर करने से कई सॉफ्टवेयर आव्यूह में सुधार हो सकता है जैसे कि [[कोड की पंक्तियाँ]], साइक्लोमैटिक जटिलता और [[युग्मन (कंप्यूटर प्रोग्रामिंग)]] इससे संकलन समय कम हो सकता है, संज्ञानात्मक भार कम हो सकता है, मानवीय त्रुटि कम हो सकती है, और कोड के कम भूले हुए या अनदेखा टुकड़े हो सकते हैं। चूँकि सभी कोड दोहराव को दोबारा नहीं किया जा सकता है।<ref name=":0">{{cite journal|last1=Arcelli Fontana|first1=Francesca|last2=Zanoni|first2=Marco|last3=Ranchetti|first3=Andrea|last4=Ranchetti|first4=Davide|title=सॉफ्टवेयर क्लोन डिटेक्शन और रीफैक्टरिंग|journal=ISRN Software Engineering|date=2013|volume=2013|pages=1–8|doi=10.1155/2013/129437|url=https://boa.unimib.it/bitstream/10281/42633/1/clone.pdf|doi-access=free}}</ref> क्लोन सबसे प्रभावी समाधान हो सकता है यदि प्रोग्रामिंग भाषा अपर्याप्त या अत्यधिक जटिल सार प्रदान करती है, विशेष रूप से यदि यूजर इंटरफेस तकनीकों जैसे [[एक साथ संपादन|साथ संपादन]] के साथ समर्थित हो। इसके अतिरिक्त, रिफैक्टरिंग करते समय कोड को तोड़ने का ख़तरा किसी भी रखरखाव लाभ से अधिक हो सकता है। <ref>Kapser, C.; Godfrey, M.W., [http://plg2.cs.uwaterloo.ca/~migod/papers/2006/wcre06-clonePatterns.pdf ""Cloning Considered Harmful" Considered Harmful]," 13th Working Conference on Reverse Engineering (WCRE), pp. 19-28, Oct. 2006</ref> वैगनर, अब्दुलखलेक और काया द्वारा किए गए अध्ययन ने निष्कर्ष निकाला कि जबकि डुप्लिकेट को सिंक में रखने के लिए अतिरिक्त काम किया जाना चाहिए, यदि इसमें सम्मिलित प्रोग्रामर डुप्लिकेट कोड के बारे में जानते हैं, तो अनडुप्लिकेट कोड की तुलना में बहुत अधिक दोष नहीं थे।<ref>{{Cite journal|last1=Wagner|first1=Stefan|last2=Abdulkhaleq|first2=Asim|last3=Kaya|first3=Kamer|last4=Paar|first4=Alexander|date=2016|title=On the relationship of inconsistent software clones and faults: an empirical study|url=http://elib.uni-stuttgart.de/opus/volltexte/2016/10526/|journal=Proc. 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER 2016)|pages=79–89|doi=10.1109/SANER.2016.94|arxiv=1611.08005|isbn=978-1-5090-1855-0|s2cid=3154845}}</ref>
== डुप्लिकेट कोड का पता लगाना ==
== डुप्लिकेट कोड का पता लगाना ==


Line 42: Line 40:
24:49–57, 1992.</ref>
24:49–57, 1992.</ref>
* राबिन-कार्प स्ट्रिंग सर्च एल्गोरिदम।
* राबिन-कार्प स्ट्रिंग सर्च एल्गोरिदम।
* [[सार वाक्य रचना का पेड़]] का उपयोग करना।<ref>Ira D. Baxter, et al. [http://www.semanticdesigns.com/Company/Publications/ICSM98.pdf Clone Detection Using Abstract Syntax Trees]</ref>
* सार सिंटेक्स ट्री का उपयोग करना.[8]<ref>Ira D. Baxter, et al. [http://www.semanticdesigns.com/Company/Publications/ICSM98.pdf Clone Detection Using Abstract Syntax Trees]</ref>
* विजुअल क्लोन डिटेक्शन।<ref>[http://www.iam.unibe.ch/~scg/Archive/Papers/Rieg98aEcoopWorkshop.pdf Visual Detection of Duplicated Code] {{Webarchive|url=https://web.archive.org/web/20060629083352/http://www.iam.unibe.ch/~scg/Archive/Papers/Rieg98aEcoopWorkshop.pdf |date=2006-06-29 }} by Matthias Rieger, Stephane Ducasse.</ref>
* विजुअल क्लोन डिटेक्शन।<ref>[http://www.iam.unibe.ch/~scg/Archive/Papers/Rieg98aEcoopWorkshop.pdf Visual Detection of Duplicated Code] {{Webarchive|url=https://web.archive.org/web/20060629083352/http://www.iam.unibe.ch/~scg/Archive/Papers/Rieg98aEcoopWorkshop.pdf |date=2006-06-29 }} by Matthias Rieger, Stephane Ducasse.</ref>
* काउंट मैट्रिक्स क्लोन डिटेक्शन।<ref>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.</ref><ref>Chen, X., Wang, A. Y., & Tempero, E. D. (2014). [http://www.qualitascorpus.com/pubs/ChenWangTemperoClones.pdf A Replication and Reproduction of Code Clone Detection Studies]. In ACSC (pp. 105-114).</ref>
* काउंट आव्यूह क्लोन डिटेक्शन।<ref>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.</ref><ref>Chen, X., Wang, A. Y., & Tempero, E. D. (2014). [http://www.qualitascorpus.com/pubs/ChenWangTemperoClones.pdf A Replication and Reproduction of Code Clone Detection Studies]. In ACSC (pp. 105-114).</ref>
* [[स्थानीयता-संवेदनशील हैशिंग]]
* [[स्थानीयता-संवेदनशील हैशिंग]]
* एंटी-यूनिफिकेशन (कंप्यूटर साइंस) | एंटी-यूनिफिकेशन<ref>Bulychev, Peter, and Marius Minea. "[https://cyberleninka.ru/article/n/duplicate-code-detection-using-anti-unification Duplicate code detection using anti-unification]." Proceedings of the Spring/Summer Young Researchers’ Colloquium on Software Engineering. No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской академии наук, 2008.</ref>
* एंटी-यूनिफिकेशन (कंप्यूटर साइंस) <ref>Bulychev, Peter, and Marius Minea. "[https://cyberleninka.ru/article/n/duplicate-code-detection-using-anti-unification Duplicate code detection using anti-unification]." Proceedings of the Spring/Summer Young Researchers’ Colloquium on Software Engineering. No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской академии наук, 2008.</ref>
 
 
== कार्यात्मक रूप से डुप्लिकेट कोड == का उदाहरण


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


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 81: Line 77:
}
}
</syntaxhighlight>
</syntaxhighlight>
या, आमतौर पर अधिमानतः, सरणी में तत्वों की संख्या को पैरामीटर करके।
 
 
या, सामान्यतः सरणी में तत्वों की संख्या को पैरामीटराइज़ करके अधिमानतः।


उपरोक्त फ़ंक्शन का उपयोग करने से स्रोत कोड मिलेगा जिसमें कोई लूप दोहराव नहीं है:
उपरोक्त फ़ंक्शन का उपयोग करने से स्रोत कोड मिलेगा जिसमें कोई लूप दोहराव नहीं है:
Line 92: Line 90:


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


[[File:Duplicate code.gif|thumbnail|विधि द्वारा प्रतिस्थापित कोड के माध्यम से डुप्लिकेट कोड फिक्स का उदाहरण]]
[[File:Duplicate code.gif|thumbnail|विधि द्वारा प्रतिस्थापित कोड के माध्यम से डुप्लिकेट कोड फिक्स का उदाहरण]]
Line 100: Line 98:
*[[विरोधी पैटर्न]]
*[[विरोधी पैटर्न]]
* [[डेटा डुप्लिकेशन]]
* [[डेटा डुप्लिकेशन]]
*खुद को न दोहराएं (DRY)
*खुद को न दोहराएं (ड्राई)
* स्थिर कोड विश्लेषण के लिए उपकरणों की सूची
* स्थिर कोड विश्लेषण के लिए उपकरणों की सूची
* [[अनावश्यक कोड]]
* [[अनावश्यक कोड]]
Line 112: Line 110:
* [https://archive.today/20121211121637/http://students.cis.uab.edu/tairasr/clones/literature/ The University of Alabama at Birmingham: Code Clones Literature]
* [https://archive.today/20121211121637/http://students.cis.uab.edu/tairasr/clones/literature/ The University of Alabama at Birmingham: Code Clones Literature]
* [http://alexdresko.com/2010/09/09/finding-duplicate-code-in-c-vb-net-aspx-ruby-python-java-c-c-actionscript-or-xaml Finding duplicate code in C#, VB.Net, ASPX, Ruby, Python, Java, C, C++, ActionScript, or XAML]
* [http://alexdresko.com/2010/09/09/finding-duplicate-code-in-c-vb-net-aspx-ruby-python-java-c-c-actionscript-or-xaml Finding duplicate code in C#, VB.Net, ASPX, Ruby, Python, Java, C, C++, ActionScript, or XAML]
[[Category: उदाहरण सी कोड वाले लेख]] [[Category: सॉफ्टवेयर मेट्रिक्स]] [[Category: सोर्स कोड]]


[[Category: Machine Translated Page]]
[[Category:Created On 16/06/2023]]
[[Category:Created On 16/06/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:Webarchive template wayback links]]
[[Category:उदाहरण सी कोड वाले लेख]]
[[Category:सॉफ्टवेयर मेट्रिक्स]]
[[Category:सोर्स कोड]]

Latest revision as of 19:13, 3 July 2023

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

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

उदय

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

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

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

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

फिक्सिंग

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

व्यय और लाभ

कोड जिसमें डुप्लिकेट कार्यक्षमता सम्मिलित है, समर्थन करना अधिक कठिन है क्योंकि,

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

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

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

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

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

डुप्लिकेट कोड का पता लगाना

डुप्लिकेट कोड का पता लगाने के लिए कई अलग-अलग एल्गोरिदम प्रस्तावित किए गए हैं। उदाहरण के लिए:

कार्यात्मक रूप से डुप्लिकेट कोड का उदाहरण

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

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);

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

विधि द्वारा प्रतिस्थापित कोड के माध्यम से डुप्लिकेट कोड फिक्स का उदाहरण

यह भी देखें

संदर्भ

  1. Spinellis, Diomidis. "बैड कोड स्पॉटर्स गाइड". InformIT.com. Retrieved 2008-06-06.
  2. Code similarities beyond copy & paste by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
  3. 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.
  4. Arcelli Fontana, Francesca; Zanoni, Marco; Ranchetti, Andrea; Ranchetti, Davide (2013). "सॉफ्टवेयर क्लोन डिटेक्शन और रीफैक्टरिंग" (PDF). ISRN Software Engineering. 2013: 1–8. doi:10.1155/2013/129437.
  5. Kapser, C.; Godfrey, M.W., ""Cloning Considered Harmful" Considered Harmful," 13th Working Conference on Reverse Engineering (WCRE), pp. 19-28, Oct. 2006
  6. 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.
  7. Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics, 24:49–57, 1992.
  8. Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees
  9. Visual Detection of Duplicated Code Archived 2006-06-29 at the Wayback Machine by Matthias Rieger, Stephane Ducasse.
  10. 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.
  11. Chen, X., Wang, A. Y., & Tempero, E. D. (2014). A Replication and Reproduction of Code Clone Detection Studies. In ACSC (pp. 105-114).
  12. 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.


बाहरी संबंध