В ООП, стоит ли создавать отдельный класс для реализации одной функции?

«В ООП, стоит ли создавать отдельный класс для реализации одной функции?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, если эта функция представляет собой отдельную ответственность (принцип 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); // Делегирование ответственности
        // ... чистая логика обработки
    }
}

Для простых, утилитарных операций (например, форматирование строки) предпочтительнее использовать статические методы в классах-утилитах.