Refactoring en Español (1)

Éste es el primero de una serie de artículos con los que pretendo seguir, paso a paso, el ejemplo que Martin Fowler usa en el primer capítulo de su “Refactoring” para explicar los fundamentos de esta técnica de desarrollo que consiste en mejorar el diseño del código sin cambiar el comportamiento del mismo.

Lo primero que he hecho es copi-pegar el código del que parte el ejemplo y a continuación he escrito una batería de tests con los que pretendo capturar los requisitos del programa. Tengo todo el código, pero sólo voy a publicar los tests porque creo que lo interesante es que cada uno haga el ejercicio por su cuenta. De todos modos, si alguien está muy, muy interesado en cada uno de los pasos resueltos, que me los pida. 🙂

El primer paso consiste en probar que funcionan los tests. Si alguno no pasa es porque algo tenemos mal configurado.

A continuación, he querido poner comentarios en las clases y el método Customer.statement para darle más claridad a lo que pretendemos hacer.

Seguidamente yo he decidido quitar los warnings en la compilación (estoy usando JDK 6) para lo que he tenido que usar generics en la clase Customer (para dejar bien claro que _rental es una colección de Rental).

Y por fin llegamos al primer refactor de verdad (“Decomposing and Redistributing the Statement Method”). Yo he seguido los siguientes pasos (usando Eclipse como IDE es más fácil porque tiene ciertas ayudas muy útiles):

Decomposing and Redistributing the Statement Method

1. Colocamos el cursor sobre thisAmount en la linea donde se declara esta variable, pulsamos Ctrl+1 y elegimos “Split variable declaration”. De esta manera separamos la declaración de la asignación.

2. Movemos la asignación (thisAmount = 0) hasta después del comentario que dice:
// determine amounts for each line

3. Extraemos el método amountFor desde el comentario hasta el final del switch. Para ello seleccionamos todo ese bloque de código (incluido el comentario), pulsamos Alt+Shift+M (también podemos hacer Ctrl+1 + “Extract method”) y elegimos el nombre amountFor para el nuevo método.

4. En el método amountFor hacemos Ctrl+1 + “Join split declaration” para thisAmount.

5. Idem en el método statement (también para thisAmount).

6. Movemos el comentario “inline” al javadoc del método amountFor.

7. Cambiamos el nombre del atributo each a aRental (usando Ctrl+2).

Lo correcto es ejecutar los tests después de cada paso (si movemos comentarios, no, claro). Nos puede parecer una tontería ejecutar los tests después de un cambio tan “tonto” como los que se hacen en 4 ó 5, pero se trata de una técnica que se basa en realizar avances pequeños pero siempre con seguridad. Esta técnica nos dice que, si en algún momento pasamos de “verde a rojo” (de pasar todos los tests a que alguno falle), deshagamos los cambios y volvamos a realizarlos. SIN CONTEMPLACIONES. El fundamento de esto es claro: si hacemos un cambio sobre un código que está “en rojo” corremos el riesgo de no arreglar lo que falla e introducir nuevos errores. Por ello, lo mejor es volver “a terreno seguro” y replantearse el cambio de nuevo.

Bueno, en esta entrega hemos visto el refactor más sencillo (Extract Method) y en la siguiente entrega veremos un paso más en el ejemplo de Fowler (“Moving the Amount Calculation”) donde veremos otro refactor más complicado (Move Method) y seguiremos comprobando cómo Eclipse nos ayuda en estas tareas que, para hacerlas bien, hay que ser muy meticuloso.

Corrección:
Estaba preparando la siguiente entrega de esta serie y me he dado cuenta de que no había incluido el enlace al código y a los tests. 🙁

Tagged: