Code Smells
Repaso de los code smells más frecuentes, con un ejemplo en el que se analiza como entorpece el desarrollo y estrategias para solucionarlos.
- Data Clump
- Large Class
- Long method
- Long Parameter List
- Primitive Obsession
- Rename, para entender mejor
Object Calisthenics
Un ejemplo práctico de cómo usar estar reglas para dirigir un refactor en nuestro código.
- Solo un nivel de indentación.
- No usar la palabra clave ELSE
- Empaquetar primitivas en objetos
- Colecciones de primera clase
- Un punto por línea
- No usar abreviaturas
- Mantener todas las entidades pequeñas
- No más de dos variables de instancia por clase
- No user getters, setters o propiedades públicas
- Comentarios finales
Patrones de Diseño
Un repaso a los patrones de diseño más comunes y cómo aplicarlos en nuestro código.
- Cadena de responsabilidad
- El patrón visitante
- El patrón Specification del dominio a la infraestructura (1)
- El patrón Specification del dominio a la infraestructura (2)
- El patrón Specification del dominio a la infraestructura (3)
- Strategy pattern
- El patrón decorador
- Patrones de creación de objetos
- Charla. New no, lo siguiente.
- New no. Lo siguiente
- Representation pattern (obsoleto)
- Ejemplos para tus tests con Object Mother
- El patrón State
- Generar representaciones de un objeto sin exponer getters
- Patrón Builder en Golang
- El patrón Object Mother
- A donde vamos, no necesitamos repositorios
- Evita el acoplamiento fuerte con configurable dependency
- Lecciones aprendidas del patrón observer
Golden Cookbook
Recipes for snapshot, approval and combinatory testing, with Golden for Go and PHP-Golden for PHP.
- What is golden and how to start with snapshot testing
- Testing existing code with snapshot testing
- The Golden Master technique, with approval mode
TDD Outside-In con Arquitectura Hexagonal
Donde mostramos cómo aplicar TDD Outside-In con Arquitectura Hexagonal, usando diferentes aproximaciones.
- Enfoque clásico, paso a paso y reflexiones
- London School, doble ciclo y comparativa
- Comparativa práctica y conclusiones
- Walking Skeleton y vía intermedia pragmática
- Sad paths, validaciones y robustez en los tests
- Añadiendo funcionalidad y resolviendo problemas
- El configurador y la aplicación
- El configurador y la aplicación revisados
Vertical Slice Architecture
Explicamos y reflexionamos sobre el patrón Vertical Slice Architecture con un ejemplo de su posible implementación.
- Preparando un proyecto Symfony para experimentar con Vertical Slice Architecture
- Vertical Slice Architecture
- Una aplicación usando Vertical Slice Architecture
- VSA. Diseño del handler
- VSA. Más de una feature
- TDD outside-in y testing inside-out
- Testeando lo que puede ir mal
Historia de una reescritura
Crónica paso a paso sobre el proceso de reescritura de una aplicación legacy hacia una arquitectura limpia y testeable.
- Historia de una reescritura (1)
- Historia de una reescritura (2) el problema con MVC
- Historia de una reescritura (3) empezar con la vista
- Historia de una reescritura (4) el código tóxico
- Historia de una reescritura (5) tests
- Historia de una reescritura (6) autoload sin namespaces
API Rest
Conceptos, diseño y buenas prácticas para servir y consumir APIs RESTful en PHP.
Katando PHPSpec
Serie práctica resolviendo una kata de código guiada por especificaciones con PHPSpec.
TDD en PHP con colecciones
Desarrollo paso a paso guiado por tests (TDD) para modelar e implementar estructuras de colecciones orientadas a objetos en PHP.
- TDD en PHP. Un ejemplo con colecciones (1)
- TDD en PHP. Un ejemplo con colecciones (2)
- TDD en PHP. Un ejemplo con colecciones (3)
- TDD en PHP. Un ejemplo con colecciones (4)
- TDD en PHP. Un ejemplo con colecciones (5)
Ejercicio de refactoring
Ejemplo práctico de refactorización progresiva: desde tests de caracterización hasta el diseño final limpio.
- Ejercicio de refactor (1) Los tests de caracterización
- Ejercicio de refactor (2) Extraer hasta la última gota
- Ejercicio de refactoring (3) Intervenir y seguir o no refactorizando
- Ejercicio de refactoring (4) Finalizando
Código mentiroso
Análisis de patrones en el código que engañan sobre su verdadero comportamiento y cómo corregirlos.
Test doubles
Introducción y principios de diseño fundamentales al trabajar con dobles de test.
Introducción a BDD en PHP
Guía práctica de Behavior Driven Development en PHP utilizando herramientas como Behat y PHPSpec.
- Introducción a Behavior Driven Development en PHP (1)
- Introducción a Behavior Driven Development en PHP (2)
- Introducción a Behavior Driven Development en PHP (3)
- Introducción a Behavior Driven Development en PHP (4)
Refactor cotidiano
Técnicas y hábitos diarios de refactorización para mejorar continuamente la legibilidad y mantenibilidad del código.
- Refactor cotidiano (1). Fuera comentarios
- Refactor cotidiano
- Refactor cotidiano (2). Mejora los nombres
- Refactor cotidiano (3). Acondiciona las condicionales
- Refactor cotidiano (4). Sustituye escalares por objetos
- Refactor cotidiano (5). Refactoriza a Enumerables
- Refactor cotidiano (6). Aplica Tell, Don't Ask y la Ley de Demeter
- Refactor cotidiano (7). Refactoriza de single return a return early
- Refactor cotidiano (8). Dónde poner el conocimiento
Guía para testear con dobles
Guía completa y detallada sobre el uso apropiado de dobles de test (mocks, stubs, fakes, spies y dummies).
De Directory Driven a DDD
Transición paso a paso desde una arquitectura guiada por carpetas hacia Domain-Driven Design.
Pong en Python
Desarrollo ágil de un juego Pong en Python, abordando legacy, refactoring, tests automatizados y gestión de sprints.
- Pong en Python. Los prototipos como punto de partida de un proyecto de software
- Pong en Python. Convivencia entre legacy y código nuevo
- Pong en Python. Reubicar el legacy y automatizar los tests
- Pong en Python. Mejorando la aplicación
- Pong en Python. Separando el legacy en Scenes
- Pong en Python. Eliminando deuda técnica.
- Pong en Python. Nuevas features, nuevos tests
- Pong en Python. Desarrollo ágil
- Pong en Python. Agilidad y prioridades
- Pong en Python. Ramas y bugs
- Pong en Python. Refinamiento y sprint desbocado
- Pong en Python. Recuperarse de un sprint fallido
Más allá de SOLID
Reflexiones sobre principios de diseño de software fundamentales que complementan y trascienden a SOLID.
- Más allá de SOLID, principios básicos
- Más allá de SOLID, los cimientos
- Más allá de SOLID, los consejos prácticos
- Más allá de SOLID, los principios olvidados
Trabajar con legacy y entender el dominio
Estrategias para poner código legacy bajo test, extraer conceptos y estructurar la aplicación descubriendo el dominio.
Código a prueba de futuro
Técnicas y decisiones de diseño para escribir código sostenible, extensible y resistente al paso del tiempo.
Outside-in y Behavior Driven Development
Desarrollo de aplicaciones siguiendo el ciclo Outside-In con BDD usando Behat y PHPSpec.
- Outside-in y Behavior Driven Development 1
- Outside-in y Behavior Driven Development 2
- Outside-in y Behavior Driven Development 3
- Outside-in y Behavior Driven Development 4
- Outside-in y Behavior Driven Development 5
- Outside-in y Behavior Driven Development 6
- Outside-in y Behavior Driven Development 7
Aprendiendo Go con TDD
Exploración del lenguaje Go aprendiendo sus fundamentos y características mediante Test-Driven Development.
Dungeon Crawler en Python
Serie completa sobre el desarrollo de un juego Dungeon en Python aplicando diseño incremental.
- Dungeon 1. Empezando por algún sitio
- Dungeon 2. The Walking Skeleton
- Dungeon 3. Compaginar diseño y delivery
- Dungeon 4. Una historia de usuario
- Dungeon 5. Laberintos y deuda técnica
- Dungeon 6. Builders al rescate
- Dungeon 7. Code Review
- Dungeon 8. Energía y feature flags
- Dungeon 9. El camino equivocado
- Dungeon 10. Eventos para controlarlos a todos
- Dungeon 11. Power-ups y un poco de orden
- Dungeon 12. Otra revisión de código
- Dungeon 13. Salir con un tesoro. Parte 1
- Dungeon 14. Salir con un tesoro. Parte 2
- Dungeon 15. Problemas con null y modelando una mano
Arquitectura Hexagonal con BDD
Construcción de aplicaciones basadas en Puertos y Adaptadores (Arquitectura Hexagonal) guiadas por BDD.
- Introducción a la Arquitectura Hexagonal
- Algunas dudas comunes con Arquitectura Hexagonal
- Una aplicación hexagonal construida con BDD (1)
- Intentando llegar a buen puerto con Arquitectura Hexagonal y BDD
- Creando un adaptador driver en una aplicación hexagonal
- Como añadir features en arquitectura hexagonal
Refactoring Gilded Rose
Estrategias avanzadas de refactorización del clásico kata Gilded Rose: Golden Master, condicionales y polimorfismo.
- Cobertura de test rápida con Golden Master
- Despejar una maraña de condicionales
- Refactoriza rompiendo cosas
- De condicionales a polimorfismo
Bus de mensajes y Command Bus
Explicación detallada del funcionamiento, beneficios e implementación práctica de buses de comandos y mensajería.
Refactoring para quienes no refactorizan
Introducción accesible al refactoring con pasos sencillos y pragmáticos para perder el miedo a mejorar el código existente.
- Refactoring para quienes no refactorizan
- Refactor para quienes no refactorizan 2
- Refactoring para quienes no refactorizan 3
La guía definitiva de los dobles de test
Guía revisada y exhaustiva sobre dobles de test: definiciones claras, cuándo utilizarlos y antipatrones a evitar.