El término Refactoring es un término muy conocido en estos tiempos y consiste en modificar la estructura del código sin alterar su funcionalidad.
Si tu código quieres limpiar refactoring tendrás que realizar
Tomando como base una de las reglas de los Scout “Intenta y deja el mundo un poco mejor que como lo encontraste”, es una buena práctica dejar el código mejor de lo que lo conseguiste. Si te toca modificar un método y te parece imposible añadir un if adicional, no importa que tú no seas el autor de dicho método, marca la diferencia y haz de ese código un código mejor, sé un buen “programmer scout”. Recordemos que el código legacy lo escribimos nosotros mismos, si la aplicación requiere de un refactoring global, y por temas de tiempo y/o presupuesto no podemos realizar una reestructuración completa del código, entonces podemos día a día sumar un grano de arena mejorando el código que vayamos modificando.
Podemos considerar el refactoring como un proceso de cambio, a medida que leamos este artículo podremos ir observando que las técnicas para refactorizar son simples, pero que en conjunto pueden representar mejoras significativas en nuestro código.
Los IDE traen opciones de refactoring, a continuación describiré algunas técnicas que puedes utilizar en tu código para mejorarlo:
Extraer Método
Si estás en presencia de un método muy extenso es una señal que invita a pensar que este método está haciendo más de lo que debe, por qué no separarlo en pequeños métodos encargados cada uno de realizar una única cosa.
He aquí un ejemplo
Este y los demás ejemplos están escritos en Java usando el IDE Eclipse, si tú utilizas otro lenguaje de programación o algún otro IDE, allí encontrarás opciones similares con el mismo propósito.
Supongamos que tenemos un método escrito en java que detecta los números pares e impares, cuando detecta un número par notificará vía correo electrónico el resultado.
Si extraemos las líneas de código que se encargan del envío de correo a un método diferente estamos haciendo de este código un código mejor.
Para ello seleccionamos las líneas que vamos a extraer y aplicamos la opción Refactor/Extract Method.
En esta opción puedes especificar el nombre del método que quieres extraer, trata siempre de que el nombre exprese su responsabilidad. De esta manera, el código lucirá así:
Cuando posteriormente algún otro compañero realice algún cambio en el proceso de envío de email, ya podrá enfocarse únicamente en el método sendEmail()
Extraer Clase
Si tenemos una clase con poca cohesión, (los elementos de la clase no están fuertemente relacionados), es una señal de que debemos extraer una nueva clase que represente un único concepto del dominio del problema. Como ejemplo miremos este extracto de clase:
Si extraemos los campos street, avenue, postCode, apartmentNumber, floor a una nueva clase llamada Address, logramos mayor cohesión de la clase Person.
Para ello nos situamos en la clase Person y con el botón derecho usamos la opción Refactor/Extract Class.
Seguido de esto tenemos una clase más cohesiva
Extraer SuperClase
Si tienes varias clases y entre ellas puedes realizar una relación de herencia es tiempo de utilizar esta técnica de refactoring llamada “Extraer superclase”
Como ejemplo supongamos que tenemos el conjunto de clases:
Podemos extraer una superclase llamada Shape usando esta opción Refactor/Extract Class
En la ventana que se abrirá podemos escribir el nombre de la superclase y adicionalmente definir la acción que se realizará con el método (“extraer” o “declararlo como abstracto”) en este caso nos interesa “declararlo como abstracto”.
Ahora la clase Rectangle lucirá así:
En las clases Square y Circle podemos colocar explícitamente “extends Shape”.
Introduce Parameter Object
Si tenemos un método que recibe muchos parámetros, pudiéramos entonces necesitar introducir un objeto que encapsule los parámetros que están relacionados, de esta forma el método será más fácil de mantener.
Como ejemplo volvamos a la clase Person, esta vez con más parámetros.
El constructor sería algo como esto:
Si seleccionamos el constructor y aplicamos el refactoring Refactor/Introduce Parameter Object, podemos introducir un nuevo parámetro que encapsule los datos de contacto de esa persona.
Podemos llamar a la clase ContactData y al nombre del parámetro contactInfo. Adicionalmente podemos marcar la opción “Create getters” para que el IDE genere los métodos get por cada propiedad.
El constructor quedaría de esta manera:
Y ahora, a concluir
Cuando pienses en refactorizar, piensa en mejorar: Refactorizar => Mejorar.
Si en el camino de la mejora encuentras mucha dificultad, comienza con pequeños refactor, tomando en cuenta lo que llamamos los baby steps.
¡Anímate!, y contribuye a que tu código sea un código mejor.