Принципы SOLID.

Готовлюсь к собеседованиям и систематизирую знания. Сегодня разбираем SOLID-принципы.

S — единство ответственности,

O — открытости/закрытости,

L — подстановки Лисков,

I — разделения интерфейсов,

D — инверсии зависимостей.

Единство ответственности

Класс должен решать лишь одну задачу. Он должен иметь одну и только одну причину для изменений. Как было: Класс User отвечает и за данные пользователя, и за его сохранение в базу. Как стало: Класс User хранит данные, а класс UserRepository отвечает за сохранение.

Открытость/закрытость

Этот принцип утверждает, что программные сущности должны быть открыты для расширения, но закрыты для модификации. В контексте Solid JS это значит, что можно легко добавлять новую функциональность через наследование или композицию, не изменяя существующий код, что предотвращает риск введения ошибок.

Принцип подстановки Лисков

Согласно этому принципу, объекты программы должны быть заменяемы их наследниками без вреда для функциональности приложения. Это обеспечивает, что наследованные классы или компоненты в Solid JS могут использоваться взаимозаменяемо, не нарушая ожидаемое поведение программы.

Разделение интерфейсов

Идея состоит в том, что лучше иметь много интерфейсов, специализированных под конкретные цели, чем один интерфейс, охватывающий множество различных задач. Этот принцип помогает избежать ситуации, когда классы должны реализовывать методы, которые они фактически не используют. В Solid JS это подразумевает создание чистых и организованных компонентов, каждый из которых взаимодействует только с теми интерфейсами, которые необходимы для его работы.

Инверсия зависимостей Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.

Как было: Класс ReportService напрямую создает экземпляр MySQLDatabase для сохранения отчета. Как стало: Класс ReportService зависит от абстракции — интерфейса Database. Теперь мы можем передать ему в конструктор как MySQLDatabase, так и PostgreSQLDatabase, не меняя код сервиса.