SOLID-принципы: объяснение с примерами кода

Мы просто и по делу рассказываем про ИИ-инструменты для работы: сравнения, пошаговые гайды, бесплатные альтернативы и реальные сценарии применения. Помогаем выбрать между ChatGPT, Gemini, Claude, локальными моделями и десятками узкоспециализированных сервисов — от дизайна и HR до аналитики и SEO. Меньше хайпа, больше практики и экономии времени каждый день.

solidoopпринципы

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 — там ещё больше полезного для разработчиков.

🗣 Подборки каналов 🧠 Каталог ботов и приложений 🗺 Навигация

Читайте так же