The talking bit

A blog about programming, mainly PHP, and maybe other things


Project maintained by franiglesias Hosted on GitHub Pages — Theme based on one by mattgraham

Temas

good-practices php testing blogtober19 refactoring design-principles tdd misc legacy python design-patterns bdd tools tips ddd bbdd soft-skills ruby javascript books api sql ethics swift

El falso dilema. Calidad versus velocidad

De vez en cuando me encuentro con artículos o comentarios que mencionan la idea de que, a veces, tenemos que aparcar las buenas prácticas al programar en aras a cumplir un plazo de entrega o salir a producción.

Read More

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.

Read More

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.

Read More

Value Objects con Doctrine

Como xa saberedes, os Value Objects son obxectos do dominio que representan conceptos que nos interesan polo ser valor, son inmutables, non te√Īen identidade, nin ciclo de vida.

Read More

A√Īadir una migraci√≥n Doctrine en un proyecto

Cuando llega el momento de aplicar cambios a la base de datos siempre me preocupo un poco. Como nuestro ORM y acceso a la base de datos es mediante Doctrine en Symfony utilizamos las migraciones de Doctrine para cualquier actualización del esquema.

Read More

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.

Read More

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.

Read More

Tests y excepciones

Habitualmente no usamos las excepciones en los tests. Como mucho, esperamos que la unidad bajo prueba lance una excepción y ahí se queda todo:

Read More

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.

Read More

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.

Read More

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.

Read More

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.

Read More

Blogtober 2019

Mi compa√Īera y manager en Holaluz Mavi Jim√©nez va a hacer un dibujo cada d√≠a del mes sobre una palabra propuesta en twitter. Y aqu√≠ vamos a intentar escribir un post por cada una de ellas.

Read More

Al menos uno

Un ejemplo sencillo que refleja el proceso de refinamiento iterativo que es escribir software.

Read More

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.

Read More

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.

Read More

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.

Read More

Refactor cotidiano (8). Dónde poner el conocimiento

En anteriores entregas hemos propuesto refactorizar código a Value Objects o aplicar principios como la ley de Demeter o Tell, don’t ask para mover código a un lugar más adecuado. En este capítulo vamos a analizarlo desde un punto de vista más general.

Read More

La dualidad del testing

Para ser una disciplina dedicada a que el software se comporte correctamente, lo cierto es que cuando hablamos de testing usamos el lenguaje con muy poca precisión.

Read More

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.

Read More

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.

Read More

Descuento del 50% en CodelyTV Pro con el libro

Hace unos días anunciábamos que el libro Testing y TDD para PHP estaría incluido gratis para los suscriptores de CodelyTV Pro. Ahora, además, si compras el libro tienes un 50% de descuento en el primer mes de suscripción.

Read More

Refactor cotidiano (4). Sustituye escalares por objetos

PHP viene de serie con un conjunto de tipos de datos básicos que denominamos escalares: bool, int, float, string…, que utilizamos para representar cosas y operar con ellas. La parte mala es que son tipos genéricos y, a veces, necesitaríamos algo con más significado.

Read More

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.

Read More

What the book

Después de darle vueltas a la idea una temporada hemos agrupado varios artículos del blog sobre testing en un libro.

Read More

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.

Read More

Null coalesce operator

El operador ternario comparte con null coalesce el símbolo de la interrogación, pero ahí se acaba el parecido.

Read More

La ética de las buenas prácticas (1)

La √©tica es la rama de la filosof√≠a que se ocupa del ‚Äúbuen vivir‚ÄĚ. Pero no en el sentido hedonista que podr√≠as imaginar por la expresi√≥n, sino en el sentido de la manera correcta de vivir.

Read More

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.

Read More

El drama de los objetos anémicos

Pululan por nuestras bases de código como almas en pena, transportando datos de un lugar a otro. Sin embargo, podrían dar esplendor a nuestras aplicaciones si les damos un poco de atención.

Read More

Crear y usar un canal de log en Symfony

De vez en cuando nos puede interesar disponer de un log específico para una parte concreta de una aplicación. Fundamentalmente lo que pretendemos es aislar esos mensajes para poder analizarlos con facilidad.

Read More

Cómo poner nombres

¬ŅPor qu√© raz√≥n poner nombres a las cosas se considera uno de los aspectos m√°s dif√≠ciles de la programaci√≥n?

Read More

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.

Read More

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.

Read More

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.

Read More

TDD de un validador de NIF

Hay validadores de NIF a espuertas, pero escribir uno con TDD resulta ser un interesante ejercicio con el que desarrollar algunas estrategias de test.

Read More

Sobre la expresividad del código

Al hablar de código expresivo queremos decir no solo que el código debería indicar con claridad su intención, también queremos que el código revele más cosas de sí mismo.

Read More

Uniones de tablas en SQL

Este es un artículo rescatado del olvido. Lo escribí en 2010, como forma de aprender el funcionamiento de las uniones de tablas en SQL.

Read More

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√°.

Read More

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.

Read More

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.

Read More

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.

Read More

El patrón decorador

El patrón decorador tiene como objetivo permitirnos modificar el comportamiento de un objeto en tiempo de ejecución, esto es, de manera dinámica.

Read More

Luhn Test kata en Python

Hoy voy a hacer un experimento interesante: una kata en Pyhton. Llevo una temporada jugueteando un poco con el lenguaje y he podido probar algunas cosillas.

Read More

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.

Read More

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.

Read More

Ejercicio de refactoring (4) Finalizando

En el artículo anterior quedaron pendientes algunos refactors en nuestro proyecto. En esta entrega mi intención es tratar de rematarlos, así como hacer alguna reflexión sobre los resultados obtenidos y sus consecuencias.

Read More

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.

Read More

TDD en PHP. Un ejemplo con colecciones (4)

Con lo peque√Īita que es la clase Collection y est√° dando para un mont√≥n de art√≠culos. En esta cuarta entrega voy a intentar desarrollar el m√©todo filter, el cual tambi√©n nos dar√° un punto de partida para otros m√©todos.

Read More

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!).

Read More

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.

Read More

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.

Read More

Strategy pattern

El patrón Strategy (estrategia) se basa en encapsular una familia de algoritmos de modo que sean intercambiables.

Read More

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.

Read More

Dos semanas

Ma√Īana mi√©rcoles se cumplen dos semanas de mi nueva etapa profesional.

Read More

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.

Read More

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.

Read More

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.

Read More

API rest

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

Read More

El patrón Specification del dominio a la infraestructura (3)

En las entregas anteriores hemos hablado del patrón Specification y cómo implementarlo en las diversas capas de arquitectura con la ayuda de Abstract Factory. Ahora toca ver cómo combinar Specification mediante el patrón Composite para construir especificaciones complejas a partir de otras más simples.

Read More

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.

Read More

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.

Read More

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.

Read More

Historia de una reescritura (1)

Hace unos 15 a√Īos comenc√© a escribir mi primera aplicaci√≥n seria en PHP. Esta aplicaci√≥n fue creciendo y sufriendo diversos cambios y prestaciones. Ahora ha llegado el momento de replantearla.

Read More

El patrón visitante

El patrón visitante es uno de los que más difícil me ha resultado entender y aplicar, así que voy a escribir sobre él para afianzar el concepto.

Read More

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á.

Read More

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.

Read More