Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад

Что такое SOLID?

Вопрос проверяет знание принципов объектно-ориентированного программирования, важных для написания поддерживаемого и масштабируемого кода.

Короткий ответ

SOLID — это набор из пяти принципов ООП, которые помогают писать устойчивый и легко поддерживаемый код. Принципы включают: единую ответственность, открытость/закрытость, подстановку Лисков, разделение интерфейсов и инверсии зависимостей.

Длинный ответ

  • SOLID — это аббревиатура для пяти принципов, которые помогают разработчику писать более чистый, удобный для расширения и тестирования код. Каждый из принципов направлен на решение определенной проблемы при проектировании программных систем.
  1. S — Принцип единой ответственности (SRP): Каждый класс должен иметь только одну причину для изменений. Это помогает уменьшить связность и улучшить поддержку.
  2. # Плохой пример: класс выполняет несколько задач
    class Report:
        def generate_report(self):
            # Логика генерации отчета
            pass
        def send_report(self):
            # Логика отправки отчета
            pass
    
    # Хороший пример: разделение ответственности
    class ReportGenerator:
        def generate_report(self):
            # Логика генерации отчета
            pass
    
    class ReportSender:
        def send_report(self):
            # Логика отправки отчета
            pass
  3. O — Принцип открытости/закрытости (OCP): Классы должны быть открыты для расширений, но закрыты для модификаций. Это позволяет добавлять новые функциональности без изменения существующего кода.
  4. # Плохой пример: изменения в существующем коде
    class PaymentProcessor:
        def process_payment(self, payment_type):
            if payment_type == "credit_card":
                print("Processing credit card payment")
            elif payment_type == "paypal":
                print("Processing PayPal payment")
    
    # Хороший пример: расширение через наследование
    from abc import ABC, abstractmethod
    
    class PaymentMethod(ABC):
        @abstractmethod
        def process_payment(self):
            pass
    
    class CreditCardPayment(PaymentMethod):
        def process_payment(self):
            print("Processing credit card payment")
    
    class PayPalPayment(PaymentMethod):
        def process_payment(self):
            print("Processing PayPal payment")
  5. L — Принцип подстановки Лисков (LSP): Объекты производных классов должны быть заменяемы объектами базовых классов без нарушения правильности работы программы.
  6. # Плохой пример: подкласс нарушает контракт базового класса
    class Bird:
        def fly(self):
            print("I can fly")
    
    class Ostrich(Bird):
        def fly(self):
            raise NotImplementedError("Ostriches can't fly")
    
    # Хороший пример: переработка дизайна
    from abc import ABC, abstractmethod
    
    class Bird(ABC):
        @abstractmethod
        def move(self):
            pass
    
    class FlyingBird(Bird):
        def move(self):
            print("I can fly")
    
    class RunningBird(Bird):
        def move(self):
            print("I can run")
  7. I — Принцип разделения интерфейсов (ISP): Лучше создавать несколько специфичных интерфейсов, чем один универсальный. Это помогает избегать ненужных зависимостей.
  8. # Плохой пример: один интерфейс с лишними методами
    class Machine:
        def print(self): pass
        def scan(self): pass
        def fax(self): pass
    
    class OldPrinter(Machine):
        def print(self):
            print("Printing")
        def scan(self):
            raise NotImplementedError("This machine can't scan")
        def fax(self):
            raise NotImplementedError("This machine can't fax")
    
    # Хороший пример: разделённые интерфейсы
    class Printer:
        def print(self): pass
    
    class Scanner:
        def scan(self): pass
    
    class Fax:
        def fax(self): pass
    
    class OldPrinter(Printer):
        def print(self):
            print("Printing")
  9. D — Принцип инверсии зависимостей (DIP): Модули высокого уровня не должны зависеть от модулей низкого уровня, оба должны зависеть от абстракций. Это способствует улучшению гибкости и тестируемости кода.
  10. # Плохой пример: зависимость от конкретного класса
    class MySQLDatabase:
        def connect(self):
            print("Connecting to MySQL database")
    
    class Application:
        def __init__(self):
            self.db = MySQLDatabase()
        def start(self):
            self.db.connect()
    
    # Хороший пример: зависимость от абстракции
    class Database(ABC):
        @abstractmethod
        def connect(self):
            pass
    
    class MySQLDatabase(Database):
        def connect(self):
            print("Connecting to MySQL database")
    
    class MongoDB(Database):
        def connect(self):
            print("Connecting to MongoDB database")
    
    class Application:
        def __init__(self, database: Database):
            self.db = database
        def start(self):
            self.db.connect()
  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Python

Ключевые слова

#solid

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.