La Refactorización es una técnica de la Ingeniería de Software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo. Esta técnica permite que el código sea legible, mantenible y ampliable.
La clase MostrarCuadrados, que se presentó en el post anterior Arreglo de Cuadrados, tiene un método imprimirCuadrados(Cuadrado[] cuadrados) el cual recibe un parámetro que es una arreglo de objetos de tipo Cuadrado e imprime los datos de todos los cuadrados. La misma clase MostrarCuadrados lo presentamos aquí para recordar su implementación.
package com.sistemajava; public class MostrarCuadrados { public static void main(String[] args) { Cuadrado[] cuadrados = new Cuadrado[3]; cuadrados[0] = new Cuadrado(); cuadrados[1] = new Cuadrado(10); cuadrados[2] = new Cuadrado(20); imprimirCuadrados(cuadrados); } private static void imprimirCuadrados(Cuadrado[] cuadrados) { int numero = 0; for(Cuadrado cuadrado : cuadrados){ System.out.println("Datos del Cuadrado " + ++numero); System.out.println("===================="); System.out.println("Valor del lado: " + cuadrado.getLado()); System.out.println("Valor del área: " + cuadrado.calcularArea()); System.out.println("Valor del perimetro: " + cuadrado.calcularPerimetro()); System.out.println("Valor de la diagonal: " + cuadrado.calcularDiagonal()); System.out.println(); } } }
El método tiene un problema, está mezclando dos tareas. La primera tarea es recorrer la estructura de datos que almacena los objetos Cuadrado, en este caso un arreglo de cuadrados. Y la segunda tarea es imprimir los datos de cada objeto Cuadrado. El problema se da porque si un método mezcla dos o más tareas en su lógica se puede incrementar la complejidad y hacer más difícil las pruebas, los cambios y la reutilización. Por ejemplo, si necesitamos modificar la forma en cómo debemos recorrer el arreglo de cuadrados tendríamos que ir al método imprimirCuadrados(Cuadrado[] cuadrados); por otra parte, si necesitáramos modificar la forma de imprimir los datos de cada objeto Cuadrado también tendríamos que ir al método imprimirCuadrados(Cuadrado[] cuadrados). Por lo tanto, estaríamos modificando el método por dos razones lo cual no es conveniente porque dificulta el mantenimiento debido a que se tiene mezclado dos tipos de lógica, así mismo dificultaría también las pruebas porque se corre el riesgo de modificar o alterar otras partes del código que ya funcionan bien y dejar bugs o defectos.
Para solucionar el problema, la clase MostrarCuadrados se ha refactorizado en base a una técnica llamada introducir método. Para aplicar esta técnica se debe extraer una parte de código de un método ya existente y llevarlo a un nuevo método. En la clase MostrarCuadrados se ha seleccionado dos partes del código del método imprimirCuadrados(Cuadrado[] cuadrados), la primera parte corresponde a la impresión del encabezado o título del objeto Cuadrado que se encuentra al iniciar el bucle for, y la segunda parte corresponde a la impresión de los datos de cada objeto Cuadrado. Por tanto, se crearon dos métodos: el método imprimirTitulo(int numero) y el método imprimirCuadrado(Cuadrado cuadrado); estos dos nuevos métodos son llamados desde el método imprimirCuadrados(Cuadrado[] cuadrados).
A continuación se muestra la clase MostrarCuadrados con el cambio en el método imprimirCuadrados y los nuevos métodos insertados producto de la refactorización de la clase.
package com.sistemajava; public class MostrarCuadrados { public static void main(String[] args) { Cuadrado[] cuadrados = new Cuadrado[3]; cuadrados[0] = new Cuadrado(); cuadrados[1] = new Cuadrado(10); cuadrados[2] = new Cuadrado(20); imprimirCuadrados(cuadrados); } private static void imprimirCuadrados(Cuadrado[] cuadrados) { int numero = 0; for(Cuadrado cuadrado : cuadrados){ numero++; imprimirTitulo(numero); imprimirCuadrado(cuadrado); System.out.println(); } } private static void imprimirTitulo(int numero) { System.out.println("Datos del Cuadrado " + numero); System.out.println("===================="); } private static void imprimirCuadrado(Cuadrado cuadrado) { System.out.println("Valor del lado: " + cuadrado.getLado()); System.out.println("Valor del área: " + cuadrado.calcularArea()); System.out.println("Valor del perimetro: " + cuadrado.calcularPerimetro()); System.out.println("Valor de la diagonal: " + cuadrado.calcularDiagonal()); } }
En consecuencia, ahora cada método de la clase hace cumplir una tarea o única lógica. Por ejemplo, si necesitamos modificar la forma de imprimir los datos de un objeto Cuadrado, iremos directamente al método imprimirCuadrado(Cuadrado cuadrado) que no mezcla lógica con la forma de recorrer el arreglo de cuadrados, lo cual hace más simple el cambio.
Interesante; al refactorizar estamos consiguiendo cohesión en los módulos. Muy cierto lo del mantenimiento. Saludos
ResponderEliminarGracias