Domanda

Ho visto diversi consigli sull'uso di contenitori IOC nel codice. La motivazione è semplice. Prendi il seguente codice iniettato di dipendenza:

class UnitUnderTest
{
    std::auto_ptr<Dependency> d_;
public:
    UnitUnderTest(
        std::auto_ptr<Dependency> d = std::auto_ptr<Dependency>(new ConcreteDependency)
    ) : d_(d)
    {
    }
};


TEST(UnitUnderTest, Example)
{
    std::auto_ptr<Dependency> dep(new MockDependency);
    UnitUnderTest uut(dep);
    //Test here
}

In:

class UnitUnderTest
{
    std::auto_ptr<Dependency> d_;
public:
    UnitUnderTest()
    {
        d_.reset(static_cast<Dependency *>(IocContainer::Get("Dependency")));
    }
};


TEST(UnitUnderTest, Example)
{
    UnitUnderTest uut;
    //Test here
}

//Config for IOC container normally
<Dependency>ConcreteDependency</Dependency>

//Config for IOC container for testing
<Dependency>MockDependency</Dependency>

(Quanto sopra è ipotetico esempio C ++ ovviamente)

Mentre sono d'accordo sul fatto che ciò semplifica l'interfaccia della classe rimuovendo il parametro del costruttore di dipendenza, penso che la cura sia peggiore della malattia per un paio di ragioni. Innanzitutto, e questo è grande per me, questo rende il tuo programma dipendente da un file di configurazione esterno. Se hai bisogno di una singola distribuzione binaria, semplicemente non è possibile utilizzare questo tipo di contenitori. Il secondo problema è che l'API è ora debolmente e peggio, stringa digitato. Le prove (in questo ipotetico esempio) sono l'argomento stringa al contenitore IOC e il cast sul risultato.

Quindi .. ci sono altri vantaggi dell'utilizzo di questo tipo di contenitori o non sono d'accordo con coloro che raccomandano i contenitori?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top