Что такое принцип единой ответственности (Single Responsibility Principle) и пример его применения
Что проверяют
Понимаете ли вы SRP глубже, чем «один класс делает одну вещь», и видите ли нарушение в живом коде. Следом часто просят найти лишние обязанности в показанном классе или спрашивают, где граница между разумным разделением и россыпью классов по одному методу.
Как отвечать
Роберт Мартин формулирует принцип так: у модуля должна быть одна причина для изменения. В «Чистой архитектуре» он уточняет: модуль отвечает перед одним актором, то есть перед одной группой людей, которая будет требовать изменений. Это точнее, чем «одна вещь»: вопрос не в числе действий, а в том, кто попросит их поменять.
Классический пример Мартина это класс Employee с тремя методами:
calculatePay(): нужен бухгалтерии;reportHours(): нужен отделу кадров;save(): нужен администраторам базы данных.
Если оба расчёта используют общий приватный метод подсчёта часов, бухгалтерия просит поправить формулу, и отчёт кадровиков тихо начинает врать. После разделения появляются отдельные PayCalculator, HourReporter и класс сохранения, а Employee остаётся с данными и своими инвариантами.
В проекте на Spring нарушение обычно выглядит как OrderService на полторы тысячи строк: валидация, расчёт скидок, сохранение, отправка письма и публикация события в Kafka. Разумное деление: правила заказа в сущности или доменном сервисе, OrderRepository на Spring Data, уведомления в отдельном NotificationService, который слушает событие через @TransactionalEventListener. Каждый класс тестируется без моков на полконтекста.
Признаки нарушения, которые стоит назвать: в конструктор внедряется восемь зависимостей, в названии класса Manager или Helper, правки по разным задачам постоянно конфликтуют в одном файле.
Где спотыкаются
Сводят SRP к «один класс, один метод» и плодят сотни классов по десять строк, между которыми трудно найти логику.
Выносят из сущности всё поведение, оставляя голые геттеры и сеттеры. Анемичная модель не требование SRP: правила, которые защищают данные сущности, в ней и живут.
Показывают разделение, но не могут объяснить, что именно сломается или станет труднее менять, если оставить всё в одном классе.