Вопрос проверяет знание пяти принципов SOLID, а также более глубокое понимание DIP как одного из ключевых архитектурных паттернов.
SOLID состоит из пяти принципов: SRP, OCP, LSP, ISP, DIP. DIP (Dependency Inversion Principle) говорит, что модули высокого уровня не должны зависеть от конкретных реализаций — только от абстракций. Это уменьшает связность и облегчает замену частей системы. DIP применяется с помощью интерфейсов и внедрения зависимостей, позволяя подменять конкретные реализации без переписывания бизнес-логики.
SOLID — набор из пяти принципов хорошего проектирования.
SRP — Single Responsibility Principle
Принцип единственной ответственности.
Класс должен иметь одну причину для изменения.
OCP — Open/Closed Principle
Принцип открытости/закрытости.
Классы должны быть открыты для расширения, но закрыты для изменения.
LSP — Liskov Substitution Principle
Принцип подстановки Барбары Лисков.
Объекты дочерних классов должны корректно заменять объекты базовых.
ISP — Interface Segregation Principle
Принцип разделения интерфейсов.
Лучше много маленьких интерфейсов, чем один универсальный.
DIP — Dependency Inversion Principle
Принцип инверсии зависимостей.
Модули верхнего уровня не должны зависеть от модулей нижнего уровня — оба должны зависеть от абстракций.
Определение: DIP — это принцип, согласно которому бизнес-логика (верхний уровень) должна зависеть от абстракций, а не от конкретных реализаций.
Проблема без DIP:
php
class OrderService {
private MysqlRepository $repo;
public function __construct() {
$this->repo = new MysqlRepository();
}
}
Здесь OrderService жёстко привязан к MySQL.
Создаём абстракцию:
php
interface OrderRepository {
public function save(Order $order): void;
}
Реализуем разные репозитории:
php
class MysqlRepository implements OrderRepository { /* ... */ }
class RedisRepository implements OrderRepository { /* ... */ }
Инъекция зависимости:
php
class OrderService {
public function __construct(private OrderRepository $repo) {}
public function process(Order $order): void {
$this->repo->save($order);
}
}
Теперь:
можно подменить хранилище
тестирование упрощено (моки/стабы)
бизнес-логика не знает о реализации
через DI-контейнеры (Symfony, Laravel)
через внедрение зависимостей (конструктор, сеттеры, методы)
через интерфейсы и абстрактные классы
через фабрики и компоновщики
DIP — самый важный принцип SOLID для построения гибкой архитектуры: бизнес-логика зависит от абстракций, а конкретные реализации легко заменяемы.