Что такое принцип единственной ответственности (Single Responsibility Principle)?

«Что такое принцип единственной ответственности (Single Responsibility Principle)?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Принцип единственной ответственности (SRP) — это первый принцип SOLID. Он гласит: «У класса должна быть только одна причина для изменения». На практике это означает, что класс должен решать одну конкретную задачу или отвечать за одну область ответственности.

Проблемный пример (нарушение SRP): Класс Order занимается и бизнес-логикой заказа, и его сохранением в БД, и отправкой уведомлений.

class Order {
    public function calculateTotal() { /* ... */ }
    public function saveToDatabase() { /* ... */ }
    public function sendConfirmationEmail() { /* ... */ }
    // При изменении правил расчёта, схемы БД или формата email
    // придётся менять один и тот же класс.
}

Решение (соблюдение SRP): Разделяем ответственности на отдельные классы.

class Order {
    public function calculateTotal() { /* ... */ }
    // Отвечает только за данные и логику заказа.
}

class OrderRepository {
    public function save(Order $order) { /* ... */ }
    // Отвечает только за персистентность (работу с БД).
}

class NotificationService {
    public function sendOrderConfirmation(Order $order) { /* ... */ }
    // Отвечает только за отправку уведомлений.
}

Теперь, если изменится способ отправки email (например, добавится SMS), мы будем править только NotificationService. Изменение структуры таблицы в БД затронет только OrderRepository.

Преимущества следования SRP:

  • Упрощение тестирования: Легко протестировать OrderRepository отдельно от логики отправки писем.
  • Повышение читаемости и поддерживаемости: Классы становятся меньше и понятнее.
  • Снижение связанности: Изменения в одной части системы с меньшей вероятностью сломают другую.
  • Упрощение повторного использования: Класс NotificationService можно использовать для отправки уведомлений не только о заказах.