Пару месяцев назад я начал работать над новым проектом, и при прохождении кода меня поразило количество используемых статических методов. В collectionToCsvString(Collection<E> elements)
них хранятся не только служебные методы , но и множество бизнес-логики.
Когда я спросил парня, ответственного за обоснование этого, он сказал, что это был способ избежать весенней тирании . В этом процессе мышления что-то происходит: для реализации метода создания клиентской квитанции у нас может быть услуга
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Теперь парень сказал, что ему не нравится, когда Spring управляет ненужными классами, в основном потому, что он накладывает ограничение на то, что клиентские классы должны быть самими компонентами Spring. В конце концов мы имеем все, что управляется 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;
}
}
Я мог бы спорить о том, чтобы избегать Spring, когда это возможно, при управлении нашими классами, но я не вижу преимущества в том, чтобы все было статичным. Эти статические методы также не сохраняют состояния, поэтому тоже не очень OO. Я чувствовал бы себя более комфортно с чем-то, как
new CustomerReceiptCreator().createReceipt()
Он утверждает, что статические методы имеют некоторые дополнительные преимущества. А именно:
- Легче читать. Импортируйте статический метод, и нам нужно заботиться только о действии, а не о том, какой класс его выполняет.
- Очевидно, это метод, свободный от вызовов БД, поэтому с точки зрения производительности он дешев; и это хорошая вещь, чтобы прояснить это, так что потенциальный клиент должен пойти в код и проверить это.
- Проще писать тесты.
Но я просто чувствую, что с этим что-то не так, поэтому я хотел бы услышать об этом еще несколько опытных разработчиков.
Итак, мой вопрос: каковы потенциальные подводные камни этого способа программирования?
static
Метод , который вы иллюстрирующие выше просто обычный фабричный метод. Создание фабричных методов статичными является общепринятым соглашением по ряду веских причин. Уместен ли здесь заводской метод, это другой вопрос.