The talking bit

Personal learning journal about programming, maybe more.


Blog de franiglesias  - Alojado en GitHub Pages Declaración de transparencia.

Temas

good-practices

php

refactoring

testing

tdd

python

blogtober19

design-principles

design-patterns

bdd

misc

legacy

dungeon

ruby

tips

hexagonal

golang

tools

ddd

bbdd

soft-skills

oop

javascript

books

api

sql

ethics

swift

java

Seams en Golang

Introducir seams o costuras es una de las herramientas que usamos para resolver algunos tests complicados. Un seam es un lugar del código en el que podemos hacer un cambio de comportamiento pero sin modificar el original. Habitualmente, aplicamos esta técnica cuando queremos que la unidad bajo test no haga uso de dependencias que son caras de utilizar en entorno de testing.

(2023/10/24)

Leer artículo completo

Tipos vs Value Objects

Todos los lenguajes de programación nos proporcionan tipos de datos para representar la información en nuestros desarrollos. Sin embargo, no siempre son suficientes.

(2023/08/26)

Leer artículo completo

Tests y repositorios

Para testear casos de uso es frecuente que utilice dobles de repositorios u otros servicios de almacenamiento. Estos dobles guardan su contenido en memoria durante la ejecución del test y son realmente rápidos. Pero para poder hacer esto, es necesario tener un buen diseño.

(2023/03/28)

Leer artículo completo

Desacoplarse del sistema

Es muy posible que estés trabajando en algún proyecto que necesite manejar fechas u horas, o incluso algo de aleatoridad. Todos los lenguajes incluyen alguna librería estándar para gestionar estos datos. O bien existen paquetes alternativos para responder a ciertas necesidades. Por ahí estamos bien servidas, pero hay un aspecto que con frecuencia pasamos por alto: trabajar con fechas, horas o números aleatorios nos acopla al sistema.

(2023/03/24)

Leer artículo completo

Decoradores en Python

El proyecto Dungeon me está sirviendo para aprender Python más a fondo, así que voy a dedicar algunos artículos a cuestiones específicas que me interesan más allá del proyecto en sí. En esta ocasión hablaré de los decoradores en Python.

(2022/12/16)

Leer artículo completo

Constructores limpios

Después de haber leído los dos volúmenes de Elegant Objects, tengo un montón de ideas dando vueltas en la cabeza. Así que para darles salida he empezado a dedicar un rato a practicar algunas de las recomendaciones de la obra. O, al menos, intentarlo.

(2022/04/03)

Leer artículo completo

Métodos largos

No hace mucho dejé caer en twitter que tener métodos de más de 10 líneas me parecía un smell. Por supuesto se levantó cierta polémica y hubo algunas respuestas a favor y en contra.

(2022/01/25)

Leer artículo completo

Outside-in y Behavior Driven Development 1

Outside-in TDD se ha convertido en mi primera opción para desarrollar nuevas features en los proyectos en los que trabajo. Hasta ahora he estado trabajando únicamente con phpunit, pero estoy preparando una especie de side-project para cambiar el modo en que hago los tests de aceptación.

(2021/10/17)

Leer artículo completo

Representation pattern

O cómo resolver el problema de mover información entre las capas de una aplicación sin violar las leyes de dependencia ni exponer el dominio en infraestructura.

(2020/11/15)

Leer artículo completo

Trabajar con legacy y entender el dominio 2

En el artículo anterior el código ha quedado algo mejor estructurado de lo que estaba y, sobre todo, las dependencias están ahora bajo nuestro control. En esta ocasión querríamos avanzar un poco más en esa misma área de organización de código y, sobre todo, conseguir que la capa de domino sea capaz de contarnos la historia acerca de qué trata la aplicación.

(2020/09/22)

Leer artículo completo

Pong en Python. Convivencia entre legacy y código nuevo

En este primer paso quiero mover el código chusco del prototipo a un objeto App, que será el nuevo punto de entrada de la aplicación. De este modo, el código del prototipo es tratado como legacy, pero puede convivir con la aplicación moderna y no perdemos la funcionalidad mientras mejoramos el código.

(2020/06/01)

Leer artículo completo

Las tres leyes de TDD

Este es un artículo de introducción a Test Driven Development a partir de las “tres leyes” y cómo estas restricciones generan un proceso poderoso para construir software sólido.

(2020/03/06)

Leer artículo completo

De directory driven a DDD paso a paso

Muchas bases de código que han sido creadas tratando de seguir la metodología DDD se quedan atascadas en ese falso DDD que solemos llamar “directory driven development”, que es básicamente una aplicación de la Arquitectura Hexagonal. Esto es, utilizan la típica distribución de carpetas Domain, Application e Infrastructure, pero el código en ellas está mal organizado y mal distribuido porque en su día no se tenía una comprensión completa de lo que implica Domain Driven Design.

(2019/12/17)

Leer artículo completo

DDD no es lo que te han contado

Acabo de leerme, por fin, El Libro sobre Domain Driven Design de Eric Evans. Después de mucho tiempo leyendo de segunda mano sobre el tema, mi conclusión es: DDD no es exactamente lo que nos han contado.

(2019/12/06)

Leer artículo completo

DDD, el lenguaje ubicuo

Creo que una de las cosas que provocan que se haga bola la parte estratégica del DDD tiene que ver con que se trata de una metodología muy orgánica. Es difícil incluso definir un principio y un final del proceso. De hecho, diría que el DDD bien entendido no termina nunca mientras el negocio evoluciona.

(2019/11/24)

Leer artículo completo

DDD, identificando el dominio y los subdominios

Domain Driven Design no puede tomarse como una guía con instrucciones para ir de un punto a otro siguiendo una ruta determinada. Es más bien, un conjunto de estrategias, métodos y tácticas para orientarse en un territorio desconocido y moverse hacia un objetivo deseado que, para mayor dificultad, es móvil.

(2019/11/12)

Leer artículo completo

Guía para testear con dobles (1)

Se diría que uno de los puntos más problemáticos a la hora de testear sea, para muchas personas, el utilizar dobles: cuándo usarlos, cómo y un largo etcétera de preguntas. En este artículo voy a proponer una serie de consideraciones para testear con dobles y no sufrir.

(2019/05/26)

Leer artículo completo

Testing expresivo

Desde hace un tiempo estoy explorando una forma de organizar el código de mis tests, al menos de una parte de ellos. A falta de un nombre mejor he decidido llamar a esta organización testing expresivo.

(2019/05/12)

Leer artículo completo

Un doble para SplFileObject

La Standard PHP Library incluye unas cuantas clases que merece la pena conocer, entre ellas SplFileObject de la cual nos ocupamos en este artículo. Sin embargo, a veces tienen alguna sorpresa oculta.

(2019/05/05)

Leer artículo completo

Let it fail

Artículo sobre antipatrones en el uso de dobles de tests y algunas heurísticas útiles para hacer buenos tests cuando necesitamos dobles.

(2019/03/24)

Leer artículo completo

Testeando lo desconocido (1)

Recientemente he comenzado a trabajar en otro proyecto dentro de la empresa ayudando con el testing. Es una parte del negocio que conozco poco todavía y la aplicación con la que estoy trabajando es, por supuesto, distinta, aunque similar en planteamiento.

(2019/02/22)

Leer artículo completo

La kata del DNI para aprender TDD

Una vez que comprendemos el concepto, no es difícil hacer TDD. Pero ese primer paso necesario para arrancar suele necesitar ayuda. Lo mejor es encontrar un ejercicio de programación que sea sencillo sin ser trivial y que ayude a poner de manifiesto los elementos más importantes de la metodología TDD.

(2018/12/12)

Leer artículo completo

Normalización de bases de datos

La normalización de las bases de datos es un proceso que persigue reducir la redundancia de datos y controlar las dependencias entre las entidades representadas en las tablas, de modo que éstas puedan evolucionar fácilmente y se reduzcan los errores que generen inconsistencia de datos.

(2018/11/18)

Leer artículo completo

Splat operator

Aunque está entre nosotros desde la versión 5.6 de PHP, splat operator es relativamente desconocido y su uso no deja de ser un poco confuso.

(2018/09/06)

Leer artículo completo

Dependencias y acoplamiento

Cómo aplicar el principio de inversión de dependencias, entendiendo qué es dependencia y qué acoplamiento. ¡Ah! Y cómo saber cuándo necesitamos usar inyección o instanciación al crear objetos.

(2018/06/05)

Leer artículo completo

Clean testing

Algunas estrategias con las que intento que mis tests sean cada vez más limpios y legibles y, por tanto, más capaces de comunicar lo que hace el software que escribo.

(2018/06/03)

Leer artículo completo

Programar sin ifs

If/then es una de las estructuras de control básicas de la programación, pero su abuso puede multiplicar la complejidad de un algoritmo y la dificultad de mantenerlo. En este artículo exploraremos alguna estrategias para usar los if con cabeza.

(2018/05/09)

Leer artículo completo

Testeando lo impredecible

¿Cómo testear lo que no podemos predecir? En muchos sentidos los tests se basan en que el comportamiento del código es predecible: si hacemos ciertas operaciones con ciertos datos podemos esperar ciertos resultados y no otros. Pero esto no siempre se cumple, a veces tenemos que testear algo que no sabemos qué será.

(2018/04/14)

Leer artículo completo

Builder pattern

Estos últimos días he trabajado bastante con el patrón Builder, así que toca escribir algo sobre su utilidad para la creación de objetos complicados.

(2018/04/02)

Leer artículo completo

Test doubles (1)

Estaba pensando en comenzar el artículo con la manida metáfora de los test doubles como especialistas de cine, los que doblan a los actores en ciertas escenas, no necesariamente peligrosas. Pero cuando más vueltas le doy, menos claro tengo que sea un buen símil.

(2018/03/22)

Leer artículo completo

Manejar excepciones

Las excepciones son elementos del lenguaje que nos permiten indicar situaciones que rompen el flujo normal de un programa. Cuando se lanza una excepción, ésta asciende la pila de llamadas del lenguaje hasta encontrar algún punto en que sea gestionada. Si no lo encuentra, el flujo del programa se detiene y se muestra un error.

(2018/02/22)

Leer artículo completo

Clean Validation

La validación es el proceso mediante el cual nos aseguramos de que los datos introducidos al sistema cumplen ciertas condiciones necesarias para poder utilizarlos sin peligro, sin provocar errores, y con la posibilidad de proporcionar resultados, al mantenerse dentro de los límites de tolerancia de los algoritmos que los emplean.

(2018/01/28)

Leer artículo completo

Código mentiroso

En esencia, el código mentiroso es todo código que dice que hace algo, pero en realidad no lo hace, o hace algo diferente, o desvía nuestra atención de algo que deberíamos saber.

(2018/01/07)

Leer artículo completo

Ejercicio de refactor (2) Extraer hasta la última gota

Una vez que hemos conseguido describir con tests el comportamiento del método que nos interesa, llega el momento de refactorizar. Queremos cambiar la implementación, pero no alterar el comportamiento público del método. Por lo tanto, los tests han de permanecer en verde tras cada cambio, procurando que la fase roja dure lo menos posible, lo que implica realizar baby-steps y no grandes refactors de una sentada.

(2017/12/17)

Leer artículo completo

TDD en PHP. Un ejemplo con colecciones (2)

Ahora que tenemos una clase Collection a la que podemos añadir objetos de un tipo determinado o sus descendientes, vamos a desarrollar algo de comportamiento. Al fin y al cabo, queremos nuestras colecciones para hacer algo con sus elementos, no solo para admirarlas… (ejem!).

(2017/11/21)

Leer artículo completo

Consistencia de objetos

El último artículo me dejó con un poco de mal sabor de boca porque la solución propuesta al problema de tratar casos especiales en una colección de objetos que estábamos construyendo a partir de datos obtenidos de una API externa cojea en algún punto.

(2017/11/12)

Leer artículo completo

Modernizando el legacy

Hace unos días trabajamos en una de esas historias que mola porque puedes reducir un poco de legacy code y refactorizar, contribuyendo a mejorar la calidad del código y su extensibilidad futura.

(2017/10/01)

Leer artículo completo

Presenter pattern

Existen una serie de patrones de diseño de sóftware básicos, pero nada nos impide crear nuevos patrones a partir de alguno de los clásicos, con el fin de adaptarlos a situaciones más específicas. Sencillamente, son patrones menos generales.

(2017/09/01)

Leer artículo completo

Katando PHPSpec 4

En las entregas anteriores de la serie he tratado de explicar cómo hacer TDD usando PHPSpec. En esta última, voy a mostrar cómo dar un “salto” en el desarrollo, usando los test existentes como protección.

(2017/05/29)

Leer artículo completo

Katando PHPSpec 3

En esta tercera entrega, vamos a examinar cómo los nuevos requisitos nos pueden llevar a refactorizar una solución existente y discutiremos lo que define la sobreingeniería.

(2017/05/26)

Leer artículo completo

Sirviendo API rest (1)

Voy a hacer un ejemplo de controlador que responde a peticiones por API Rest distribuido en varias entregas. Me voy a limitar a lo más básico y en futuros artículos iré añadiendo los elementos de seguridad, etc. En la primera parte, quiero centrarme en la parte de diseño.

(2017/05/14)

Leer artículo completo

API rest

Las API REST permiten a aplicaciones, servicios y capas de aplicación comunicarse entre sí, independientemente de las tecnologías subyacentes.

(2017/05/09)

Leer artículo completo

Experimentos con read-model

En los últimos días he estado trabajando ya en módulos específicos de la aplicación. En concreto la parte del CMS por ser la más visible y conceptualmente bastante sencilla. Así puedo hacer algunos experimentos interesantes en la separación de responsabilidades entre capas.

(2017/04/23)

Leer artículo completo

Empezando con Doctrine DBAL

Cuando hablamos de Doctrine casi siempre pensamos en su ORM. Sin embargo, su capa de acceso a la base de datos es una gran herramienta poco conocida, de la que hay poca información aparte de la documentación oficial.

(2017/04/06)

Leer artículo completo

Commits, tags y branches en git

Trabajar de forma individual hace que, a veces, descuides aspectos del flujo de trabajo que son cruciales en equipos. Uno de estos aspectos es la gestión de versiones y la ramificación de proyectos.

(2017/03/27)

Leer artículo completo

Cadena de responsabilidad

El patrón Cadena de Responsabilidad (Chain of Responsibility) nos permite manejar una petición que puede ser atendida por varios objetos, sin saber a priori cuál de ellos lo hará.

(2016/12/05)

Leer artículo completo

Los principios SOLID

Los principios SOLID son cinco principios en el diseño orientado a objetos compilados por Robert C. Martin, aunque quien primero se refirió a ellos con este nombre fue Michael Feathers. Martin los tomó como base para sus trabajos “Clean Code” y “Clean Architecture” y les dio la formulación más conocida.

(2016/11/29)

Leer artículo completo

Polimorfismo y extensibilidad de objetos

En Programación Orientada a Objetos el polimorfismo es una característica que nos permite enviar el mismo mensaje, desde el punto de vista sintáctico, a distintos objetos para que cada uno de ellos lo realice con un comportamiento específico.

(2016/11/29)

Leer artículo completo