Refactorización

La refactorización es una técnica de ingeniería de software para organizar el código de una forma más eficiente y fácil de entender, de tal forma que si estamos trabajando con más programadores y necesitan ver tu código, no les resulte complicado saber que hace tu código y pueda ser reutilizado sin complicaciones. Lo que se hace por decirlo en pocas palabras es limpiar el código.

Hay varias técnicas que vamos a ver en este ejemplo que tengo preparado:

 

Rename

Vemos que tenemos algo tan simple como una función con 2 parámetros. En este caso como el código es muy pequeño se sabe lo que está haciendo, pero cuando se tengan muchas funciones puede que ver una función llamada “f” no nos diga gran cosa y no sepamos que hace o se quiere hacer con dicha función. Lo mejor es acostumbrarnos a poner nombres correctos a las funciones y las variables, para saber qué hace exactamente.

Nos situamos sobre la función “f”, botón derecho del ratón, Refactor/Rename… y la renombramos “suma”. Así sabremos que esta función lo que hace es una suma de 2 parámetros.



Vemos que el nombre “f” cambió a “suma” también dentro de la llamada que se hace en main. Gracias a esto no tendremos que estar línea por línea cambiando “f” por “suma” sino que esto ya lo hace automáticamente en todo el fichero del código fuente. Se puede hacer lo mismo con las variables cambiando “z” por “result” (por ejemplo).

 

Introduce Method

En ocasiones tendremos un método que tiene muchas líneas, realiza más responsabilidades de las que debería hacer o simplemente no queda claro para que queremos ese método. Por ejemplo, si yo quiero que la función main sólo llame a otras funciones, podemos cambiar System.out.print por la llamada a otra función. Para eso nos situamos sobre dicha línea y vamos a Introduce/Method… para introducir una función llamada “showResult”.

Vemos entonces que el código se ha reestructurado de esta forma:

 

Encapsulate Fields

Vamos hacer algunos cambios en el código. Las variables que teníamos en main serán ahora atributos privados de la clase. Este cambio es demasiado sencillo por lo que se hace manualmente y el código lo tendríamos de esta forma.

La razón por la que hacemos esto es porque con Encapsulate Fields podemos generar automáticamente los métodos getter y setter para acceder a los atributos de la clase. Vamos a Encapsulate Fields…

Vemos los atributos de la clase y la opción de generar los getter y setter para cada uno de ellos.

Para este caso únicamente queremos los métodos setter para “x” e “y”.

 

Move Class

Vamos a crearnos la clase Operations en el mismo paquete que la clase principal (RefactoringExample). Tal vez no nos convenza tener ambas clases en la misma carpeta. Los que hacemos es crearnos el paquete operation.

Ahora vamos a Move…

Nos aparecerá lo siguiente:

Situados en la clase Operations nos aparece el nombre del proyecto (podemos mover hacia otro proyecto), la localización y el paquete al que se quiere mover la clase. Cambiamos entonces refactoringexample por refactoringexample.operation, le damos a Refactor y comprobaremos que la clase se ha movido a donde hemos indicado.

También podemos mover métodos de una clase a otra. Vamos a probar con la función “suma” para moverla de la clase principal a la clase Operations. Para ello nos situamos sobre el método, botón derecho del ratón, Refactor/Move…

Project y Location lo dejamos tal cual está (ya que no vamos a mover a otro proyecto). En Package cambiamos a refactoringexample.operation y To Class cambiará automáticamente a Operations. Le damos a Refactor y comprobaremos que se han hecho los cambios

 

Inline

Consiste en que si hay una variable que almacena un resultado, podemos eliminar obteniendo una expresión que haga exactamente lo mismo. No siempre se obtiene el resultado esperado con esta técnica, por lo que antes de finalizar la refactorización primero muestra cómo quedará el código por si no nos convence.
Creamos el método “resta” que hará justo lo que se ve en la imagen de abajo

Nos situamos sobre la variable, vamos a Refactor/Inline… y veremos lo siguiente

Vemos que elimina la variable “result” y lo sustituirá por return(x-y);

Como esto hará justo lo que queremos, le damos a Do Refactoring y comprobaremos que todo ha ido bien.

Como hemos podido ver, la refactorización nos ayuda bastante a la hora de reorganizar nuestro código. Incluso en un ejemplo tan pequeño como este, hemos podido ver algunas técnicas tan elementales como necesarias. Y aún quedan muchas más como por ejemplo:

Change Method Parameters, permite añadir o eliminar parámetros a un método y cambiar el tipo.

Safely Delete, comprueba si hay referencias a un elemento del código y lo borra si no hay dichas referencias. En caso contrario, si decidimos borrar habiendo alguna referencias se nos advertirá que habrá errores en el código una vez se haya borrado el elemento.

Copy, lo mismo que mover pero siendo copiar y pegar.

Extract Infertace, crea una interfaz de los métodos no estáticos y públicos seleccionados.

Extract Superclass, crea una clase abstracta, modifica la clase actual para que extienda de la nueva y mueve los métodos y campos a la nueva clase.

Es ir practicando y viendo si nos hace falta limpiar el código o no. Mi consejo es que se haga refactorización cada cierto tiempo ya que de otra forma se nos puede complicar mucho el código y nos puede llevar mucho tiempo en poner orden.

Un comentario en “Refactorización

Deja un comentario