Daily bit(e) C++. Внедрение зависимостей

Добавлено 24 сентября 2026 в 06:18

Daily bit(e) C++ 117, паттерн проектирования «внедрение зависимостей» (dependency injection).

Daily bit(e) C++

Внедрение зависимостей – это простой паттерн проектирования, позволяющий отделить компонент от его зависимости.

Хотя этот паттерн и привносит виртуальную диспетчеризацию (сопряженную с накладными расходами во время выполнения), его простота и положительное влияние на тестируемость, как правило, оправдывают эти издержки.

#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()

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Паттерны проектирования / Design PatternsПрограммирование