← Назад к вопросам

Что такое S в SOLID?

2.2 Middle🔥 251 комментариев
#SOLID и паттерны проектирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# S в SOLID: Single Responsibility Principle

Single Responsibility Principle (принцип единственной ответственности) — первый принцип SOLID, который гласит: класс должен иметь одну и только одну причину для изменения. Иными словами, класс должен быть ответствен только за одно изменение в требованиях приложения.

Суть принципа

Каждый класс должен иметь одну область ответственности — одну причину для изменения. Это делает код более модульным, понятным и легким в поддержке.

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

// ❌ Плохо: класс отвечает за слишком много
public class UserManager {
    // Ответственность 1: управление пользователем
    public void createUser(String name, String email) {
        // создание пользователя
    }
    
    // Ответственность 2: сохранение в БД
    public void saveToDatabase(User user) {
        // сохранение в БД
    }
    
    // Ответственность 3: отправка email
    public void sendWelcomeEmail(User user) {
        // отправка письма
    }
    
    // Ответственность 4: логирование
    public void logActivity(String message) {
        // логирование
    }
}

Этот класс нарушает SRP, так как имеет 4 разные ответственности. Если нужно изменить способ отправки email, логирования или работы с БД — нужно изменять один и тот же класс.

Правильное применение SRP

// ✅ Хорошо: каждый класс имеет одну ответственность

// Класс 1: управление пользователем
public class User {
    private String name;
    private String email;
    
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    public String getName() { return name; }
    public String getEmail() { return email; }
}

// Класс 2: создание пользователя
public class UserCreator {
    public User createUser(String name, String email) {
        return new User(name, email);
    }
}

// Класс 3: сохранение в БД
public class UserRepository {
    public void save(User user) {
        // сохранение в БД
        System.out.println("User saved: " + user.getName());
    }
}

// Класс 4: отправка email
public class EmailService {
    public void sendWelcomeEmail(User user) {
        System.out.println("Welcome email sent to: " + user.getEmail());
    }
}

// Класс 5: логирование
public class Logger {
    public void log(String message) {
        System.out.println("[LOG] " + message);
    }
}

// Использование
public class UserRegistration {
    private UserCreator userCreator = new UserCreator();
    private UserRepository userRepository = new UserRepository();
    private EmailService emailService = new EmailService();
    private Logger logger = new Logger();
    
    public void register(String name, String email) {
        User user = userCreator.createUser(name, email);
        userRepository.save(user);
        emailService.sendWelcomeEmail(user);
        logger.log("User registered: " + name);
    }
}

Преимущества SRP

  1. Легче тестировать — каждый класс тестируется отдельно
  2. Проще поддерживать — изменения затрагивают только нужный класс
  3. Переиспользование — классы легче использовать в других местах
  4. Ясность кода — сразу понятна ответственность класса
  5. Гибкость — легко заменять реализацию

Практические рекомендации

  • Если описание класса содержит слово "и" (например, "UserManager и EmailSender"), скорее всего, нарушен SRP
  • Одна причина для изменения = одна ответственность
  • Используй dependency injection для связи между классами
  • Старайся держать классы компактными (200-300 строк максимум)

SRP — это фундамент, на котором строятся остальные принципы SOLID.

Что такое S в SOLID? | PrepBro