Detección de código muerto en PHP

Tengo un proyecto con código muy desordenado, mucha duplicación y código muerto aquí y allá.

Hace algún tiempo, las pruebas unitarias no cubrían el código, pero ahora intentamos escribir todo el código nuevo en TDD y reducir la deuda técnica al cubrir también el código “antiguo” mediante pruebas unitarias (técnica de última prueba).

La complejidad de la lógica de negocios es bastante alta y, a veces, nadie puede responder si se usan o no algunos métodos.

¿Cómo se pueden encontrar estos métodos de código muerto? Extenso registro? ¿Cobertura de prueba más alta? (No es muy fácil porque los clientes quieren que salgan nuevas características)

    Las herramientas de cobertura de código de xdebug le permiten probar qué líneas de código se están ejecutando realmente, sin necesidad de colocar declaraciones de seguimiento en todas las funciones / métodos.

    Ejemplo:

     array line_number => int 1 or 0. ?> 

    Es un poco tarde ahora, pero PHPDCD afirma hacer esto estáticamente, lo que debería darte un resultado mucho más informativo que tener que perfilar la ejecución del código real con xprof / xdebug.

    No conozco una forma de detectar código que no se utiliza por completo, que puede estar más allá de las capacidades de todas las herramientas que existen. Pero en cuanto a las herramientas disponibles, acceda a http://phpqatools.org/ para ver un buen resumen de ellas.

    • Hasta el momento, uno de mis favoritos en phploc, que desglosa tu código desde una perspectiva orientada a objetos y te da detalles sobre cuántas clases vs cuántas funciones vs cuántas pruebas vs loc promedio por función vs Complejidad ciclomática.

    • Mi siguiente favorito es phpcpd, que es el “Detector de copiar y pegar PHP”. Conmuta toda la base de código, busca firmas comunes y le proporciona una lista de archivos con números de línea.

    • Hay muchas otras herramientas en esa página, elija las que le sean útiles.

    Estamos utilizando activamente estas herramientas en web2project y en los dos años desde que utilizamos dotProject, hemos eliminado aproximadamente el 35% de la base de código de refactorización, eliminando la duplicación (originalmente 12%, ahora aproximadamente 2.5%), y en general estructurando cosas mejor. Y eso es contar nuestras 15k + líneas de Pruebas Unitarias. 🙂

    Recomendaría ejecutar el sistema con xdebug profiler ( http://xdebug.org/docs/profiler ).

    Ejecute el sistema para ver los registros con http://code.google.com/p/webgrind/ y vea físicamente lo que se está llamando.

    En cuanto a las herramientas de creación de perfiles, si decides ir por ese camino, puedes echar un vistazo a xhprof http://developers.facebook.com/xhprof/
    Tiene un tamaño más pequeño de los archivos de salida y la interfaz web que puede incorporar a su aplicación para el seguimiento continuo. Es capaz de generar una representación visual del árbol de llamadas. Lo recomiendo sobre xdebug para ese propósito.

    Ver la herramienta de cobertura de prueba SD PHP . Usted ejercita su código de la forma que desee, incluso (o no) ejecutando suites de prueba de la forma que desee. Al final de la ejecución, puede ver una visualización de qué código se ejecutó (hay capturas de pantalla en el sitio web). El código que no se ejecuta puede estar muerto, y requiere un análisis más por su parte, pero si ejercita bien el sistema, el código no ejecutado es manejador de errores o cosas realmente muertas. La herramienta de Cobertura de Prueba PHP no requiere ningún cambio en su servidor PHP.

    La herramienta SD CloneDR encuentra código duplicado en bases de código fuente muy grandes. Es sensible al lenguaje (que cubre C, C ++, Java, C #, Ada, Fortran, así como PHP4 y PHP5) por lo que no se deja engañar por los cambios en el formato, el espacio en blanco o la presencia o ausencia de comentarios. Detectará clones de copias exactas y clones casi fallidos. El sitio web muestra ejemplos de informes de clonación para varios idiomas.

    Creo que alguien ha implementado un estilo de Structure101g que usa datos de xdebug: s101 detectará cualquier clúster no utilizado, es decir, archivos que se usan pero que están desconectados de la base de código principal.