Daily bit(e) C++. Внедрение зависимостей
Добавлено 24 сентября 2026 в 06:18
Daily bit(e) C++ 117, паттерн проектирования «внедрение зависимостей» (dependency injection).

Внедрение зависимостей – это простой паттерн проектирования, позволяющий отделить компонент от его зависимости.
Хотя этот паттерн и привносит виртуальную диспетчеризацию (сопряженную с накладными расходами во время выполнения), его простота и положительное влияние на тестируемость, как правило, оправдывают эти издержки.
#include <memory>
// Базовый интерфейс
struct Service
{
virtual void make_important_call() = 0;
};
// Фиктивная реализация для тестирования
struct FakeService : Service
{
void make_important_call() override {}
};
// Реальная реализация
struct ProductionService : Service
{
void make_important_call() override {}
};
struct MyClass
{
MyClass(std::unique_ptr<Service> service) : // Внедрение зависимости
dependency_(std::move(service)) {}
void operate()
{
dependency_->make_important_call();
}
private:
std::unique_ptr<Service> dependency_;
};
// В продакшен-коде:
MyClass m(std::make_unique<ProductionService>());
m.operate(); // вызывае ProductionService::make_important_call()
// В тестовом коде:
MyClass n(std::make_unique<FakeService>());
n.operate(); // вызывает FakeService::make_important_call()
