Kilka miesięcy temu zacząłem pracować nad nowym projektem, a kiedy przejrzałem kod, uderzyło mnie ilość użytych metod statycznych. collectionToCsvString(Collection<E> elements)
Przechowuje się w nich nie tylko metody użytkowe , ale także mnóstwo logiki biznesowej.
Kiedy zapytałem faceta odpowiedzialnego za uzasadnienie tego, powiedział, że to sposób na ucieczkę od tyranii Springa . Obejmuje to coś w tym procesie myślenia: w celu wdrożenia metody tworzenia paragonu klienta moglibyśmy mieć usługę
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Facet powiedział, że nie lubi niepotrzebnie zarządzać klasami przez Spring, głównie dlatego, że nakłada to ograniczenie, że klasy klientów muszą być same ziarenkami Spring. W końcu wszystko zarządza Spring, co zmusza nas do pracy z obiektami bezpaństwowymi w sposób proceduralny. Mniej więcej to, co podano tutaj https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
Więc zamiast powyższego kodu ma
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Mógłbym kłócić się do tego stopnia, że w miarę możliwości unikam Springowego zarządzania naszymi klasami, ale nie widzę korzyści z posiadania wszystkiego statycznego. Te metody statyczne są również bezpaństwowe, więc też nie bardzo OO. Czułbym się bardziej komfortowo z czymś takim
new CustomerReceiptCreator().createReceipt()
Twierdzi, że metody statyczne mają dodatkowe zalety. Mianowicie:
- Łatwiejszy do odczytania. Zaimportuj metodę statyczną i musimy tylko dbać o akcję, bez względu na to, która klasa to robi.
- Jest oczywiście metodą wolną od wywołań DB, więc pod względem wydajności jest tania; dobrze jest to wyjaśnić, aby potencjalny klient musiał wejść do kodu i to sprawdzić.
- Łatwiejsze pisanie testów.
Ale po prostu czuję, że jest w tym coś nie tak, więc chciałbym usłyszeć o tym bardziej doświadczone opinie programistów.
Moje pytanie brzmi: jakie są potencjalne pułapki tego sposobu programowania?
static
metoda jest zwykłą metodą fabryczną. Uczynienie metod fabrycznych statycznymi jest ogólnie przyjętą konwencją z wielu istotnych powodów. To, czy metoda fabryczna jest tutaj właściwa, to inna sprawa.