In che modo l'iniezione di dipendenza non sposta semplicemente la complessità in una classe separata?

9

Ho cercato di utilizzare il framework Typhoon per l'iniezione delle dipendenze questa settimana. Ho capito che separare la costruzione di oggetti è vantaggioso per la sostituzione di componenti arbitrari con mock durante i test unitari, e finora ho visto benefici solo da questo.

Ma non posso fare a meno di pensare che dove prima avevo una gigantesca classe di controller di visualizzazione che aveva decine di importazioni di header, ora ho una gigantesca classe factory che ha decine di importazioni di header. Dovrei evitare di avere una massiccia classe di fabbrica?

    
posta Victor 07.06.2013 - 13:06
fonte

3 risposte

16

Iniezione delle dipendenze aiuta semplicemente a definire come un oggetto conosce un altro oggetto dipendente. Non ti aiuterà a ridurre la complessità complessiva del sistema. Se avevi bisogno di decine di importazioni prima di DI, avrai ancora bisogno di decine di importazioni dopo. La differenza è che queste importazioni si troveranno in una posizione (classe) che ha più senso (fabbrica, costruttore, ecc.).

Consentendo di fornire le dipendenze attraverso un costruttore o un metodo, ti consenti la flessibilità di fornire un oggetto dipendente diverso, ma ancora valido, alla tua classe e aumentare la coesione di detta classe rimuovendo i dubbi.

Ci sono diversi principi che sono simili e sono spesso usati insieme: Dipendenza iniezione (DI), Inversione di controllo (IoC) e il principio di inversione di dipendenza (DIP)

Da questo articolo link

DI is about wiring, IoC is about direction, and DIP is about shape

    
risposta data 07.06.2013 - 14:19
fonte
10

L'iniezione di dipendenza non riduce la complessità, ma aumenta la maniciabilità attraverso la separazione delle preoccupazioni e l'accoppiamento ridotto.

But I cannot help but think that where before I had a humongous view controller class that had tens of header imports, I now have a humongous factory class that has tens of header imports. Am I supposed to avoid having a massive factory class?

Dovresti evitare classi "humongous", punto. Supponiamo che tu abbia diviso il controller della vista in classi più piccole e più manutenibili. Ora tutti sono responsabili di ottenere le loro dipendenze. DI ti aiuta a spostare questa gestione delle dipendenze da tutte quelle classi in una classe factory / configuration che è only responsabile della gestione delle dipendenze - vedi Single Responsibility Principle. E anche se sarà molto meno "humongous" del controller di visualizzazione originale, se diventa troppo grande hai sempre la possibilità di dividerlo in classi di gestione delle dipendenze più piccole che sono responsabili di diverse parti dell'applicazione.

    
risposta data 07.06.2013 - 14:54
fonte
2

In parole semplici:

L'iniezione di dipendenza sposta la complessità verso il punto in cui danneggia meno.

EDIT per @gnat: DI non è solo spostare la complessità in una classe separata, ma spostarla dove provoca meno danni.

    
risposta data 12.09.2013 - 14:10
fonte

Leggi altre domande sui tag