En programación informática , el código duplicado se define como la presencia de múltiples ocurrencias de código fuente equivalente en una base de código . Un fragmento de código duplicado también se conoce como clon de código , y el proceso de encontrar clones en el código fuente se denomina detección de clones . El código duplicado presenta múltiples aspectos indeseables . [ 1 ]
La clasificación de fragmentos como duplicados puede ser subjetiva. Los fragmentos muy pequeños , como una sola instrucción , probablemente no se clasifiquen como duplicados. Además, los fragmentos que no son exactamente el mismo texto podrían considerarse código duplicado si coinciden salvo en aspectos menos importantes como espacios en blanco , comentarios y nombres de variables . Incluso los fragmentos que solo son funcionalmente equivalentes pueden clasificarse como duplicados.
Costo
El código que incluye funcionalidades duplicadas es más difícil de mantener porque, si necesita actualizarse, existe el riesgo de que solo se actualicen algunas de las copias, dejando las demás sin cambios. Cuando se duplica código con una vulnerabilidad , esta persiste en la copia incluso después de que se haya corregido en una de ellas. [ 2 ] La refactorización para eliminar el código duplicado puede mejorar muchas métricas de software, como las líneas de código , la complejidad ciclomática y el acoplamiento . Esto puede conducir a un menor tiempo de compilación, una menor carga cognitiva , menos errores humanos y menos fragmentos de código olvidados o pasados por alto.
Sin embargo, no toda la duplicación de código se puede refactorizar. [ 3 ] Los clones pueden ser la solución más eficaz si el lenguaje de programación proporciona abstracciones inadecuadas o demasiado complejas, especialmente si se apoya en técnicas de interfaz de usuario como la edición simultánea . Además, el riesgo de romper el código al refactorizar puede superar el beneficio de mantenimiento. [ 4 ] Un estudio de Wagner, Abdulkhaleq y Kaya concluyó que, si bien se debe realizar trabajo adicional para mantener sincronizados los duplicados, si los programadores involucrados son conscientes del código duplicado, no se produjeron significativamente más fallos que en el código no duplicado. [ 5 ]
Otro coste es el tamaño de la memoria, ya que el código duplicado requiere memoria para almacenar cada copia.
Aparición
Algunas prácticas que conducen a la duplicación de código incluyen:
- Gorronería
- Mediante la programación de copiar y pegar , una sección de código se duplica en el código fuente en lugar de refactorizarla en una función reutilizable .
- fragmentos de código
- Algunas herramientas de desarrollo como LLM [ 6 ] automatizan el proceso de inserción de fragmentos de código : código que es idéntico o que tiene una funcionalidad equivalente.
- Coincidencia
- Se puede desarrollar código similar de forma independiente, aunque los estudios sugieren que dicho código normalmente no es sintácticamente similar. [ 7 ]
- Generado
- El código generado automáticamente puede estar duplicado, pero esto puede hacerse para mejorar el rendimiento en tiempo de ejecución o para facilitar el desarrollo.
Fijación

La forma más común de eliminar el código duplicado es trasladarlo a una función y reemplazar cada código duplicado con una llamada a esa función.
Por ejemplo, el siguiente código calcula el promedio de una matriz de enteros .
extern int array_a [ 4 ]; extern int array_b [ 4 ]; int sum_a = 0 ;for ( int i = 0 ; i < 4 ; i ++ ) { sum_a += array_a [ i ]; }int promedio_a = suma_a / 4 ; int suma_b = 0 ;for ( int i = 0 ; i < 4 ; i ++ ) { sum_b += array_b [ i ]; }entero promedio_b = suma_b / 4 ;Los dos bucles se pueden reescribir como la función:
int calc_average_of_four ( int a []) { int sum = 0 ; for ( int i = 0 ; i < 4 ; i ++ ) { sum += a [ i ]; }devolver suma / 4 ; }El uso de esta función elimina el código duplicado.
extern int array1 [ 4 ]; extern int array2 [ 4 ];int promedio1 = calc_promedio_de_cuatro ( array1 ); int promedio2 = calc_promedio_de_cuatro ( array2 );El compilador podría insertar las llamadas en línea de forma que el código máquina resultante sea idéntico para ambas versiones. Si la función no se inserta en línea, la sobrecarga adicional de las llamadas a la función hará que la ejecución tarde un poco más.
Detector
Se han propuesto varios algoritmos para detectar código duplicado. Por ejemplo:
- Algoritmo de Baker . [ 8 ]
- Algoritmo de búsqueda de cadenas de Rabin-Karp .
- Utilizando árboles de sintaxis abstracta . [ 9 ]
- Detección visual de clones. [ 10 ]
- Detección de clones de matriz de recuento. [ 11 ] [ 12 ]
- Hashing sensible a la localidad
- Antiunificación [ 13 ]
Véase también
- Principio de abstracción (programación)
- Antipatrón : solución a un problema que puede ser de uso común, pero que generalmente es una mala elección.
- Desduplicación de datos : técnica de procesamiento de datos para eliminar copias duplicadas de datos repetidos.
- No te repitas : principio del desarrollo de software
- Lista de herramientas para el análisis estático de código
- Código redundante
- Regla de tres (programación informática) – Regla general de refactorización
- Fragmento (programación) : pequeña cantidad de código fuente utilizada para la productividad.
Referencias
- ↑ Spinellis, Diomidis. "Guía para detectar código defectuoso" . InformIT.com . Consultado el 6 de junio de 2008 .
- ↑ Li, Hongzhe; Kwon, Hyuckmin; Kwon, Jonghoon; Lee, Heejo (25 de abril de 2016). "CLORIFI: descubrimiento de vulnerabilidades de software mediante verificación de clonación de código". 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). "Detección y refactorización de clones de software" (PDF) . Ingeniería de Software ISRN . 2013 : 1– 8.doi : 10.1155 / 2013/129437 .
- ↑ Kapser, C.; Godfrey, MW, ""Clonación considerada perjudicial" , 13.ª Conferencia de Trabajo sobre Ingeniería Inversa (WCRE), págs. 19-28, octubre de 2006
- ↑ Wagner, Stefan; Abdulkhaleq, Asim; Kaya, Kamer; Paar, Alexander (2016). "Sobre la relación entre clones de software inconsistentes y fallos: un estudio empírico" . 2016 IEEE 23rd International Conference on Software Analysis, Evolution, and Reengineering (SANER) . pp. 79–89 . arXiv : 1611.08005 . doi : 10.1109/SANER.2016.94 . ISBN 978-1-5090-1855-0. S2CID 3154845 .
- ↑ https://arxiv.org/html/2504.12608v1 El enigma de la copia de código: desmitificando la repetición en la generación de código basada en LLM
- ↑ Similitudes de código más allá de copiar y pegar por Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
- ↑ Brenda S. Baker . Un programa para identificar código duplicado. Computing Science and Statistics, 24:49–57, 1992.
- ↑ Ira D. Baxter, et al. Detección de clones mediante árboles de sintaxis abstracta
- ↑ Detección visual de código duplicado Archivado el 29/06/2006 en Wayback Machine por Matthias Rieger, Stephane Ducasse.
- ↑ Yuan, Y. y Guo, Y. CMCD: Detección de clones de código basada en matriz de conteo, en 2011 18th Asia-Pacific Software Engineering Conference. IEEE, diciembre de 2011, págs. 250–257.
- ↑ Chen, X., Wang, AY y Tempero, ED (2014). Replicación y reproducción de estudios de detección de clones de código . En ACSC (págs. 105-114).
- ↑ Bulychev, Peter y Marius Minea. " Detección de código duplicado mediante anti-unificación ". Actas del Coloquio de Primavera/Verano para Jóvenes Investigadores en Ingeniería de Software. No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской академии наук, 2008.
Enlaces externos
- La Universidad de Alabama en Birmingham: Literatura sobre clones de código
- Cómo encontrar código duplicado en C#, VB.Net, ASPX, Ruby, Python, Java, C, C++, ActionScript o XAML.
- Métricas de software
- Código fuente