繁体   English   中英

C ++中的控制反转和依赖注入之间有什么区别?

[英]What is the difference between Inversion of Control and Dependency injection in C++?

我最近一直在阅读有关C ++中的DI和IoC的信息。 我有些困惑(即使在阅读了有关SO的相关问题之后也是如此),并希望进行一些澄清。

在我看来,熟悉STL和Boost会导致大量使用依赖项注入。 例如,假设我做了一个发现一系列数字均值的函数:

template <typename Iter>
double mean(Iter first, Iter last)
{
    double sum = 0;
    size_t number = 0;
    while (first != last)
    {
        sum += *(first++);
        ++number;
    }
    return sum/number;
};

这是依赖注入吗(即,使用迭代器而不是访问集合本身)? 控制反转? 都不行

让我们看另一个例子。 我们有一堂课:

class Dice
{
public:
    typedef boost::mt19937 Engine;
    Dice(int num_dice, Engine& rng) : n_(num_dice), eng_(rng) {}
    int roll()
    {
        int sum = 0;
        for (int i = 0; i < num_dice; ++i)
            sum += boost::uniform_int<>(1,6)(eng_);
        return sum;
    }
private:
    Engine& eng_;
    int n_;
};

这似乎是依赖注入。 但这是控制反转吗?

另外,如果我缺少某些东西,有人可以帮我吗? 这似乎是做事的自然方法,所以如果这就是依赖注入,那么为什么人们很难使用它呢?

控制反转是一个非常笼统的概念,根据您所讨论的“控制”种类,其含义有所不同。 依赖注入是一种特定形式。

控制反转和迭代

在这种情况下,“控制”是指“流量控制”。

我认为您的第一个涉及迭代的示例并不是真正的控制反转,因为该代码明确地进行了流控制。 控制反转会使执行的动作与流控制分开。 它可能看起来像这样(请原谅我的java / C#):

SumVisitor sumVisitor = new SumVisitor();
collection.AcceptVisitor(sumVisitor);
int sum = sumVisitor.GetSum();

访问者对象为其访问的每个收集元素执行某项操作,例如,更新总和计数器字段。 但它无法控制集合如何或何时调用它,因此控制权反转 您还可以实现MedianVisitorMeanVisitorMaximumVisitor等。 每个接口都使用Visit(Element)方法实现通用IVisitor接口。

对于集合来说,情况恰恰相反:它不了解访问者的行为,仅通过为集合中的每个元素调用visitor.Visit(element)来进行流控制。 对于集合,不同的访客实现都看起来相同。

控制和对象图构造的反转

在这种情况下,“控制”是指“控制如何创建组件并将它们连接在一起”。

在任何非平凡的应用程序中,代码都被分解为必须协作的组件。 为了使组件可重复使用,它们不能直接相互创建,因为那样会永久地将它们粘合在一起。 相反,单个组件放弃了对结构和组件布线的控制

依赖注入是通过在构造函数中引用协作者对象来实现此目标的一种方法。 然后,您需要单独的启动代码,在其中创建所有组件并将其连接在一起,或者需要一个依赖项注入框架来为您解决这一问题。 您的Dice类确实是依赖项注入的示例。

放弃控制对象图构造的另一种方法是Service Locator模式,尽管它有缺点

让我尝试回答。

您的第一个例子都不是。 它只是一个模板。

为了使其成为依赖项注入,必须选择一个实现,并将其提供给模板。

为了使其成为IoC,必须在运行时(而不是编译时)将模板提供给IMPLEMENTATION类型,并用作“ mean()”函数的实现(想想提供均值函数实现的工厂)

您的第二个示例看起来像是DI / IoC的使用者。 将Engine的实现发送到您的类中的代码将是DI / IoC组件。

希望这是准确的,对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM