Share to: share facebook share twitter share wa share telegram print page

Código duplicado

El código duplicado es un término en programación de computadores para una secuencia de código fuente que ocurre más de una vez, dentro de un programa o a través de diferentes programas, de propiedad, o mantenido, por la misma entidad. El código duplicado es considerado indeseable por una serie de razones.[1]​ Un requisito mínimo es usualmente aplicado a la cantidad de código que debe aparecer en una secuencia para ser considerado duplicado en vez de coincidentemente similar. Secuencias de código duplicado se conocen como clones de código o simplemente clones.

Las siguientes son algunas de las maneras en que dos secuencias de código pueden ser duplicadas una de la otra:

  • idénticas carácter por carácter
  • idénticas carácter por carácter cuando son ignorados los caracteres de espacio en blanco y los comentarios
  • idénticas token-por-token
  • idénticas token-por-token con variación ocasional (es decir, inserción/eliminación/modificación de tokens)
  • funcionalmente idénticas

¿Cómo es creado el código duplicado?

Hay un número de razones del por qué el código duplicado puede ser creado, incluyendo:

  • Programación basada en copia y pega, en donde una sección de código es copiada "porque funciona". En la mayoría de los casos esta operación implica ligeras modificaciones en el código clonado como cambio de nombre de variables o insertar/eliminar código.
  • Es requerida funcionalidad que es muy similar a la que está en otra parte de un programa, y un desarrollador independiente escribe código que es muy similar a lo que ya existe en otro lugar.
  • Plagio, donde el código es simplemente copiado sin permiso o atribución.

Problemas asociados con el código duplicado

La duplicación de código es generalmente considerada una señal de estilo de programación pobre o perezoso. Buen estilo de codificación es generalmente asociado con la reutilización de código. Puede ser ligeramente más rápido desarrollar por duplicación de código, porque el desarrollador no necesita preocuparse en cómo es utilizado el código actualmente o cómo puede ser usado en el futuro. La dificultad es que el desarrollo original es sólo una pequeña fracción del ciclo de vida de un producto, y con la duplicación de código, los costos de mantenimiento son mucho mayores. Algunos de los problemas específicos incluyen:

  • Un montón de código afecta la comprensión: El código duplicado con frecuencia crea largas secciones repetidas de código que difieren en sólo unas pocas líneas o caracteres. La longitud de estas rutinas puede hacerlo difícil de comprenderlas rápidamente. Esto está en contraste con las "mejores prácticas" de descomposición de código.
  • Enmascaramiento de propósito: La repetición de largas secciones idénticas de código pueden ocultar cómo difieren unas de las otras, y por lo tanto, cuál es el propósito específico de cada sección de código. A menudo, la única diferencia es un valor de parámetro. La mejor práctica en tales casos es una subrutina reutilizable.
  • Anomalías de actualización: El código duplicado contradice el principio fundamental de la teoría de base de datos que se aplica aquí: evitar la redundancia. La inobservancia incurre en anomalías de actualización, que aumentan los costos de mantenimiento, en donde cualquier modificación a una pieza redundante de código debe hacerse separadamente para cada duplicado. En el mejor caso, el tiempo de codificación y pruebas son multiplicados por el número de duplicaciones. En el peor de los casos, puede faltar actualizar en algunos lugares, y por ejemplo erroresque se piensan fueron corregidos pueden persistir en lugares duplicados durante meses o años. La mejor práctica aquí es una biblioteca de código.
  • Tamaño del archivo: A menos que una compresión sin pérdida sea aplicada, el archivo tomará más espacio en el computador.

Detectando el código duplicado

Se han propuesto una serie de algoritmos para detectar el código duplicado. Por ejemplo:

Ejemplo de código duplicado funcional

Considere el siguiente fragmento de código para calcular el promedio de un arreglo de enteros

extern int arreglo1[];
extern int arreglo2[];
 
int suma1 = 0;
int suma2 = 0;
float promedio1 = 0.0;
float promedio2 = 0.0;
 
for (int i = 0; i < 4; i++)
{
   suma1 += arreglo1[i];
}
promedio1 = suma1 / 4;
 
for (int i = 0; i < 4; i++)
{
   suma2 += arreglo2[i];
}
promedio2 = suma2 / 4;

Los dos bucles pueden ser reescritos en una simple función:

int calculaPromedio (int* arreglo_de_4)
{
   int suma = 0;
   for (int i = 0; i < 4; i++)
   {
       suma += arreglo_de_4[i];
   }
   return suma / 4;
}

Usando la función de arriba, dará código fuente que no tiene duplicación de bucles:

extern int arreglo1[];
extern int arreglo2[];

float promedio1 = calculaPromedio(arreglo1);
float promedio2 = calculaPromedio(arreglo2);

Referencias

  1. Spinellis, Diomidis. «The Bad Code Spotter's Guide». InformIT.com. Archivado desde el original el 18 de octubre de 2012. Consultado el 6 de junio de 2008. 
  2. Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics, 24:49–57, 1992.
  3. Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees
  4. Visual Detection of Duplicated Code Archivado el 29 de junio de 2006 en Wayback Machine. by Matthias Rieger, Stephane Ducasse.

Véase también

Enlaces externos

Index: pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve 
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 
Kembali kehalaman sebelumnya