Пару місяців тому я почав працювати над новим проектом, і, переглядаючи код, це вразило мене кількістю застосованих статичних методів. collectionToCsvString(Collection<E> elements)
В них зберігаються не тільки корисні методи як , але і велика кількість бізнес-логіки.
Коли я запитав хлопця, відповідального за обґрунтування цього, він сказав, що це спосіб врятуватися від свавілля Весни . Це дещо оточує цей процес мислення: щоб реалізувати метод створення квитанції клієнта, ми могли б мати сервіс
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Тепер хлопець сказав, що йому не подобається, що заняття, якими займатись Весною, зайво керуються, в основному тому, що це накладає обмеження, що клієнтські класи повинні бути самими весняними бобами. Ми закінчуємо тим, що все управляє Spring, що в значній мірі змушує нас процедурно працювати з об'єктами без громадянства. Більш-менш те, що зазначено тут https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
Тож замість вищевказаного коду він має
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Я можу стверджувати, що уникати весняного управління нашими класами, коли це можливо, але те, що я не бачу, - це користь від того, що все є статичним. Ці статичні методи також без громадянства, тому також не дуже ОО. Я б почувався комфортніше з чимось подібним
new CustomerReceiptCreator().createReceipt()
Він стверджує, що статичні методи мають деякі додаткові переваги. А саме:
- Легше читати. Імпортуйте статичний метод, і нам потрібно дбати лише про дію, не важливо, який клас це робить.
- Це, очевидно, метод, що не містить дзвінків БД, настільки дешевий; і це добре, щоб це було зрозуміло, так що потенційний клієнт дійсно повинен зайти в код і перевірити це.
- Простіше писати тести.
Але я просто відчуваю, що з цим щось не зовсім правильно, тому я хотів би почути ще кілька досвідчених розробників щодо цього.
Отже, моє запитання полягає в тому, які потенційні підводні камені такого способу програмування?
static
Метод , який ви ілюструють вище просто звичайний фабричний метод. Зробити заводські методи статичними - це загальновизнана умова з ряду переконливих причин. Чи підходить заводський метод тут - інша справа.