Что такое SOLID? Объясните каждый принцип
Подробный ответ
Что такое 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):
passO — Open/Closed Principle
Принцип открытости/закрытости: сущности должны быть открыты для расширения, но закрыты для изменения. Новое поведение желательно добавлять через новые реализации, композицию или полиморфизм, а не постоянно менять уже проверенный код длинными условиями.
L — Liskov Substitution Principle
Принцип подстановки Лисков: объект дочернего класса должен быть пригоден для использования там, где ожидается объект базового класса, без нарушения корректности программы. Наследник не должен неожиданно менять ожидаемое поведение, предусловия или результаты методов.
I — Interface Segregation Principle
Принцип разделения интерфейса: клиент не должен зависеть от методов, которые ему не нужны. Вместо одного большого универсального интерфейса лучше создавать небольшие специализированные интерфейсы.
class Readable:
def read(self):
pass
class Writable:
def write(self, data):
passD — 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 — зависимость от абстракций, а не от конкретных деталей.
Оцени свой прогресс