language-agnostic search maintenance code-duplication

language agnostic - ¿Cómo encontrar un fragmento de código similar?



language-agnostic search (3)

Aquí está la mejor colección de detección de clones de código que he visto:

https://web.archive.org/web/20120502162147/http://students.cis.uab.edu/tairasr/clones/literature

Hay muchos programas, pero ninguno de ellos parece ser el mejor o el más popular. Puede pensar qué es lo más importante para usted y encontrar lo que se adapte a sus necesidades.

¿Alguien tiene alguna herramienta o práctica recomendada sobre cómo encontrar un fragmento de código que sea similar a otro código?

A menudo escribo una función o un fragmento de código y recuerdo que ya he escrito algo así antes, y me gustaría reutilizar la implementación anterior, sin embargo, el uso de la búsqueda de texto sin formato no revela nada, ya que no usé los nombres de las variables que ser exactamente el mismo

Tener fragmentos de código similares conduce a una duplicación de código innecesaria, sin embargo, con una base de código grande es imposible mantener todo el código en la memoria. ¿Hay alguna herramienta que realice algún análisis del código y fragmentos marcados o funciones que sean "similares" en términos de funcionalidad?

Considere los siguientes ejemplos:

float xDistance = 0, zDistance = 0; if (camPos.X()<xgMin) xDistance = xgMin-camPos.X(); if (camPos.X()>xgMax) xDistance = camPos.X()-xgMax; if (camPos.Z()<zgMin) zDistance = zgMin-camPos.Z(); if (camPos.Z()>zgMax) zDistance = camPos.Z()-zgMax; float dist = sqrt(xDistance*xDistance+zDistance*zDistance);

y

float distX = 0, distZ = 0; if (cPos.X()<xgMin) distX = xgMin-cPos.X(); if (cPos.X()>xgMax) distX = cPos.X()-xgMax; if (cPos.Z()<zgMin) distZ = zgMin-cPos.Z(); if (cPos.Z()>zgMax) distZ = cPos.Z()-zgMax; float dist = sqrt(distX*distX +distZ*distZ);

Me parece que esto ya ha sido preguntado y contestado varias veces:

https://stackoverflow.com/questions/204177/what-tool-to-find-code-duplicates-in-c-projects

¿Cómo detectar la duplicación de código durante el desarrollo?

Sugiero cerrar aquí como duplicado.

En realidad, creo que es un problema de búsqueda más general, como: ¿Cómo busco si la pregunta ya se hizo en StackOverflow?


Nuestro CloneDR encuentra código duplicado, tanto copias exactas como casi fallos, a través de grandes sistemas de origen, parametrizados por la sintaxis del lenguaje. Es compatible con Java, C #, COBOL, C ++, PHP, Python y muchos otros idiomas.

Acepta una serie de parámetros para definir "¿Qué es un clon?", Incluyendo: a) Umbral de similitud, que controla cómo deben ser declarados dos bloques de código similares para ser clones (normalmente el 95% es bueno) b) número de líneas mínimo tamaño del clon (3 tiende a ser una buena elección) c) número de parámetros (distintos cambios en el texto; 5 tiende a ser una buena elección) Con estos ajustes, tiende a encontrar un código redundante del 10-15% en todo lo que procesa .

Las herramientas de detección de clones orientadas a líneas como Simian no pueden encontrar el código clonado que se ha reformateado, pero CloneDR lo hará. Pueden decir que dos bloques de código coinciden, pero por lo general no te muestran exactamente cómo coinciden o dónde están las diferencias; CloneDR lo hará. No sugieren cómo abstraer el código clonado; CloneDR lo hará.

En virtud de tener algoritmos de comparación más débiles, tienden a producir más falsos positivos; cuando se informan 5000 clones en un millón de líneas, el número de falsos positivos importa mucho.

En base a su ejemplo, esperaría que encontrara esos dos fragmentos (no tiene ningún punto para ninguno) y observe que son similares si abstrae los nombres de las variables.


Puedes usar Simian . Es una herramienta que detecta código duplicado en Java, C #, C ++, XML y muchos más (incluso archivos de texto simple). Incluso se integra muy bien en una herramienta como CruiseControl.