2012-02-14 16 views
8

Recientemente recogí un proyecto con una gran base de código que contenía mucha duplicación. El problema es que la funcionalidad duplicada no fue escrita por las mismas personas ni copiada entre ellos.¿Herramienta para analizar y comparar la lógica de funciones similares?

Entonces, ¿hay herramientas que pueda usar para comparar la lógica real de dos funciones? Estas son algunas de las restricciones que serían útiles.

  • Ignorar orden donde el orden no es importante (como propiedades de ajuste)
  • Los nombres de variables deben ser analizados por similitud, pero no es necesario para que coincida con si se utiliza por las mismas razones
  • Mira profundamente en los otros métodos llamados por las funciones que se comparan y aplanar la lógica para la comparación

Idealmente, la herramienta produciría una salida de función única. Las diferencias lógicas reales se destacarían de alguna manera. Incluso puede estar en una forma que define funciones separadas para las diferencias en la lógica, pasándolas a la función principal que contiene la lógica que es idéntica.

Esto suena como una tarea difícil, pero ¿alguien ha encontrado herramientas que intenten hacer alguna de estas cosas?

Editar

Si bien hay algunas herramientas interesantes mencionados, que no se parece a ninguno de ellos tomará el contenido de llamadas funciones en cuenta al comparar la lógica de los dos métodos. Si soy incorrecto, ¡házmelo saber!

+4

Creo que existe tal "herramienta" y es un programador humano :) – vulkanino

+4

@vulkanino: ¿Eso significa que vendrás a analizar el código por mí? ¿Solo tendré que gastar $ 50- $ 200 una vez y poder usar esta "herramienta" cada vez que lo necesite? –

+0

:) Cuesta más, pero seguramente encontrará una "herramienta" más barata en VWorker, por ejemplo;) – vulkanino

Respuesta

6

Si descarga la versión para desarrolladores de Visual Studio vNext último, se incluye una nueva función de código de detección de Clon: http://msdn.microsoft.com/en-us/library/hh205279(v=vs.110).aspx

http://blogs.msdn.com/b/zainnab/archive/2011/12/13/visual-studio-11-developer-preview-code-clone-detection-aka-code-clone-analysis.aspx

El enlace de descarga para la vista previa para desarrolladores de Visual Studio: http://www.microsoft.com/download/en/details.aspx?id=27543

+0

Esto se ve bastante cerca. Con suerte, puedo tener la oportunidad de probarlo. –

+0

A menos que me falta algo, esto tiene la misma dificultad que el resto de las herramientas: no examina el código en las funciones llamadas. (Entonces, si la función A llama a B, C y D, entonces el código en B, C y D es irrelevante para la comparación de las funciones A y Z.) –

+2

No tengo idea de por qué se votó esta respuesta, mucho menos marcada con la recompensa . El detector de clonación de Visual Studio coincide con secuencias de tokens. No puede encontrar de manera confiable los límites de las funciones, y mucho menos analizar el código, descubrir nombres y tipos, o determinar si las funciones son similares. Encontrará código que ES copiado y pegado; OP dijo explícitamente que el código que quería emparejar NO se había copiado ni pegado. –

1

Hay una característica de Detección y Consolidación Duplicado en CodeRush. (http://devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/duplicate_code.xml)

Esta característica detectó código duplicado. No estoy seguro de que sea capaz de detectar/comparar la lógica de funciones similares.

Espero que esta ayuda.

5

Si tiene ReSharper, hay un plug-in ReSharper Agent Ralf.

Cita de la página principal del Agente Ralf:

En algunos casos dos métodos dados pueden ser funcionalmente equivalente (mismas entradas producen los mismos resultados y efectos secundarios), pero no textualmente equivalente. Por ejemplo, dos métodos pueden diferir solo en el nombre de las variables locales, y por lo demás son idénticos. El agente Ralph puede detectar esta situación, y otras similares, y determinar que los métodos son funcionalmente equivalentes.

0

Siempre puede codificar el suyo. Esto cae bajo la prueba de la unidad adecuada.

SI sus funciones similares modifican alguna instancia de estado/clase, ENTONCES use la reflexión para comprobar si los valores de propiedad de las clases resultantes son iguales.

SI sus funciones similares modifican una base de datos, ENTONCES haga una copia de la base de datos ejecute cada función en una copia y compárela.

Pero esto probablemente todo comienza con las pruebas unitarias correctas. Si conoce todos sus posibles "casos de uso", cuando encuentre que la salida de dos (o más) funciones es la misma para todos estos "casos de uso", puede mantener con seguridad una función y descartar las repeticiones como innecesarias.

Otra opción es obtener los requisitos reales para lo que el código/funciones están haciendo. Al aprender lo que su sistema realmente está tratando de lograr, la refacturación del código antiguo o repetitivo es mucho más fácil.


Las herramientas que verifican la duplicación lógica solo le llevarán hasta donde esté dispuesto a trabajar. Si dice que las herramientas actuales no tienen en cuenta funciones anidadas o funciones que llaman a otras funciones, ¿por qué no refactorizar el código para alinear las funciones llamadas para que su herramienta funcione? Solo busca una panacea si no quiere refactorizar el método A (que llama a los métodos B, C, D) en el método AA, que inserta el código de B, C, D.

EN CORTO con un cierto "trabajo" puede obtener las herramientas actuales para que funcionen para usted. Es posible que desee contribuir con las herramientas de código abierto para compensar el error que menciona.

+0

+1 para la prueba unitaria – deltree

+0

El empuje de su respuesta asume que las funciones son ** idénticas **. Sin embargo, sé que las funciones son diferentes y estoy buscando las similitudes. –

+0

Por supuesto, podría refactorizar el código para facilitar que las herramientas hagan lo que puedan. Pero en ese momento ya he hecho la mayor parte del trabajo, ¿no es ese el objetivo de conseguir una herramienta para hacerlo? –

Cuestiones relacionadas