Hace un par de meses comencé a trabajar en un nuevo proyecto, y cuando revisé el código me sorprendió la cantidad de métodos estáticos utilizados. No solo se utilizan métodos de utilidad collectionToCsvString(Collection<E> elements)
, sino también mucha lógica de negocios.
Cuando le pregunté al tipo responsable de la razón detrás de esto, dijo que era una forma de escapar de la tiranía de Spring . Va en torno a este proceso de pensamiento: para implementar un método de creación de recibo del cliente, podríamos tener un servicio
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Ahora, el tipo dijo que no le gusta que Spring administre clases innecesariamente, básicamente porque impone la restricción de que las clases de clientes deben ser Spring beans. Terminamos teniendo todo administrado por Spring, lo que nos obliga a trabajar con objetos sin estado de una manera procesal. Más o menos lo que se indica aquí https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
Entonces, en lugar del código anterior, tiene
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Podría argumentar hasta el punto de evitar que Spring administre nuestras clases cuando sea posible, pero lo que no veo es el beneficio de tener todo estático. Estos métodos estáticos también son apátridas, por lo que tampoco son muy OO. Me sentiría más cómodo con algo como
new CustomerReceiptCreator().createReceipt()
Afirma que los métodos estáticos tienen algunos beneficios adicionales. A saber:
- Más fácil de leer. Importe el método estático y solo debemos preocuparnos por la acción, sin importar qué clase lo esté haciendo.
- Obviamente, es un método libre de llamadas a DB, por lo que es económico en términos de rendimiento; y es bueno dejarlo claro, para que el cliente potencial necesite ingresar al código y verificarlo.
- Más fácil de escribir pruebas.
Pero siento que hay algo que no está del todo bien con esto, por lo que me gustaría escuchar algunos pensamientos más experimentados de los desarrolladores sobre esto.
Entonces mi pregunta es, ¿cuáles son las posibles trampas de esta forma de programación?
static
método que está ilustrando arriba es solo un método de fábrica común. Hacer que los métodos de fábrica sean estáticos es la convención generalmente aceptada, por varias razones convincentes. Si el método de fábrica es apropiado aquí es una cuestión diferente.