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
- PaymentService que cobra al cliente.
- 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);
}
}
}