Ответ
Да, если эта функция представляет собой отдельную ответственность (принцип SRP). Создание класса для одной четко определенной операции повышает читаемость, тестируемость и переиспользуемость кода.
Когда это оправдано:
- Сложная логика: Функция реализует нетривиальный алгоритм или бизнес-правило.
- Отдельная ответственность: Функция выполняет задачу, логически отличную от обязанностей основного класса.
- Необходимость тестирования: Логику нужно изолировать для модульного тестирования.
- Возможность повторного использования: Функция может понадобиться в других частях системы.
Пример рефакторинга:
До (нарушение SRP):
class OrderProcessor {
public void process(Order order) {
// Валидация заказа перемешана с логикой обработки
if (order.getItems() == null || order.getItems().isEmpty()) {
throw new InvalidOrderException("Order must contain items");
}
if (order.getTotal().compareTo(BigDecimal.ZERO) <= 0) {
throw new InvalidOrderException("Order total must be positive");
}
// ... основная логика обработки
}
}
После (с выделенным классом-валидатором):
// Отдельный класс с единственной ответственностью
class OrderValidator {
public void validate(Order order) {
if (order.getItems() == null || order.getItems().isEmpty()) {
throw new InvalidOrderException("Order must contain items");
}
if (order.getTotal().compareTo(BigDecimal.ZERO) <= 0) {
throw new InvalidOrderException("Order total must be positive");
}
}
}
class OrderProcessor {
private OrderValidator validator;
public void process(Order order) {
validator.validate(order); // Делегирование ответственности
// ... чистая логика обработки
}
}
Для простых, утилитарных операций (например, форматирование строки) предпочтительнее использовать статические методы в классах-утилитах.