SOLID — это 5 принципов ООП и проектирования, которые помогают писать код, который проще поддерживать, тестировать и расширять. Они особенно полезны в крупных IT-проектах, где “рабочий код” быстро превращается в “дорогой в изменениях”.
S — Single Responsibility Principle
Принцип единственной ответственности: у класса должна быть одна причина для изменения.
Плохо:
class UserService:
def save_user(self, user): pass
def send_email(self, user): pass
Лучше:
class UserRepository:
def save_user(self, user): pass
class EmailService:
def send_email(self, user): pass
Почему важно: код становится понятнее, а изменения в логике отправки писем не ломают сохранение пользователей.
O — Open/Closed Principle
Код должен быть открыт для расширения, но закрыт для изменения.
Плохо:
def get_discount(user_type):
if user_type == "regular":
return 5
elif user_type == "vip":
return 10
Лучше:
class Discount:
def get_value(self): pass
class RegularDiscount(Discount):
def get_value(self): return 5
class VipDiscount(Discount):
def get_value(self): return 10
Плюс: новый тип скидки добавляется новым классом, без переписывания старой логики.
L — Liskov Substitution Principle
Наследник должен корректно заменять родителя.
Плохо:
class Bird:
def fly(self): pass
class Penguin(Bird):
def fly(self):
raise Exception("I can't fly")
Лучше:
class Bird: pass
class FlyingBird(Bird):
def fly(self): pass
class Penguin(Bird):
def swim(self): pass
Смысл: если подстановка наследника ломает поведение программы — архитектура выбрана неверно.
I — Interface Segregation Principle
Не заставляйте классы зависеть от методов, которые им не нужны.
Плохо:
class Worker:
def work(self): pass
def eat(self): pass
class Robot(Worker):
def eat(self):
raise Exception("Robot doesn't eat")
Лучше:
class Workable:
def work(self): pass
class Eatable:
def eat(self): pass
Итог: маленькие специализированные интерфейсы удобнее, чем один “толстый”.
D — Dependency Inversion Principle
Зависите от абстракций, а не от конкретных реализаций.
Плохо:
class MySQLDatabase:
pass
class UserService:
def __init__(self):
self.db = MySQLDatabase()
Лучше:
class Database:
def save(self, data): pass
class MySQLDatabase(Database):
def save(self, data): pass
class UserService:
def __init__(self, db: Database):
self.db = db
Преимущество: можно легко заменить MySQL на PostgreSQL, mock в тестах или API-хранилище. 🔧
Зачем знать SOLID на практике?
- упрощает рефакторинг
- снижает связанность кода
- ускоряет тестирование
- помогает проектировать масштабируемые сервисы
- делает код понятнее для команды 🚀
Важно: SOLID — не догма. Если применять принципы бездумно, можно получить переусложнённую архитектуру. Но в backend, enterprise-разработке и больших командах это один из базовых инструментов инженера. 🧠
📌 Сохраняйте, если хотелось понять SOLID простыми словами, и загляните в подборку каналов про IT — там ещё больше полезного для разработчиков.