El código duplicado es un término de programación de computadoras para una secuencia de código fuente que ocurre más de una vez, ya sea dentro de un programa o en diferentes programas propiedad o mantenidos por la misma entidad. El código duplicado generalmente se considera indeseable por varias razones. [1] Por lo general, se aplica un requisito mínimo a la cantidad de código que debe aparecer en una secuencia para que se considere duplicado y no coincidentemente similar. Las secuencias de código duplicado a veces se conocen como clones de código o simplemente clones, el proceso automatizado de encontrar duplicaciones en el código fuente se llama detección de clones.
Dos secuencias de código pueden ser duplicadas entre sí sin ser idénticas carácter por carácter, por ejemplo, siendo carácter por carácter idénticas solo cuando se ignoran los espacios en blanco y los comentarios, o siendo token por token idénticos, o token -por-token idéntico con variación ocasional. Incluso las secuencias de código que solo son funcionalmente idénticas pueden considerarse código duplicado.
Aparición
Algunas de las formas en que se puede crear un código duplicado son:
- copiar y pegar programación , que en entornos académicos se puede hacer como parte del plagio
- scrounging, en el que se copia una sección de código "porque funciona". En la mayoría de los casos, esta operación implica ligeras modificaciones en el código clonado, como cambiar el nombre de las variables o insertar / eliminar código. El lenguaje casi siempre permite llamar a una copia del código desde diferentes lugares, de modo que pueda servir para múltiples propósitos, pero en cambio el programador crea otra copia, tal vez porque
- no entiendo el idioma correctamente
- no tengo tiempo para hacerlo correctamente, o
- no se preocupe por el aumento de la podredumbre activa del software .
También puede suceder que se requiera una funcionalidad muy similar a la de otra parte de un programa, y un desarrollador escriba de forma independiente un código que sea muy similar al que existe en otros lugares. Los estudios sugieren que dicho código reescrito de forma independiente no suele ser sintácticamente similar. [2]
El código generado automáticamente, donde se puede desear tener código duplicado para aumentar la velocidad o la facilidad de desarrollo, es otra razón para la duplicación. Tenga en cuenta que el generador real no contendrá duplicados en su código fuente, solo la salida que produce.
Fijación
El código duplicado se soluciona más comúnmente moviendo el código a su propia unidad (función o módulo) y llamando a esa unidad desde todos los lugares donde se usó originalmente. El uso de un estilo de desarrollo más de código abierto, en el que los componentes se encuentran en ubicaciones centralizadas, también puede ayudar con la duplicación.
Costos y beneficios
El código que incluye funciones duplicadas es más difícil de admitir,
- simplemente porque es más largo, y
- porque si necesita actualizarse, existe el peligro de que se actualice una copia del código sin verificar más la presencia de otras instancias del mismo código.
Por otro lado, si una copia del código se está utilizando para diferentes propósitos y no está debidamente documentada, existe el peligro de que se actualice para un propósito, pero esta actualización no será necesaria ni apropiada para el otro. propósitos.
Estas consideraciones no son relevantes para el código generado automáticamente, si solo hay una copia de la funcionalidad en el código fuente.
En el pasado, cuando el espacio de memoria era más limitado, el código duplicado tenía la desventaja adicional de ocupar más espacio, pero hoy en día es poco probable que esto sea un problema.
Cuando se copia código con una vulnerabilidad de software , la vulnerabilidad puede continuar existiendo en el código copiado si el desarrollador no tiene conocimiento de dichas copias. [3] Refactorizar código duplicado puede mejorar muchas métricas de software, como líneas de código , complejidad ciclomática y acoplamiento . Esto puede conducir a tiempos de compilación más cortos, menor carga cognitiva , menos errores humanos y menos fragmentos de código olvidados o pasados por alto. Sin embargo, no se pueden refactorizar todas las duplicaciones de código. [4] 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 admiten con técnicas de interfaz de usuario como la edición simultánea . Además, los riesgos de romper el código al refactorizar pueden superar cualquier beneficio de mantenimiento. [5] Un estudio de Wagner, Abdulkhaleq y Kaya concluyó que, si bien se debe realizar un trabajo adicional para mantener sincronizados los duplicados, si los programadores involucrados conocen el código duplicado, no se produjeron significativamente más fallas que en el código no duplicado. [6] [ disputado ]
Detectando código duplicado
Se han propuesto varios algoritmos diferentes para detectar código duplicado. Por ejemplo:
- Algoritmo de Baker . [7]
- Algoritmo de búsqueda de cadenas de Rabin-Karp .
- Uso de árboles de sintaxis abstracta . [8]
- Detección visual de clones. [9]
- Detección de clones de matriz de conteo. [10] [11]
- Hash sensible a la localidad
- Anti-unificación [12]
Ejemplo de código funcionalmente duplicado
Considere el siguiente fragmento de código para calcular el promedio de una matriz de números enteros
extern int array_a []; extern int array_b []; int sum_a = 0 ;para ( int i = 0 ; i < 4 ; i ++ ) sum_a + = array_a [ i ];int average_a = sum_a / 4 ; int sum_b = 0 ;para ( int i = 0 ; i < 4 ; i ++ ) sum_b + = array_b [ i ];int average_b = sum_b / 4 ;
Los dos bucles se pueden reescribir como una única función:
int calc_average_of_four ( int * matriz ) { int suma = 0 ; para ( int i = 0 ; i < 4 ; i ++ ) suma + = matriz [ i ]; return sum / 4 ; }
o, normalmente preferiblemente, parametrizando el número de elementos de la matriz.
El uso de la función anterior dará un código fuente que no tiene duplicación de bucle:
extern int array1 []; extern int array2 [];int average1 = calc_average_of_four ( matriz1 ); int promedio2 = calc_average_of_four ( array2 );
Tenga en cuenta que en este caso trivial, el compilador puede optar por incorporar ambas llamadas a la función, de modo que el código de máquina resultante sea idéntico para los ejemplos duplicados y no duplicados anteriores. Si la función no está insertada, la sobrecarga adicional de las llamadas a la función probablemente tardará más en ejecutarse (del orden de 10 instrucciones de procesador para la mayoría de los lenguajes de alto rendimiento). En teoría, este tiempo adicional de ejecución podría ser importante.
Ver también
Referencias
- ^ Spinellis, Diomidis. "Guía del detector de códigos incorrectos" . InformIT.com . Consultado el 6 de junio de 2008 .
- ^ Similitudes de código más allá de copiar y pegar por Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
- ^ Li, Hongzhe; Kwon, Hyuckmin; Kwon, Jonghoon; Lee, Heejo (25 de abril de 2016). "CLORIFI: descubrimiento de vulnerabilidad de software mediante verificación de clon de código". Concurrencia y Computación: Práctica y Experiencia . 28 (6): 1900-1917. doi : 10.1002 / cpe.3532 . S2CID 17363758 .
- ^ Arcelli Fontana, Francesca; Zanoni, Marco; Ranchetti, Andrea; Ranchetti, Davide (2013). "Software de detección y refactorización de clones" (PDF) . Ingeniería de Software ISRN . 2013 : 1–8. doi : 10.1155 / 2013/129437 .
- ^ Kapser, C .; Godfrey, MW, "" Cloning Considered Harmful "Considered Harmful ", 13th Working Conference on Reverse Engineering (WCRE), págs. 19-28, octubre de 2006
- ^ Wagner, Stefan; Abdulkhaleq, Asim; Kaya, Kamer; Paar, Alexander (2016). "Sobre la relación de fallas y clones de software inconsistentes: un estudio empírico" . Proc. 23ª Conferencia Internacional IEEE sobre Análisis, Evolución y Reingeniería de Software (SANER 2016) : 79–89. arXiv : 1611.08005 . doi : 10.1109 / SANER.2016.94 . ISBN 978-1-5090-1855-0. S2CID 3154845 .
- ^ Brenda S. Baker . Un programa para identificar códigos duplicados. Ciencias de la Computación y Estadística, 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 de junio de 2006 en la Wayback Machine por Matthias Rieger, Stephane Ducasse.
- ^ Yuan, Y. y Guo, Y. CMCD: Detección de clones de código basado en matrices de conteo , en la 18ª Conferencia de ingeniería de software de Asia y el Pacífico de 2011. IEEE, diciembre de 2011, págs. 250–257.
- ^ Chen, X., Wang, AY y Tempero, ED (2014). Una 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 sobre Ingeniería de Software. Nº 2. Федеральное государственное бюджетное учреждение науки Институт системного программированияde 2008.
enlaces externos
- The University of Alabama en Birmingham: Code Clones Literature
- Encontrar código duplicado en C #, VB.Net, ASPX, Ruby, Python, Java, C, C ++, ActionScript o XAML