Articulo de referencia

Código duplicado

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ódig...

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

Ejemplo de corrección de código duplicado mediante código reemplazado por el método

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:

Véase también

Referencias

  1. Spinellis, Diomidis. "Guía para detectar código defectuoso" . InformIT.com . Consultado el 6 de junio de 2008 .
  2. 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 . 
  3. ^ 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 .
  4. Kapser, C.; Godfrey, MW, ""Clonación considerada perjudicial" , 13.ª Conferencia de Trabajo sobre Ingeniería Inversa (WCRE), págs. 19-28, octubre de 2006
  5. 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 . 
  6. 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
  7. Similitudes de código más allá de copiar y pegar por Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
  8. Brenda S. Baker . Un programa para identificar código duplicado. Computing Science and Statistics, 24:49–57, 1992.
  9. Ira D. Baxter, et al. Detección de clones mediante árboles de sintaxis abstracta
  10. Detección visual de código duplicado Archivado el 29/06/2006 en Wayback Machine por Matthias Rieger, Stephane Ducasse.
  11. 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.
  12. 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).
  13. 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.
  • 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.