Home Programación PHP Detectando código PHP duplicado con phpcpd

Por Carlos Nacianceno, @igormx

Muchas veces, se dice que al codificar se debe reutilizar código, esto es cierto,  pero no quiere decir que necesariamente se tenga que hacer “copy-paste” de ese código. El duplicar o clonar código dentro de un proyecto,  incrementa la dificultad para mantener el mismo aumentando los tiempos y costos.

Sí, al principio es muy simple y rápido hacer “copy-paste” de algunas o muchas líneas de código, pero si luego se detecta un error o se quiere hacer mejoras, la dificultad para lograrlo se multiplicará por el número de veces que se duplicó ese código en el proyecto. Lo ideal para reutilizar código es crear librerías de funciones o clases que sean sencillas y especializadas, de manera que mantenerlas resulte práctico y fácil.

Una herramienta que nos ayuda a detectar código PHP duplicado es phpcpd (Copy/Paste Detector (CPD) for PHP code) , la cuál fue creada por Sebastian Bergmann, el mismo de PHPUnit , y al igual que phploc se instala desde PEAR.

Instalación

Si no has usado el canal PEAR phpunit.de primero debes “descubrirlo”:

pear channel-discover pear.phpunit.de

pear channel-discover components.ez.no

Y ahora sí podemos instalar el phpcpd

pear install phpunit/phpcpd

Corriendo una prueba

/usr/local/zend/bin/phpcpd sigmabol/

phpcpd 1.3.2 by Sebastian Bergmann.

Found 8 exact clones with 550 duplicated lines in 8 files:

– application/controllers/MatrizinternaController.php:8-163

application/controllers/MatrizController.php:7-162

 

– application/controllers/MatrizinternaController.php:186-240

application/controllers/MatrizController.php:179-233

 

– library/Bvb/Grid/Deploy/Pdf.php:285-292

library/Bvb/Grid/Deploy/Pdf.php:436-443

 

– library/Bvb/Grid/Deploy/Print.php:111-120

library/Bvb/Grid/Deploy/Wordx.php:381-390

 

– library/Bvb/Grid/Deploy/Wordx.php:79-234

library/Bvb/Grid/Deploy/Odt.php:79-234

 

– library/Bvb/Grid/Deploy/Print.php:111-120

library/Bvb/Grid/Deploy/Odt.php:352-361

 

– library/Bvb/Grid/Deploy/Wordx.php:79-233

library/Bvb/Grid/Deploy/Ods.php:79-233

 

– library/Bvb/Grid/Deploy/Print.php:111-118

library/Bvb/Grid/Deploy/Word.php:111-118

 

3.64% duplicated lines out of 15116 total lines of code.

Time: 1 second, Memory: 22.25Mb

Al correr el comando nos da una salida con los archivos que tienen líneas de código duplicadas, además un porcentaje de líneas duplicadas respecto al total de líneas del proyecto, el tiempo y memoria que tomó hacer la prueba.

Conclusiones

Esta herramienta nos de una buena idea de la forma en la que reutilizamos nuestro código, lo ideal sería que el 0% de nuestro código esté repetido, por supuesto algunas veces esto no será posible y duplicaremos algo de código, pero es bueno mantener esos porcentajes por niveles bajos.

Eso nos ayuda a fomentar buenas prácticas como la creación de librerías comunes y clases extendibles( léase con la facilidad para ser extendidas por clases hijas).

Además phpcpd y las otras herramientas similares pueden ser integradas con servidores de Continuous Integration como Jenkins y phpUnderControl, lo que nos da una visión completa del QA (Quality assurance) en nuestros proyectos PHP.

Saludos.

 

Leave a Reply