La refractorización

El concepto de refactorización

La refactorización (refactoring) tiene como objetivo la restructuración del código fuente, de forma que cambia lo escrito por nuevo código pero sin cambiar ningún aspecto de su funcionabilidad.

Esto nos ayudara a mantener una estructura eficiente a la hora de crear métodos, instanciar atributos etc.

Lógicamente, este cambio solo busca que el código resultante sea mejor, más legible y menos complejo.

Los entornos de desarrollo disponen de  soporte automatizado para la refactorización de nuestras aplicaciones.

Cuando aplicamos bien la refactorización se pueden resolver errores ocultos y vulnerabilidades en el sistema mediante la simplificación de la lógica y la eliminación de niveles innecesarios de complejidad. Pero debemos tener en cuenta que una refactorización mal aplicada, puede ocasionar que la funcionalidad cambie y/o introducir nuevos errores.

Veamos un ejemplo de cómo nos puede ayudar la refactorización:

Código sin refactorizar

Código refactorizado

En el ejemplo de código anterior, vemos como al aplicar la refactorización, se ha implementado un nuevo método, donde se han puesto las impresiones por consola con el println. Esto hace que el código este más ordenado y sea mas fácil de enterder.

Es un error común entre los programadores, pensar que menor numero de líneas, más optimo será el código. Y, nada mas lejos de la realidad, el código para ser optimo también debe estar bien estructurado, fácil de leer y además están correctamente documentado.

Este apéndice describe las reglas básicas de sintaxis de Java.
Guía de sintaxis del lenguaje Java https://www.mhe.es/universidad/informatica/8448132904/archivos/general_apendice3.pdf

Algunas de estas técnicas no se pueden aplicar a determinados lenguajes porque se asocian a la naturaleza propia de estos. Por ejemplo, a un lenguaje que no sea orientado a objetos no se le pueden efectuar técnicas aplicadas a las clases.

Puedes descargarte más ejemplos con ejercicios resueltos de refactoring de este enlace.
http://www.iwt2.org/alfresco/d/a/workspace/SpacesStore/50b15165-c473-4146-b77e-605be196011d/Tema%202.%20Ejercicios%20refactorizaci%C3%B3n%20resueltos.pdf?guest=true

La mayoría de los IDE proporcionan soporte para algunas de las refactorizaciones. Estas herramientas podremos encontrarlas al seleccionar “Refactor” en el menú correspondiente y el IDE pedirá detalles adicionales, por lo general con los parámetros por defecto, y ofrecerá una vista previa de los cambios en el código.

Algunas de las técnicas más comunes de refactorización son:

Mejora de nombres y ubicación de código

  • Mover a otra clase o a un archivo fuente más apropiado.
  • Cambiar el nombre de un método o atributo
  • En la programación orientada a objetos mover los métodos entre la herencia.

Bloques de código más lógicos

  • Generar bloques de código que presenten la codificación mas clara.
  • Cambiar el código entre diferentes clases.
  • Simplificar métodos para tener una mejor estructura del código.

Catalog of refactorings
Este catálogo incluye las refactorizaciones descritas en el libro sobre refactorización del autor Martin Fowler. https://refactoring.com/catalog/

Herramientas de desarrollo

Los IDE como NetBeans y Eclipse tienen implantadas las opciones de refactorización más utilizadas.


Opciones de refactorización en Eclipse

Opciones de refactorización en Eclipse

 

A continuación describimos algunas de ellas. Ten en cuenta que, dependiendo de la versión o el IDE, pueden estar situadas en diferentes lugares del menú de Refactorización.

Rename
Con esta opción podemos cambiar el nombre a cualquier elemento, tanto variables, métodos, clases, paquetes, ficheros, etc.

Lo importante de poder renombrar los elementos, no solo esta en que si cambiamos un nombre lo efectúe en el código abierto en el editor, lo cual ya resulta útil, sino que lo hará en todo el proyecto. De tal modo que si cambiamos el nombre de un método de una clase, la llamada a este será modificada en todos los archivos fuente de nuestra aplicación.

Move
Para mover elementos como métodos o clase, a otro ámbito de la misma aplicación. Así todas las llamadas a esos objetos serán modificados con la nueva ruta.

Copy
Esta opción permite copiar la clase a otro paquete del proyecto. Nos da la opción de cambiar el nombre cuando realizamos la copia.

Safety delete
Esta opción permite borrar el objeto y comprueba si hay referencias en algún elemento de código. Si lo hay lo elimina automáticamente si no hay otro código haga referencia a este.

Inline
Con este método podemos juntar y simplificar llamadas o sentencias que estén en varias líneas a una sola.

Change method parameters
Esta opción permite añadir parámetros a un método y cambiar el modificador de acceso.

Pull up
Cuando se trabaja con clases y superclases la refactorización pull up es muy útil. Esta opción permite mover los miembros y métodos de una subclase hacia arriba a la superclase.

Pull down
Al trabajar con clases y superclases la refactorización pull down es muy útil. Esta opción permite mover los miembros y métodos de una superclase hacia abajo a la subclase.

Extract interface
La refactorización extract interface permite seleccionar métodos públicos no estáticos y moverlos a una interfaz independiente. Esto puede hacer que el código sea más legible y fácil de mantener.

Extract superclass
Esta refactorización funciona exactamente de la misma manera que la refactorización extract interface. Sin embargo, esta opción mueve los métodos a una nueva superclase y extiende la clase refactorizada (aquella de la que se retiraron los métodos).

Introduce
Esta refactorización nos permite incluir variables, constantes, campos, parámetros, métodos o extensiones locales de una forma controlada teniendo en cuenta todo el proyecto, de manera que podemos tener mucho más control de la acción desarrollada.