Ответ
Принцип единственной ответственности (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можно использовать для отправки уведомлений не только о заказах.