Как ответить
SOLID — это пять принципов объектно-ориентированного проектирования, сформулированных Робертом Мартином. Они помогают создавать гибкий, переиспользуемый и легко поддерживаемый код. Следование этим принципам уменьшает связанность модулей, упрощает тестирование и внесение изменений.
Разберём каждый принцип с примерами на Python:
- Single Responsibility (S) — у класса должна быть одна причина для изменения. Пример: класс
Reportгенерирует отчёт, а не сохраняет его в БД — для этого есть отдельный классReportRepository. - Open/Closed (O) — классы открыты для расширения, но закрыты для модификации. Добавляем новую функциональность через наследование или композицию, не меняя существующий код. Например, базовый класс
Shapeс методомarea(), и новый классCircleрасширяет его. - Liskov Substitution (L) — объекты подкласса должны быть взаимозаменяемы с объектами базового класса без нарушения работы программы. Если у нас есть базовый класс
Birdс методомfly(), а подклассPenguinне летает, значит, наследование спроектировано неверно. Лучше выделить интерфейсFlyableотдельно. - Interface Segregation (I) — много специализированных интерфейсов лучше одного общего. Вместо
MultiFunctionDeviceс методамиprint(),scan(),fax()лучше сделать интерфейсыPrinter,Scanner,Fax— клиент использует только то, что нужно. - Dependency Inversion (D) — модули верхнего уровня не должны зависеть от модулей нижнего; оба должны зависеть от абстракций. Внедрение зависимостей через интерфейсы слабо связывает
UserServiceс конкретным хранилищем:class UserService: def __init__(self, storage: UserStorage): ...
Пример нарушения и исправления (код):
# Плохо: OrderProcessor зависит от конкретного EmailSender
class OrderProcessor:
def process(self, order):
email = EmailSender()
email.send(order)
# Хорошо: через интерфейс Notifier
class Notifier(ABC):
@abstractmethod
def send(self, order): ...
class EmailNotifier(Notifier): ...
class OrderProcessor:
def __init__(self, notifier: Notifier):
self.notifier = notifier
def process(self, order):
self.notifier.send(order)
Для junior важно понимать, что SOLID — это не догма, а инструмент. В простых проектах можно отступать, но знание принципов помогает быстрее разбираться в чужом коде и писать такой, который легко менять.