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.