Publicación: about 1 month

Clases de utilidad


Qué son

Dentro del desarrollo de software, las clases de utilidad son funciones que nos permiten encapsular código reutilizable, ya sea, para un contexto muy particular o muy general. Además, al no ser necesario la creación de una instancia, las podemos invocar desde cualquier lugar de nuestra aplicación. Generalmente, están declaradas como funciones estáticas y el nombre de la clase termina con el prefijo “Util”.

Cuando utilizarse

  • Cuando hay código duplicado
  • Cuando queremos reutilizar funcionalidades
  • Cuando queremos escapular funcionalidad especifica o general
  • Cuando queremos reducir el riesgo a errores
  • Cuando queremos aumentar la velocidad de desarrollo
  • Cuando no es necesario crear una instancia de un objeto

Cómo utilizarse

Supongamos que tenemos dos servicios

  1. PaymentService que cobra al cliente.
  2. PaymentReportService que genera reportes de pagos.

public class PaymentService {
    public void charge(double amount) {
        String formattedAmount = String.format("$%,.2f", amount);
        System.out.println("Se ha cobrado un monto de " + formattedAmount);
    }
}

public class PaymentReportService {
    public void generateReport(double[] payments) {
        for (double amount : payments) {
            String formattedAmount = String.format("$%,.2f", amount);
            System.out.println("Pago recibido: " + formattedAmount);
        }
    }
}

Uno de los dilemas más común es el nombramiento de estas clases. Las podemos organizar desde lo más especifico hasta lo más general.
 
Para entender mejor, veamos el siguiente ejemplo.

  • PaymentUtil. Más especifico, solo tendrá utilidades relacionadas a los pagos.
  • FormatUtil. Más general Enfocado en cualquier tipo de formateo (texto, números, fechas, etc.)
  • MoneyUtil. Ni muy general, ni muy especifico. Sigue enfocado en montos pero puede tener más utilidades monetarias como obtener divisas a partir de un monto.

Como recomendación empezar con el más especifico y conforme vaya creciendo nuestra aplicación nos va a orillar a refactorizar para tener utilidades más generales.

Usando una clase de utilidad en nuestro ejemplo

public class PaymentUtil {
    public static String formatAmount(double amount) {
        return ‘$’ + String.format("%,.2f", amount);
    }
}


public class PaymentService {
    public void charge(double amount) {
        String formattedAmount = PaymentUtil.formatAmount(amount);
        System.out.println("Se ha cobrado un monto de " + formattedAmount);
    }
}

public class PaymentReportService {
    public void generateReport(double[] payments) {
        for (double amount : payments) {
            String formattedAmount = PaymentUtil.formatAmount(amount);
            System.out.println("Pago recibido: " + formattedAmount);
        }
    }
}