Что такое принцип единственной ответственности (Single Responsibility Principle)
Что проверяют
Понимаете ли вы SRP как принцип про причины изменений, а не про «один класс, один метод». Следом обычно просят показать нарушение на коде и объяснить, как принцип выглядит в Python, где кроме классов есть модули и обычные функции.
Как отвечать
Исходная формулировка Роберта Мартина: у класса должна быть одна причина для изменения. Позже он её уточнил: модуль отвечает перед одним актором, то есть перед одной группой людей, которая может потребовать правку. Отсюда практический тест: если изменения в класс приносят и бухгалтерия, и служба безопасности, ответственностей у него две.
Покажите на примере:
- нарушение: класс
Reportсчитает итоги, рендерит HTML и сам пишет файл на диск. Смена формата вывода и смена правил расчёта трогают один и тот же код; - исправление: расчёт остаётся в
Reportили в чистой функции, за представление отвечаетHtmlRenderer, а сохранение уходит в отдельный объект или просто в вызывающий код; - особенность Python: единицей ответственности часто выступает модуль или функция, а не класс. Заводить класс ради одного метода не нужно, функция в модуле
billing.pyвполне соблюдает SRP; - пример из Django: модель с методами отправки писем, генерации PDF и вызова внешнего API быстро превращается в «толстую модель». Отправку писем обычно выносят в сервисный слой или в задачу Celery.
Назовите выгоду конкретно: в тесте на расчёт не нужно мокать файловую систему и SMTP, а правка шаблона не ломает бизнес-логику. И назовите цену: слишком мелкое дробление даёт десятки классов по пять строк, и простой сценарий приходится собирать по десяти файлам.
Где спотыкаются
Путают SRP с правилом «класс делает одну вещь». Методы validate() и save() в одном классе принцип не нарушают, если их меняют по одной и той же причине.
Дробят до абсурда: на каждое действие отдельный UserEmailSenderFactory. Сильный ответ говорит не только зачем делить, но и где остановиться.
Объясняют только словами. Интервьюер почти всегда просит набросать код, поэтому держите в голове пару классов «до» и «после» строк на десять.