La maggior parte del mio codice di produzione ha tipi fissi di dipendenze, illustrati di seguito: il House
ad esempio, in fase di esecuzione, dipende sempre dallo stesso Kitchen
.
Pertanto, mi sto chiedendo cosa ottengo avendo il House
force chiunque lo costruisca a iniettare le sue dipendenze invece di fornire l'opzione per iniettare le dipendenze, cioè fornire sia un costruttore predefinito che un costruttore DI?
Ciò che si perde non consentendo la costruzione predefinita è facilmente visibile se si confrontano mainDI
e mainDefault
.
Anche se ogni classe ha solo due dipendenze, se la profondità della gerarchia delle dipendenze è 3, come ad esempio nel percorso House -> Bedroom -> Bed
, devi istanziare oggetti 2 ^ 3 nella classe di primo livello che sembra non fattibile per progetti di grandi dimensioni con una dipendenza profondità di gerarchia di 10 o più.
Avendo il costruttore DI, sono ancora in grado di testare una classe.
Quindi, per tutti gli esperti di DI in circolazione, qual è il lato negativo di questo approccio?
struct House {
House(Bedroom ib, Kitchen ik) : b(ib), k(ik) {}
House() : b(Bedroom()), k(Kitchen()) {}
private:
Bedroom b;
Kitchen k;
}
struct Bedroom {
Bedroom(Bed ib, Lamp il) : b(ib), l(il) {}
Bedroom() : b(Bed()), l(Lamp()) {}
private:
Bed b;
Lamp l;
}
struct Bed {
Bed(Frame if, Mattress im) : f(if), m(im) {}
Bed() : f(Frame()), m(Mattress()) {}
private:
Frame f;
Mattress m;
}
mainDefault() {
House h()
}
mainDI() {
Frame f;
Mattress m;
Bed b;
Lamp l;
Kitchen k;
Bed b(f, m);
Bedroom br(b, l);
House h(br, k);
}