En este post te quiero contar sobre uno de mis libros favoritos de programación: Refactoring, Improving the Design of Existing Code, de Martin Fowler. Una obra fundamental que todo programador debe conocer, independientemente de la tecnología con la que trabaje.
Este libro lo tengo en inglés y mi review va a ser sobre esa versión. Desconozco si hay una versión en español de este libro.
Te dejo un enlace de afiliado de Amazon para que puedas ver el precio de este libro online.
Contenido
¿Quién es Martin Fowler?
Martin Fowler es una eminencia en el mundo de la programación. Es desarrollador, autor y conferencista. Su especialidad es la programación y el diseño orientado a objetos, junto a la implementación de las metodologías ágiles.
Fowler fue uno de los firmantes del Manifiesto Ágil, junto a otros reconocidos desarrolladores como Kent Beck y Robert C. Martin.
Martin Fowler ha realizado muchas contribuciones al mundo de la programación, especialmente a la programación orientada a objetos. Escribió reconocidas obras como Analysis Patterns: Reusable Object Models y UML Distilled: A Brief Guide to the Standard Object Modeling Language.
Otro de sus grandes aportes fue el libro Refactoring, Improving the Design of Existing Code, que es el libro del que te quiero contar en este artículo.
¿Qué es la refactorización?
La refactorización consiste en mejorar el código que ya existe y ya funciona, con el objeto de mejorar su diseño y legibilidad.
Este concepto apareció en los círculos de desarrolladores de Smalltalk, el lenguaje orientado a objetos más puro. Pronto saltó a otros lenguajes y con el tiempo, se convirtió en una idea fundamental en cualquier lenguaje de programación.
Lo más importante que tenés que tener en cuenta cuando se habla de refactorización es que esta consiste en mejorar el código pero sin cambiar el resultado final de este.
La idea detrás, como te adelantaba antes, es mejorar la legibilidad y facilitar el mantenimiento a futuro. Se puede reducir la complejidad del código a través de la refactorización, pero no lo asocies con mejora de rendimiento. Eso no es refactorización en sí mismo.
Como ocurrió con los patrones de diseño, los pioneros en estos conceptos fueron descubriendo estructuras que se repetían. Así fue como dieron con soluciones probadas a problemas comunes.
Del mismo modo que los patrones, pareció útil tener un catálogo de todos estos problemas con sus soluciones. De eso se trata Refactoring, de Martin Fowler.
El libro Refactoring
Refactoring no es un libro clásico de programación donde uno va leyendo. Solo los primeros capítulos son lineales. Luego, se trata de un catálogo de refactorizaciones más comunes.
Por cada una de estas técnicas, verás en qué casos se aplican y la secuencia de pasos que debes seguir adelante para implementar la refactorización.
Los ejemplos son detallados y paso a paso. Esto hace que se repita bastante código, ya que Fowler te va mostrando cómo va quedando el código en cada paso (al menos las partes que modifica).
En total hay más de 60 técnicas de refactorización distintas. Algunas son triviales y otras, complejas. Hay un grupo que son de uso diario y otras que pueden ser útiles solo ocasionalmente.
¿En qué lenguaje están los ejemplos?
Seguramente te estés preguntando en qué lenguaje de programación están escritos los ejemplos de Refactoring. Para sorpresa (y decepción) de muchos, en la segunda edición de este libro, que es de 2019, Fowler decidió escribir los ejemplos de Refactoring en JavaScript.
Esta decisión está claramente asociada a la popularidad de JavaScript como lenguaje de programación y a su extensión en navegadores y servidores. Puede sonar un poco raro, teniendo en cuenta que JavaScript no es un lenguaje de programación orientado a objetos como Java o C++.
JavaScript está orientado a prototipos, pero permite aplicar muchas de las técnicas de orientación de objetos, aunque es bueno aclarar que solo algunas de las técnicas de refactorización están estrechamente ligadas con este paradigma.
Comienzo con un ejemplo práctico
El primer capítulo es un ejemplo de refactorización para que veas todo lo que las técnicas del libro pueden hacer.
La temática elegida para este primer ejemplo me parece una elección desafortunada por parte del autor. Se trata de una compañía teatral que hace obras de teatro en diferentes lugares y no solo cobra por presentación, sino que también ofrece créditos a los clientes.
No sé, me da la sensación de que podría haber pensado un ejemplo más familiar para el lector.
A lo largo de las páginas de este primer capítulo, Fowler hace una refactorización completa aplicando diferentes técnicas que luego aparecen en el catálogo. Más allá de que el ejemplo no me pareció el mejor, la idea principal se entiende.
Un poco de teoría
El segundo capítulo del libro es sobre Principios de Refactorización. Aquí hay una introducción teórica. ¿Qué es refactorizar? ¿Por qué es necesario refactorizar? y ¿Cuándo hay que refactorizar?
Pero también aborda los problemas que trae aparejada la refactorización.
Hay algo que me parece importante destacar de este capítulo. Fowler se detiene en el vínculo entre refactorización y la mejora de performance. Para que quede claro que no es lo mismo, pone de ejemplo cómo a veces introduce cambios en el código que empeoran el rendimiento, pero para mejorar su legibilidad y la mantenibilidad.
Código que apesta
El tercer capítulo del libro, que tiene la colaboración de Kent Beck, trata sobre los bad smells en el código, es decir, los malos olores. Se refiere a todo aquello que no se ve del todo bien en el código y que, de algún modo, sabemos que puede ser mejorado.
Los bad smells son conocidos por los programadores: funciones muy largas, nombres de variables o clases raros, código duplicado, funciones que reciben 20 parámetros, variables globales, mutabilidad y muchas otras.
Este capítulo es excelente porque te deja una lista completa de todos estos potenciales problemas y además, te dice con qué técnica de refactorización se pueden resolver.
No hay código de programación en esta parte porque no es realmente necesario.
El testing como guardaespaldas
La refactorización es riesgosa. Tocás algo mal y se rompe todo. Fowler insiste en que no se puede refactorizar sin tener una batería de pruebas automatizadas de fondo que continuamente chequeen que no hemos roto la interfaz de aquello que estamos modificando.
En este cuarto capítulo, te muestra cómo construir tests con un ejemplo, pero no entra en tanto detalle.
El catálogo de refactorizaciones
El capítulo 5 introduce el catálogo de refactorizaciones y a partir del capítulo 6 tenemos los primeros grupos.
No te voy a nombrar todos, pero los primeros que aparecen son Extract Function, Inline Function, Extract Variable, Inline Variable, Rename Variable, entre otros. Estos son bastante útiles y de uso habitual. Quizás los hayas aplicado sin darte cuenta.
En el siguiente capítulo aparecen refactorizaciones vinculadas con la encapsulación como Encapsulate Record, Encapsulate Collection, Extract Class y Remove Middle Man, entre otros más.
El capítulo 8 trata sobre mover código de lugar con refactorizaciones como Move Function, Move Field, Split Loop y Remove Dead Code.
El capítulo 9 es sobre cómo organizar información. Aparecen aquí Split Variable, Rename Field, Change Reference to Value y Change Value to Reference.
A continuación, cómo simplificar lógica condicional: Decompose Conditional, Consolidate Conditional Expression y Replace Conditional with Polymorphism, entre otros.
El capítulo 11 es sobre cómo refactorizar APIs. Aparecen aquí Parameterize Function, Remove Flag Argument, Replace Query with Parameter y su opuesto, Replace Parameter with Query. A estas técnicas, se le suman varias más.
El último capítulo es sobre cómo manejar la herencia. Aparecen refactorizaciones como Pull Up Method, Pull Up Field, Push Down Method, Push Down Field, Replace Type Code with Subclasses, etc.
¿Qué hay que saber para poder comprender Refactoring?
Para los refactors básicos, alcanza con saber programación estructurada.
Luego, para las refactorizaciones más objetosas, tenés que saber programación orientada a objetos. Suma tener conocimientos de patrones de diseño y de diseño orientado a objetos. Si alguna vez viste algo de UML, mejor.
Hay que comprender el concepto de abstracción y encapsulamiento. Sumado a eso, tener bien en claro composición y herencia. Yo creo que con eso ya estás para comprender todo el libro.
¿Seguir a Fowler al pie de la letra?
Las explicaciones de Martin Fowler son muy detalladas. Siempre vas a ir viendo qué partes del código cambian. Sin embargo, en mi opinión, al usar Git, Fowler abusa del commit. Commitea por cada cambio menor que hace. Yo entiendo la idea detrás, pero parece una práctica difícil de llevar adelante en la práctica diaria.
Algunos programadores critican Refactoring por este tipo de aspectos. También por la mecánica misma que propone Fowler para implementar cada una de sus técnicas.
Cuando leas el libro, es probable que descubras que venías aplicando una refactorización sin siquiera saberlo. Aunque tal vez, no realizaras los pasos tal cual los describe el autor. Algunos cuestionan esta sobre teorización e intento de parametrización de aspectos cotidianos de la programación.
¿Por qué es tan importante Refactoring?
Porque las tecnologías pasan, los programadores también, pero estas técnicas se siguen usando. Son básicas.
Actualmente, cualquier IDE puede implementar las refactorizaciones más básicas. Incluso, alguna inteligencia artificial puede llegar a ejecutarl las más complejas. Sin embargo, el programador tiene que conocer qué es lo que está sucediendo en el código cuando se le da al botón Refactorizar.
Por otro lado y, más allá de lo profesional, refactorizar código es algo sumamente divertido. Personalmente, es de lo que más disfruto hacer cuando programo. Siempre, claro está, con una buena suite de pruebas de respaldo.
Más reviews en Crónicas Freelancer
Espero que este artículo te haya gustado. Descubrí más reviews de libros de programación, productividad y otros temas en la sección de libros de Crónicas Freelancer.
Si tenés alguna duda o querés hacer algún aporte, dejame un comentario.
Si estás buscando hosting, te recomiendo Digital Ocean. Seguí este enlace para obtener US$ 200 de crédito para usar en un periodo de 60 días.
Te invito a que me sigas en las redes: LinkedIn, X, GitHub e Instagram. También estoy en CodeWars, plataforma que te recomiendo para practicar ejercicios de programación.
Eso es todo. Muchas gracias por tomarte el tiempo de leerme.
Hasta la próxima.