2009-04-02 14 views
19

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

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, al utilizar la búsqueda de texto plano no se revela nada, ya que no usé el nombres de variables que serían exactamente lo mismo.

Tener fragmentos de código similares conduce a una duplicación innecesaria del código, sin embargo, con una gran base de código, es imposible mantener todos los códigos en la memoria. ¿Hay alguna herramienta que realice algún análisis del código y fragmentos marcados o funciones que son "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 ha sido ya formuladas y contestadas varias veces:

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

How to detect code duplication during development?

Sugiero que se cierre como duplicado aquí.


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

+0

Pregunta relacionada - http://stackoverflow.com/questions/2490884/why-is-copy-and-paste-of-code-dangerous – Oded

+0

posible duplicado de [¿Cómo detectar la duplicación de código durante el desarrollo?] (Http: //stackoverflow.com/questions/191614/how-to-detect-code-duplication-during-development) – Suma

Respuesta

10

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

3

En nuestro CloneDR encontramos códigos duplicados, copias exactas y casi errores, en sistemas fuente de gran tamaño, parametrizados por sintaxis de idioma. Admite Java, C#, COBOL, C++, PHP, Python y muchos otros lenguajes.

Acepta una serie de parámetros para definir, entre ellos "¿Qué es un clon?": a) umbral Similarilty, el control de cómo similares dos bloques de código deben ser para ser declarado como clones (típicamente 95% es bueno) b) número de líneas tamaño de clonación mínimo (3 tiende a ser una buena opción) c) número de parámetros (cambios distintos en el texto; 5 tiende a ser una buena opción) Con estos ajustes, tiende a encontrar 10- 15% de código redundante en virtualmente todo lo que procesa.

Las herramientas de detección de clones orientadas a la línea como Simian no pueden encontrar el código clonado que ha sido reformateado, pero CloneDR lo hará. Pueden decir que dos bloques de código coinciden, , pero generalmente no muestran exactamente cómo coinciden ni 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 más débiles que coinciden, tienden a producir más falsos positivos; cuando obtiene 5000 clones reportados en un millón de líneas, la cantidad de falsos positivos es muy importante.

Según su ejemplo, esperaría que encuentre esos dos fragmentos (no tiene que señalar a ninguno) y tenga en cuenta que son similares si se abstraen los nombres de las variables.

0

Sucede que mi tesis trataba de detectar fragmentos similares de código.

Aquí está la mejor página que he encontrado. Una gran cantidad de literatura, herramientas, enlaces:

http://students.cis.uab.edu/tairasr/clones/literature/

En general hay muchos programas, pero ninguno de ellos parece ser el mejor o el más popular. Debe definir qué es lo más importante para usted y buscar a través de las herramientas disponibles ... o leer algunos documentos y escribir su propia herramienta, la que mejor le convenga. Si escribe un buen detector de clonación, puede portarlo como un plugin de Eclipse y será útil para muchas personas. Ninguno de los complementos tiene una posición dominante recientemente, por lo que puede ser el indicado.

Cuestiones relacionadas