### S – Single Responsibility / Принцип единственной ответственности
Каждый класс должен отвечать только за одну операцию.

### O — Open-Closed / Принцип открытости-закрытости
Программные сущности должны быть открыты для расширения, но закрыты для модификации.
Изменения кода в сущностях, которые ранее были протестированы и введены в работу, требуют повторного тестирования.

Добавление нового функционала путем создания новой сущности (например, композиция или наследование) не требует таких трудозатрат.

### L — Liskov Substitution / Принцип подстановки Барбары Лисков
Наследуемый класс должен дополнять, а не замещать поведение родительского класса

### I — Interface Segregation / Принцип разделения интерфейсов
Программные сущности не должны зависеть от методов, которые они не используют. Если перефразировать: нельзя заставлять сущность реализовывать интерфейс, которым он не пользуется.
На картинке ниже класс Knife вынужден реализовывать метод reload, хотя нож не нуждается в перезарядке.

<br>
Правильно сделать так

### D — Dependency Inversion / Принцип инверсии зависимостей
Сущности верхнего уровня не должны зависеть от сущностей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

<br>
Источники
https://www.youtube.com/watch?v=TxZwqVTaCmA
https://habr.com/ru/company/productivity_inside/blog/505430/
https://ru.wikipedia.org/wiki/SOLID