Charla del PHP Day Spain, sobre como lidiar con Legacy Code. Se habla de UnitTesting, Refactoring. Ademas de como generar codigo de buena calidad con TDD y Clean Code.
3. Dealing with fear in legacy projects
#PHPDS15
¿Quien soy?
● Aitor Suso
● @patxi1980
● Desarrollador PHP por 10 años
● Web developer en Atrápalo
3
4. Dealing with fear in legacy projects
#PHPDS15
De qué va la charla
Mejorar código ya existente
Generar buen código nuevo
4
5. Dealing with fear in legacy projects
#PHPDS15
¿A qué llamamos “legacy code”?
● Código viejo
● Código feo
● Código incomprensible
● Código espagueti
● Galimatías absurdo
5
6. Dealing with fear in legacy projects
#PHPDS15
Miedos con el legacy code
Romper el código actual
No entender lo que
hace el código
6
7. Dealing with fear in legacy projects
#PHPDS15
Soluciones a los miedos
7
Romper el código actual
No entender lo que
hace el código
Test automatizados
Refactor
9. Dealing with fear in legacy projects
#PHPDS15
¿A qué llamamos “legacy code”?
Para mi, “legacy code” es simplemente código sin
tests.
Michael Feathers
9
10. Dealing with fear in legacy projects
#PHPDS15
Working Effectively with
Legacy Code
Michael C. Feathers
http://goo.gl/gdEUGR
10
11. Dealing with fear in legacy projects
#PHPDS15
Situación extrema para testear
11
Controlador con todo acoplado
● Lógica
● Llamadas a BD
● Generación de HTML
12. Dealing with fear in legacy projects
#PHPDS15
The Legacy Code Dilemma
Cuando cambiamos el código, necesitamos tener
tests. Para tener tests, necesitamos cambiar el
código.
12
13. Dealing with fear in legacy projects
#PHPDS15
Tests funcionales al rescate
● Selenium
● Behat
● Comparación de Response
● Salida de texto
● ...
13
14. Dealing with fear in legacy projects
#PHPDS15
Situaciones complejas para testear
● variables globales y super globales
● creación de objetos con lógica (new)
● llamadas a BD
● llamadas a APIs / servicios externos
● ...
14
15. Dealing with fear in legacy projects
#PHPDS15
Empezar por los caminos menos profundos
Ir creando nuevos tests, que analizen los
caminos de menos profundos a más profundos.
¿Cómo testear?
15
16. Dealing with fear in legacy projects
#PHPDS15
Es una carrera de fondo (I)
Cuando tienes un bug, mejor crear un test que
lo reproduzca antes de arreglarlo
16
17. Dealing with fear in legacy projects
#PHPDS15
Es una carrera de fondo (II)
Es mejor tener un set pequeño y correrlo
siempre, que un set complejo y no correrlo
nunca
17
18. Dealing with fear in legacy projects
#PHPDS15
Ventajas de test unitarios
● Feedback rápido
● Errores localizados
● Explican el funcionamiento de la “unidad”
18
19. Dealing with fear in legacy projects
#PHPDS15
No solo tests unitarios
Tests funcionales
● Validar procesos completos
● Mejor conocimiento del comportamiento
del código
● Procesos críticos siempre estables.
19
21. Dealing with fear in legacy projects
#PHPDS15
¿A qué llamamos “refactoring”?
Un cambio realizado en la estructura interna de
software para que sea más fácil de entender y más
barato de modificar sin cambiar su
comportamiento.
Martin Fowler
21
22. Dealing with fear in legacy projects
#PHPDS15
Refactoring: Improving the
Design of Existing Code
Martin Fowler
http://goo.gl/gUUIgw
22
23. Dealing with fear in legacy projects
#PHPDS15
Code smells
● Código duplicado
● Métodos largos
● Clases largas
● Switchs
● Código muerto
● ….
23
24. Dealing with fear in legacy projects
#PHPDS15
¿Cómo refactorizar?
Buscar el camino más profundo, refactorizar
dicho trozo de código.
Seguir iterando refactorizaciones
24
25. Dealing with fear in legacy projects
#PHPDS15
Técnicas básicas de refactor
● Extraer métodos
● Convertir números mágicos en constantes
● Mover lógica de los condicionales a
funciones
● Mover código de los condicionales y bucles
a funciones.
25
26. Dealing with fear in legacy projects
#PHPDS15
¿Cuando terminar de refactorizar?
Extract until you drop
Robert C. Martin (Uncle Bob)
26
28. Dealing with fear in legacy projects
#PHPDS15
¿A qué llamamos “legacy code”?
El código es “legacy code” tan pronto como esta
escrito.
28
29. Dealing with fear in legacy projects
#PHPDS15
Test Driven Development (TDD)
● Cobertura total del código
● Código que sólo cubre las necesidades de
los tests
● Código refactorizado
● Diseño fácilmente cambiable y testeable
29
30. Dealing with fear in legacy projects
#PHPDS15
Test Driven Development by
Example
Kent Beck
http://goo.gl/GozEAx
30
31. Dealing with fear in legacy projects
#PHPDS15
FizzBuzz
Bowling Game
Katas de TDD
31
32. Dealing with fear in legacy projects
#PHPDS15
Clean code
Robert C. Martin
http://goo.gl/xKy9uc
32
33. Dealing with fear in legacy projects
#PHPDS15
Clean Code
● Nombres significativos
● Funciones y clases cortas
● Control de errores
● Principios SOLID
● Comentarios
33
34. Dealing with fear in legacy projects
#PHPDS15
Comentarios
A user interface is like a joke.
If you have to explain it, it's not that good
@StartupVitamins
34
35. Dealing with fear in legacy projects
#PHPDS15 35
Code is like a joke.
If you have to “comment” it, it’s not that good
@patxi1980
Comentarios
37. Dealing with fear in legacy projects
#PHPDS15
Coding Standard (PSR-*)
PHP-CS-Fixer
PHP_CodeSniffer
37
La objetivo de los “coding standard” es la de
reducir la dificultad cuando se lee código de
diferentes autores.
38. Dealing with fear in legacy projects
#PHPDS15
PHP Mess Detector
● Clean Code
● Code size
● Controversial
● Naming
● Unused Code
38
39. Dealing with fear in legacy projects
#PHPDS15
PHP-Git-Hooks
● php-cs-fixer
● phpunit
● phplint
● phpcs
● phpmd
39
https://github.com/bruli/php-git-hooks
40. Dealing with fear in legacy projects
#PHPDS15
PHP Metrics
● Índice de mantenibilidad
● Complejidad ciclomática
● Métrica de Halstead
● Falta de cohesión
● Inestabilidad
● ...
40
41. Dealing with fear in legacy projects
#PHPDS15
Conocer y usa bien tu IDE (PHPStorm)
Refactor
● Extraer métodos
● Cambiar firma
● Renombrar variables /
funciones
● ...
Analizar código
● Code smell
● Code sniffer
● Mess detector
● PHPDoc
● ...
41