Tengo que refactorizar una aplicación C # grande, y encontré muchas funciones que nunca se usan. ¿Cómo puedo verificar el código no utilizado, para poder eliminar todas las funciones no utilizadas?
Tengo que refactorizar una aplicación C # grande, y encontré muchas funciones que nunca se usan. ¿Cómo puedo verificar el código no utilizado, para poder eliminar todas las funciones no utilizadas?
Respuestas:
Sí, ReSharper hace esto. Haga clic derecho en su solución y seleccione "Buscar problemas de código". Uno de los resultados es "Símbolos no utilizados". Esto le mostrará clases, métodos, etc., que no se utilizan.
Es una gran pregunta, pero ten en cuenta que pisas aguas peligrosas aquí. Cuando elimine el código, deberá asegurarse de compilar y probar con frecuencia.
Una gran herramienta viene a la mente:
NDepend: esta herramienta es simplemente increíble. Se tarda un poco en asimilar, y después de los primeros 10 minutos creo que la mayoría de los desarrolladores solo dicen "¡A la mierda! y elimine la aplicación. Una vez que tenga una buena idea de NDepend, le brinda una visión increíble de cómo se acoplan sus aplicaciones. Compruébalo: http://www.ndepend.com/ . Lo más importante, esta herramienta le permitirá ver métodos que no tienen llamadas directas. También le mostrará el inverso, un árbol de llamadas completo para cualquier método en el ensamblaje (o incluso entre ensamblajes).
Cualquiera sea la herramienta que elija, no es una tarea tomar a la ligera. Especialmente si se trata de métodos públicos en ensamblajes de tipo de biblioteca, ya que es posible que nunca sepa cuándo una aplicación hace referencia a ellos.
Como señaló Jeff, la herramienta NDepend puede ayudar a encontrar métodos, campos y tipos no utilizados.
Para elaborar un poco, NDepend propone escribir una regla de código sobre LINQ Query (CQLinq) . Se proponen alrededor de 200 reglas de código predeterminadas , 3 de ellas dedicadas a la detección de código no utilizado / muerto
Básicamente, una regla para detectar métodos no utilizados, por ejemplo, se ve así:
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
Pero esta regla es ingenua y devolverá falsos positivos triviales. Hay muchas situaciones en las que nunca se llama a un método, pero no se utiliza (punto de entrada, constructor de clase, finalizador ...) es por eso que las 3 reglas predeterminadas son más elaboradas:
NDepend se integra en Visual Studio 2017,2015, 2013, 2012, 2010, por lo que estas reglas se pueden verificar / examinar / editar directamente dentro del IDE . La herramienta también se puede integrar en su proceso de CI y puede generar informes que mostrarán las reglas violadas y los elementos del código culpable. NDepend también tiene una extensión VS Team Services .
Si hace clic en estos 3 enlaces anteriores hacia el código fuente de estas reglas, verá que los que conciernen a los tipos y métodos son un poco complejos. Esto se debe a que detectan no solo los tipos y métodos no utilizados, sino también los tipos y métodos utilizados solo por los tipos y métodos muertos no utilizados (recursivo).
Este es un análisis estático , de ahí el prefijo Potencialmente en los nombres de las reglas. Si un elemento de código se usa solo a través de la reflexión, estas reglas podrían considerarlo como no utilizado, lo que no es el caso.
Además de usar estas 3 reglas, recomendaría medir la cobertura del código mediante pruebas y esforzarme por tener una cobertura completa. A menudo, verá que el código que no puede ser cubierto por las pruebas, en realidad es un código no utilizado / muerto que puede descartarse de manera segura. Esto es especialmente útil en algoritmos complejos donde no está claro si una rama de código es accesible o no.
Descargo de responsabilidad: trabajo para NDepend.
También mencionaría que usar COI, también conocido como Unity, puede hacer que estas evaluaciones sean engañosas. Es posible que haya cometido un error, pero varias clases muy importantes que se instancian a través de Unity parecen no tener instanciación hasta donde ReSharper puede decir. Si siguiera las recomendaciones de ReSharper, me mancharían.
ReSharper hace un gran trabajo al encontrar código no utilizado.
En VS IDE, puede hacer clic con el botón derecho en la definición y elegir 'Buscar todas las referencias', aunque esto solo funciona en el nivel de solución.
La verdad es que la herramienta nunca puede darte una respuesta 100% segura, pero la herramienta de cobertura puede darte una buena carrera por el dinero.
Si cuenta con un conjunto completo de pruebas unitarias, puede utilizar la herramienta de cobertura de prueba para ver exactamente qué líneas de código no se ejecutaron durante la ejecución de la prueba. Aún deberá analizar el código manualmente: elimine lo que considera código muerto o escriba una prueba para mejorar la cobertura de la prueba.
Una de esas herramientas es NCover , con precursor de código abierto en Sourceforge . Otra alternativa es PartCover .
Mira esta respuesta en stackoverflow.
FXCop es un analizador de código ... Hace mucho más que encontrar código no utilizado. Usé FXCop por un tiempo, y estaba tan perdido en sus recomendaciones que lo desinstalé.
Creo que NDepend parece un candidato más probable.