Как создать объект, необходимый для конструктора класса при инверсии управления? - PullRequest
3 голосов
/ 10 ноября 2010

Я программирую на c ++, используя TDD, который предлагает использовать инверсию управления при создании объектов (при создании объектов определенного класса, передавать построенные объекты его конструктору). Это нормально, но как мне создать объекты, необходимые для конструктора?

Сейчас я использую фабрику (которую я могу легко изменить для своих модульных тестов), которая возвращает shared_ptr, указывающий на созданный объект. Это правильный путь или есть лучшие способы сделать это?

Очень упрощенный пример демонстрирует, что я делаю:

#include <iostream>

struct A {
    virtual ~A() { }
    virtual void foo() = 0;
};

struct B : A {
    virtual ~B() { }
    virtual void foo() { std::cout<<"B::foo()"<<std::endl; }
};

struct C {
    C( A *a ) : a(a) { }
    void DoSomething() { a->foo(); }

    A *a;
};

int main() {
    C c( new B );

    c.DoSomething();
}

против этого:

#include <iostream>

struct A {
    virtual ~A() { }
    virtual void foo() = 0;
};

struct B : A {
    virtual ~B() { }
    virtual void foo() { std::cout<<"B::foo()"<<std::endl; }
};

struct C {
    C() : a() { }
    void DoSomething() { a.foo(); }

    B a;
};

int main() {
    C c;   // the object of type B is constructed in the constructor

    c.DoSomething();
}

EDIT1

Эта ссылка объясняет IoC для Java, но, как вы знаете, в Java вы можете сделать что-то вроде этого:

class B
{
};
class A
{
  public:
    A( B b )
...
};

...
A objA( new B );   // this doesn't work in c++
...

1 Ответ

2 голосов
/ 10 ноября 2010

Используйте шаблон проектирования Builder. Builder и Factory очень похожи на шаблоны проектирования, но, в частности, Builder создает объект, состоящий из нескольких компонентов, сначала создав его компоненты.

Это то, что вы делаете в МОК. Вы создаете компоненты, а затем передаете их как параметры объекту.

Когда я создавал эту модель (4 раза!), Сборщики хранили строители объектов параметров и лексикографические представления скалярной информации. Вы также можете разрешить векторы и карты.

Первое, что вам нужно в системе IOC - это файл конфигурации. Часто (но не всегда) компоненты загружаются в вашу систему посредством динамической загрузки библиотеки во время выполнения.

...