Ir al contenido principal

Refactorización de la Clase MostrarCuadrados


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.

Comentarios

  1. Interesante; al refactorizar estamos consiguiendo cohesión en los módulos. Muy cierto lo del mantenimiento. Saludos
    Gracias

    ResponderEliminar

Publicar un comentario

Gracias por tus comentarios

Entradas populares de este blog

Manejo de fechas en Java 8 con LocalDate

En el programa desarrollado y mostrado en esta oportunidad, se han usado tres clases de la biblioteca de Java 8: la clase  java.time.Period  que sirve para determinar rangos como el total de años entre dos fechas, la clase  java.time.format.DateTimeFormatter  que sirve para dar diversos formatos a la fecha, y principalmente la clase  java.time. LocalDate   que es un objeto de fecha y hora inmutable que representa una fecha, a menudo visto como año-mes-día, además permite realizar de forma simple diversas operaciones de fecha.

Calendario en Java con GregorianCalendar

En el programa desarrollado y mostrado en esta oportunidad, se han usado tres clases de la biblioteca de Java: la clase  java.util.Date  que sirve para crear una fecha actual del sistema, la clase  java.text.DateFormat  que sirve para dar formato a la fecha, y principalmente la clase  java.util. GregorianCalendar   que sirve para manipular fechas.

Formato de fechas en Java con SimpleDateFormat

En el programa desarrollado y mostrado en esta oportunidad, se han usado dos clases de la biblioteca de Java: la clase  java.util.Date  que sirve para crear una fecha actual del sistema, y la clase  java.text.SimpleDateFormat  que sirve para dar diversos formatos de impresión a la fecha.