代码之家  ›  专栏  ›  技术社区  ›  rlbond

C++中控件的反转与依赖注入有什么不同?

  •  12
  • rlbond  · 技术社区  · 14 年前

    在我看来,熟悉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_;
    };
    

    这看起来像是依赖注入。但这是控制反转吗?

    还有,如果我遗漏了什么,有人能帮我吗?这似乎是做事情的自然方式,所以如果依赖注入就只有这些,为什么人们很难使用它呢?

    2 回复  |  直到 14 年前
        1
  •  17
  •   Wim Coenen    14 年前

    Inversion of Control 是一个非常通用的概念,根据你所说的“控制”的类型,有不同的含义。依赖注入是一种特殊的形式。

    控制反演与迭代

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

    我认为您的第一个涉及迭代的示例并不是真正的控制反转,因为该代码显式地执行流控制。控制反转将要执行的操作与流控制分离。它可能看起来像这样(请原谅我的java/C#):

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

    visitor对象为它访问的每个集合元素执行一些操作,例如更新sum counter字段。但它没有 控制 如何或何时由集合调用,因此 控制反转 . 您还可以实现 MedianVisitor , MeanVisitor , MaximumVisitor IVisitor Visit(Element) 方法。

    visitor.Visit(element)

    在这种情况下,“控制”是指“控制如何创建和连接组件”。

    在任何一个非平凡的应用程序中,代码都被分解成需要协作的组件。为了保持组件的可重用性,它们不能直接创建彼此,因为这样会永久地将它们粘合在一起。而是单个组件 放弃控制权

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

    另一种放弃对对象图构造控制的方法是 Service Locator disadvantages .

        2
  •  1
  •   CDSO1    14 年前

    让我试着回答。

    你的第一个例子是两者都不是。它只是一个模板。

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

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

    希望这是准确的,而且有帮助。