Что такое SOLID в объектно-ориентированном программировании?

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

Ответ

SOLID — это пять ключевых принципов проектирования в ООП, направленных на создание гибкого, поддерживаемого и масштабируемого кода.

  1. S (Single Responsibility Principle — Принцип единственной ответственности): Класс должен иметь одну и только одну причину для изменения.
  2. O (Open/Closed Principle — Принцип открытости/закрытости): Классы должны быть открыты для расширения, но закрыты для модификации.
  3. L (Liskov Substitution Principle — Принцип подстановки Барбары Лисков): Объекты базового класса должны быть заменяемы объектами его подклассов без нарушения корректности программы.
  4. I (Interface Segregation Principle — Принцип разделения интерфейса): Много специализированных интерфейсов лучше, чем один универсальный.
  5. D (Dependency Inversion Principle — Принцип инверсии зависимостей): Зависимости должны строиться на абстракциях (интерфейсах), а не на конкретных реализациях.

Пример нарушения и исправления SRP:

// Нарушение: класс UserService выполняет две разные задачи.
class UserService {
    void saveUser(User user) {
        // Сохранение пользователя в БД (ответственность #1)
        saveToDatabase(user);
        // Логирование (ответственность #2)
        System.out.println("User saved: " + user.getName());
    }
}

// Соблюдение: ответственности разделены между двумя классами.
class UserRepository {
    void save(User user) { /* Только сохранение в БД */ }
}
class Logger {
    void log(String message) { /* Только логирование */ }
}
// Теперь UserService может использовать оба компонента.
class UserService {
    private UserRepository repository;
    private Logger logger;
    void saveUser(User user) {
        repository.save(user);
        logger.log("User saved: " + user.getName());
    }
}