Что означает буква S в принципах SOLID?

«Что означает буква S в принципах SOLID?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

S в SOLID означает Принцип единственной ответственности (Single Responsibility Principle — SRP).

Формулировка: Один модуль (класс, функция) должен иметь одну и только одну причину для изменения. Иными словами, он должен отвечать за одну конкретную задачу или функциональность.

Цель: Уменьшение связности, упрощение понимания, тестирования, рефакторинга и сопровождения кода.

Пример нарушения SRP:

// Класс нарушает SRP, так как совмещает логику бизнес-сущности, сохранения и уведомления.
class User {
    private String name;
    private String email;

    // Конструкторы, геттеры, сеттеры...

    public void saveToDatabase() {
        // Код для сохранения в БД
    }

    public void sendWelcomeEmail() {
        // Код для отправки email
    }
}

Пример c соблюдением SRP:

// Класс отвечает только за хранение данных пользователя.
class User {
    private String name;
    private String email;
    // Конструкторы, геттеры, сеттеры...
}

// Класс отвечает только за операции с хранилищем (персистентность).
class UserRepository {
    public void save(User user) {
        // Код для сохранения в БД
    }
}

// Класс отвечает только за отправку email-уведомлений.
class EmailService {
    public void sendWelcomeEmail(User user) {
        // Код для отправки email
    }
}

Разделение ответственностей позволяет изменять логику отправки писем или способ сохранения, не затрагивая сущность User.