Un paio di mesi fa ho iniziato a lavorare in un nuovo progetto e, passando attraverso il codice, mi ha colpito la quantità di metodi statici utilizzati. Non solo i metodi di utilità come collectionToCsvString(Collection<E> elements)
, ma anche molta logica aziendale è mantenuta in essi.
Quando chiesi al ragazzo responsabile della logica alla base, mi disse che era un modo per fuggire dalla tirannia di Spring . Intraprende questo processo di pensiero: per implementare un metodo di creazione della ricevuta del cliente, potremmo avere un servizio
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Ora, il ragazzo ha detto che non gli piace avere le classi inutilmente gestite da Spring, fondamentalmente perché impone la restrizione che le classi client devono essere stesse bean Spring. Finiamo per avere tutto gestito da Spring, che praticamente ci costringe a lavorare con oggetti apolidi in modo procedurale. Più o meno quanto dichiarato qui https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
Quindi, invece del codice sopra, ha
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Potrei discutere al punto di evitare che Spring gestisca le nostre lezioni quando possibile, ma ciò che non vedo è il vantaggio di avere tutto statico. Questi metodi statici sono anche apolidi, quindi non molto OO. Mi sentirei più a mio agio con qualcosa come
new CustomerReceiptCreator().createReceipt()
Afferma che i metodi statici hanno alcuni vantaggi extra. Vale a dire:
- Più facile da leggere. Importa il metodo statico e dobbiamo solo preoccuparci dell'azione, non di quale classe lo sta facendo.
- È ovviamente un metodo privo di chiamate DB, quindi economico dal punto di vista delle prestazioni; ed è una buona cosa chiarirlo, quindi il potenziale cliente deve andare nel codice e verificarlo.
- È più facile scrivere test.
Ma sento solo che c'è qualcosa di completamente sbagliato in questo, quindi mi piacerebbe sentire alcuni pensieri degli sviluppatori più esperti su questo.
Quindi la mia domanda è: quali sono le potenziali insidie di questo modo di programmare?
static
metodo che stai illustrando sopra è solo un normale metodo di fabbrica. Rendere statici i metodi di fabbrica è la convenzione generalmente accettata, per una serie di ragioni convincenti. Se il metodo di fabbrica è appropriato qui è una questione diversa.