En esta ocasión repasamos otro libro clásico para cualquier programador, principalmente de lenguajes orientados a objetos: “Refactoring, improving the design of existing code” de Martin Fowler. Forma parte de una serie de libros sobre ingeniería del software surgidos a finales de los años 90 y que sientan las bases de lo que hoy en día define, o debería definir, a la profesión de desarrollador.
El libro se centra en explicar un concepto que se ha venido haciendo a lo largo de las décadas de programación de un modo informal: la refactorización. Refactorizar es un concepto interesante: consiste en mejorar el código poco a poco. Me gusta definirlo con una frase que aparece en el libro: así como con el tiempo el software se deteriora poco a poco, la refactorización debería mejorar el código poco a poco, sin realizar grandes cambios.
Cuando uno tiene entre sus manos un programa que no está en muy buenas condiciones, lo primero que desea es rehacerlo todo desde cero. Esto no es ni una posición realista, porque no se suele poder asumir el coste de una demolición y posterior construcción, ni respetuosa con los que lo programaron: no solemos saber las circunstancias en las que fue hecho ni los condicionantes de las decisiones. Frente a este deseo de rehacer todo surge el concepto de refactorización, que anima a ir cambiando el código a pasos pequeños y seguros.
Este libro está dividido en cuatro partes:
- En primer lugar tenemos una introducción práctica al concepto de refactorización a través de un ejemplo con código.
- La segunda parte nos presenta una explicación más formal del concepto de refactorización, decorado con un capítulo de Kent Beck sobre “Bad Smells” de código y algunas nociones de testing.
- La tercera parte, que es un extenso catálogo formal de refactorizaciones.
- El libro finaliza con la colaboración de firmas invitadas que cuentan su experiencia con la refactorización
El catálogo de refactorizaciones es amplio y pormenorizado, pero… si eres un programador experimentado y especialmente has tenido la oportunidad de trabajar en un lenguaje orientado a objetos como Smalltalk o Java es probable que la mayoría de ellos te sean familiares. Así que valga esta advertencia por delante por si lo adquieres y te sientes algo decepcionado. De hecho puedes echar un vistazo a una versión resumida en las explicaciones, que no en el número, en la propia página que Martin Fowler ha hecho del libro: http://refactoring.com/catalog/
No obstante para mí no ha supuesto ninguna decepción: es un libro de 1999 que ha sido la referencia para construir lo que sabemos hoy en día, de modo que sus enseñanzas se han adoptado por el folklore popular de los desarrolladores a lo largo de los años. Prueba de ello es que las “herramientas” de refactorización que incluyen los IDE de hoy en día (Eclipse, IntelliJ, Netbeans…), tienen como base las propuestas por este libro. Por ello, bajo mi punto de vista, el catálogo de refactorizaciones adquiere mayor valor incluso: es el origen de las técnicas que hemos interiorizado hoy en día, informándonos además de los porqués, razonando el mecanismo y mostrando ejemplos muy claros.
Regresando al contenido del libro estrictamente, el autor organiza las refactorizaciones en grupos temáticos, mostrando por cada una de ellas una introducción con la motivación de la refactorización y ejemplos escritos en Java (1.1. y 1.2 aunque no es problema) en los que paso a paso, de manera minuciosa, explica la mecánica de cada refactorización. Enumero a continuación los grupos y algunas refactorizaciones relevantes (los puedes consultar en http://refactoring.com/catalog/):
Composing Methods
Extracción de métodos, cambio de variables temporales por expresiones; introducción de variable con nombres explicativos o sustitución de métodos por objetos entre otros.
Moving Features Between Objects
Intercambio de miembros y atributos entre clases por traslado de responsabilidades; eliminación de clases innecesarias o añadir clases inline.
Organizing Data
Encapsulación; una introducción a lo que fueron posteriormente los tipos enums de Java 1.5; introducción de constantes por números mágicos; cambio en la cardinalidad de las asociaciones
Simplifying Conditional Expressions
Descomposición de sentencias condicionales; variables booleanas de tipo flag para bucles; el patrón de objeto nulo; uso de polimorfismo para condicional…
Making method calls simpler
Renombrado de métodos; variaciones en los parámetros de los métodos; sustitución de parámetros por objetos; introducción de excepciones
Dealing with Generalization
Movimientos de métodos y campos entre los miembros de las jerarquías; extracción de clases y de interfaces; aplanamiento de jerarquías; sustitución de herencia por delegación y viceversa…
Big Refactorings
Dedicado a algunos (escasos) ejemplos de refactorización a un nivel mayor de diseño: extracción de jerarquías, separación con MVC o cambio de diseño procedimental a orientado a objetos.
Adicionalmente cabe destacar las firmas invitadas, especialmente Kent Beck y William Opdyke. que colaboran en ciertos capítulos para dar todavía más credibilidad a la técnica propuesta por Fowler. En el primer caso con un magnífico capítulo de Bad Smells in Code de Beck, así como las influencias en el capítulo de Testing, vital para refactorizar con seguridad; y en el segundo caso con una extensa reflexión sobre el uso de la técnica de refactorización en el mundo real por Opdyke, autor de la primera tesis doctoral sobre refactorización.
En definitiva es una obra clásica para el mundo de la programación orientada a objetos que merece la pena leer y tenerla en formato papel en la estantería como referencia para volver a revisitarla de vez en cuando (además es de tapa dura con marcapáginas, como los libros importantes). Si bien es posible, que si eres un programador experimentado y con curiosidad por las técnicas de programación, no te aporte gran cosa, lo que es signo de haber topado con uno de los cimientos sobre los que se basan el resto de obras y prácticas actuales.
Puedes comprarlo en Amazon.es pinchando en la portada: