Как принцип единственной ответственности (SRP) связан со стабильностью кода?

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

Ответ

Принцип единственной ответственности (SRP) напрямую повышает стабильность кода, так как изменение требований к одной функциональности затрагивает минимальное количество модулей.

Связь со стабильностью:

  1. Локализация изменений: Если класс отвечает только за одну задачу, то при изменении бизнес-правил, связанных с этой задачей, правки вносятся только в этот класс. Это предотвращает каскадные изменения по всей кодовой базе.
  2. Снижение риска регрессии: Изменения в одном модуле с меньшей вероятностью сломают другой, несвязанный модуль, поскольку их обязанности четко разделены.
  3. Упрощение тестирования: Классы с одной ответственностью проще покрывать модульными тестами, что позволяет быстрее выявлять проблемы при рефакторинге.

Пример нарушения и соблюдения SRP:

// НАРУШЕНИЕ: Класс Order выполняет три разные задачи.
class Order {
    public function calculateTotal(): float { /* ... */ }
    public function saveToDatabase(): void { /* ... */ }
    public function sendConfirmationEmail(): void { /* ... */ }
}
// Изменение формата email или логики сохранения потребует правок в одном классе, что нестабильно.

// СОБЛЮДЕНИЕ: Каждая ответственность вынесена в отдельный класс.
class OrderCalculator {
    public function calculateTotal(Order $order): float { /* ... */ }
}
class OrderRepository {
    public function save(Order $order): void { /* ... */ }
}
class OrderNotifier {
    public function sendConfirmation(Order $order): void { /* ... */ }
}
// Теперь изменение в логике отправки уведомлений затронет только класс OrderNotifier, оставляя расчеты и сохранение стабильными.

Таким образом, SRP минимизирует точки распространения изменений, что является ключом к поддержанию стабильной системы.