PRO

Что такое SOLID? Объясните каждый принцип

SOLID — набор из пяти принципов объектно-ориентированного проектирования, которые помогают делать код понятнее, гибче и проще в поддержке. Аббревиатура включает Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation и Dependency Inversion.
Подробный ответ

Что такое SOLID

SOLID — это пять принципов проектирования, которые снижают связанность компонентов, упрощают тестирование и помогают безопаснее изменять программу по мере её развития. Это не строгие правила, которые нужно применять везде, а ориентиры для проектирования кода.

S — Single Responsibility Principle

Принцип единственной ответственности: у класса или модуля должна быть одна причина для изменения. Например, класс создания счёта не должен одновременно формировать PDF, отправлять email и сохранять данные в базу.

class InvoiceService:
    def create_invoice(self, order):
        pass


class InvoicePdfRenderer:
    def render(self, invoice):
        pass


class EmailSender:
    def send(self, message):
        pass

O — Open/Closed Principle

Принцип открытости/закрытости: сущности должны быть открыты для расширения, но закрыты для изменения. Новое поведение желательно добавлять через новые реализации, композицию или полиморфизм, а не постоянно менять уже проверенный код длинными условиями.

L — Liskov Substitution Principle

Принцип подстановки Лисков: объект дочернего класса должен быть пригоден для использования там, где ожидается объект базового класса, без нарушения корректности программы. Наследник не должен неожиданно менять ожидаемое поведение, предусловия или результаты методов.

I — Interface Segregation Principle

Принцип разделения интерфейса: клиент не должен зависеть от методов, которые ему не нужны. Вместо одного большого универсального интерфейса лучше создавать небольшие специализированные интерфейсы.

class Readable:
    def read(self):
        pass


class Writable:
    def write(self, data):
        pass

D — Dependency Inversion Principle

Принцип инверсии зависимостей: модули высокого уровня не должны зависеть от деталей низкого уровня; оба должны зависеть от абстракций. Например, сервис оплаты зависит от интерфейса payment gateway, а конкретные Stripe или PayPal реализации зависят от этого интерфейса.

from typing import Protocol


class PaymentGateway(Protocol):
    def charge(self, amount: int) -> None:
        pass


class PaymentService:
    def __init__(self, gateway: PaymentGateway):
        self.gateway = gateway

    def pay(self, amount: int) -> None:
        self.gateway.charge(amount)

Как ответить на собеседовании

SOLID — это набор принципов для поддерживаемого объектно-ориентированного кода. SRP — одна причина для изменения, OCP — расширяем без постоянного изменения существующего кода, LSP — наследника можно подставить вместо базового типа, ISP — небольшие специализированные интерфейсы, DIP — зависимость от абстракций, а не от конкретных деталей.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге