In che modo l'iniezione di dipendenza aumenta l'accoppiamento?

32

Sulla pagina di Wikipedia su dipendenza da iniezione, la sezione sugli svantaggi ci dice questo:

Dependency injection increases coupling by requiring the user of a subsystem to provide for the needs of that subsystem.

con un link a un articolo contro l'iniezione di dipendenza .

L'iniezione delle dipendenze fa sì che una classe usi l'interfaccia invece dell'implementazione concreta. Ciò dovrebbe comportare una diminuzione del accoppiamento , no?

Cosa mi manca? In che modo l'iniezione di dipendenza aumenta l'accoppiamento tra le classi?

    
posta BЈовић 04.06.2014 - 15:57
fonte

3 risposte

42

So, what am I missing?

L'iniezione di dipendenze diminuisce l'accoppiamento tra una classe e la sua dipendenza. Ma aumenta l'accoppiamento tra una classe e il suo consumatore (dal momento che il consumatore ha bisogno di più informazioni per crearlo) e la dipendenza e il suo consumatore (dal momento che il consumatore ha bisogno di conoscere la dipendenza da usare).

Molto spesso, questo è un buon compromesso. La classe non dovrebbe conoscere i dettagli delle sue dipendenze oltre all'interfaccia, e dovrebbe essere responsabile dell'applicazione per legare insieme specifici bit di codice.

    
risposta data 04.06.2014 - 16:48
fonte
22

Supponiamo di avere un sottosistema S che dipende da una connessione al database D . Senza l'iniezione di dipendenza, esiste un accoppiamento relativamente stretto tra S e D , perché S deve sapere sia come utilizzare D sia come crearlo. Il resto del sistema, tuttavia, può ignorare beatamente questa dipendenza tra S e D .

Con l'iniezione di dipendenza, l'accoppiamento tra S e D diventa più lento, perché rimuovi da S la conoscenza su come creare un D . S ha solo bisogno di sapere come usarlo. L'aumento dell'accoppiamento generale deriva dal fatto che ora altre parti del sistema devono sapere circa D e possibilmente come crearne una. L'entità di questo aumento nell'accoppiamento dipende da come la dipendenza da D viene iniettata in S :

  • Con la iniezione del costruttore il creatore di S ha bisogno di una dipendenza su D e probabilmente la conoscenza su come crearne uno.
  • Con Iniezione a livello di metodo , ogni chiamante di un metodo di S tramite cui viene iniettato un D necessita di una dipendenza su D e probabilmente della conoscenza su come crearne uno.

In entrambi i casi, il numero di classi che dipende da D aumenta e la conoscenza di come creare un D deve ancora essere presente da qualche parte nel sistema. Questo crea un aumento generale dell'accoppiamento.

    
risposta data 04.06.2014 - 16:31
fonte
7

Non sono assolutamente d'accordo sul fatto che aumenti l'accoppiamento.

Senza l'iniezione di dipendenze si ha uno stretto accoppiamento tra un sottosistema e l'implementazione concreta della dipendenza.

Con l'iniezione di dipendenza hai disaccoppiato il sottosistema dall'implementazione della dipendenza.

Rendere l'argomento che aumenta l'accoppiamento tra il consumatore e questo sottosistema è MOLTO discutibile in quanto implica che il consumatore sia ora strettamente accoppiato alla dipendenza richiesta dal sottosistema. Tutto ciò significa che stai scrivendo codice strettamente accoppiato che accoppia il tuo consumatore alla dipendenza. Idealmente ALL il tuo codice è disaccoppiato.

Iniezione costruttore:

La risoluzione delle dipendenze è gestita da un contenitore per le dipendenze o una fabbrica. Il consumatore può ottenere un'implementazione concreta del sottosistema dal contenitore dell'iniezione dipendente o da una fabbrica.

Il consumatore non ha bisogno di sapere come appare il costruttore del sottosistema. Non esiste alcun accoppiamento con la dipendenza del sottosistema.

Iniezione metodo:

Come l'iniezione del costruttore, tranne per il fatto che ora il consumatore ha bisogno di ottenere un'istanza concreta della dipendenza dal contenitore o dalla fabbrica (o persino di iniettarlo metodo / costruttore) e iniettarlo nel metodo. Ancora una volta, il consumatore non è associato a un'implementazione concreta della dipendenza.

TL; DR Il peggior caso per l'iniezione di dipendenza in un sottosistema è che l'accoppiamento è spostato sul codice del consumatore. NON C'È AUMENTO GLOBALE IN ACCOPPIAMENTO.

Il caso migliore è che ora tutti i sistemi sono accoppiati liberamente e l'iniezione di dipendenza è controllata tramite contenitori o fabbriche di iniezione dipendenti.

    
risposta data 05.06.2014 - 06:49
fonte

Leggi altre domande sui tag