Una rapida introduzione a Dependency Injection: che cos'è e quando usarlo

Foto di rawpixel su Unsplash

introduzione

Nell'ingegneria del software, l'iniezione di dipendenza è una tecnica in base alla quale un oggetto (o metodo statico) fornisce le dipendenze di un altro oggetto. Una dipendenza è un oggetto che può essere utilizzato (un servizio).

Questa è la definizione di Wikipedia ma comunque, ma non è particolarmente facile da capire. Quindi capiamo meglio.

Prima di capire cosa significa in programmazione, vediamo prima cosa significa in generale perché ci aiuterà a capire meglio il concetto.

Dipendenza o dipendenza significa fare affidamento su qualcosa per il supporto. Come se dico che facciamo troppo affidamento sui telefoni cellulari di quanto significhi che dipendiamo da loro.

Quindi, prima di arrivare alle iniezioni di dipendenza, dobbiamo prima capire cosa significa una dipendenza nella programmazione.

Quando la classe A utilizza alcune funzionalità della classe B, si dice che la classe A abbia una dipendenza della classe B.

Mostra dipendenze tra le classi

In Java, prima di poter usare metodi di altre classi, dobbiamo prima creare l'oggetto di quella classe (cioè la classe A deve creare un'istanza di classe B).

Quindi, il trasferimento dell'attività di creazione dell'oggetto a qualcun altro e l'utilizzo diretto della dipendenza si chiama iniezione di dipendenza.

E se il codice potesse parlare?

Perché dovrei usare l'iniezione di dipendenza?

Diciamo che abbiamo una classe di auto che contiene vari oggetti come ruote, motore, ecc.

Qui la classe di auto è responsabile della creazione di tutti gli oggetti di dipendenza. Ora, se decidessimo di abbandonare MRFWheels in futuro e volessimo usare le ruote Yokohama?

Dovremo ricreare l'oggetto auto con una nuova dipendenza Yokohama. Ma quando si utilizza l'iniezione delle dipendenze (DI), è possibile modificare le ruote in fase di esecuzione (poiché le dipendenze possono essere iniettate in fase di esecuzione anziché in fase di compilazione).

Puoi pensare a DI come l'intermediario nel nostro codice che fa tutto il lavoro per creare l'oggetto ruote preferito e fornirlo alla classe Car.

Rende la nostra classe di auto indipendente dalla creazione di oggetti di ruote, batteria, ecc.

Esistono fondamentalmente tre tipi di iniezione di dipendenza:

  1. Iniezione costruttore: le dipendenze sono fornite tramite un costruttore di classe.
  2. iniezione setter: il client espone un metodo setter che l'iniettore utilizza per iniettare la dipendenza.
  3. Iniezione interfaccia: la dipendenza fornisce un metodo iniettore che inietterà la dipendenza in qualsiasi client passato ad essa. I client devono implementare un'interfaccia che espone un metodo setter che accetta la dipendenza.

Quindi ora è responsabilità dell'iniezione di dipendenza:

  1. Crea gli oggetti
  2. Scopri quali classi richiedono quegli oggetti
  3. E fornisci loro tutti quegli oggetti

Se c'è qualche cambiamento negli oggetti, DI lo esamina e non dovrebbe riguardare la classe che usa quegli oggetti. In questo modo se gli oggetti cambieranno in futuro, allora la sua DI è responsabile di fornire gli oggetti appropriati alla classe.

Inversione del controllo: il concetto dietro DI

Questo afferma che una classe non dovrebbe configurare staticamente le sue dipendenze ma dovrebbe essere configurata da un'altra classe dall'esterno.

È il quinto principio di S.O.L.I.D - i cinque principi di base della programmazione e della progettazione orientate agli oggetti di zio Bob - che afferma che una classe dovrebbe dipendere dall'astrazione e non dalle concrezioni (in termini semplici, codificati).

Secondo i principi, una classe dovrebbe concentrarsi sull'adempimento delle proprie responsabilità e non sulla creazione di oggetti necessari per adempiere a tali responsabilità. Ed è qui che entra in gioco l'iniezione di dipendenza: fornisce alla classe gli oggetti richiesti.

Nota: se vuoi conoscere i principi SOLIDI di Zio Bob, puoi andare a questo link.

Vantaggi dell'utilizzo di DI

  1. Aiuta a test unitari.
  2. Il codice della piastra della caldaia viene ridotto, poiché l'inizializzazione delle dipendenze viene eseguita dal componente dell'iniettore.
  3. L'estensione dell'applicazione diventa più semplice.
  4. Aiuta a abilitare l'accoppiamento libero, che è importante nella programmazione dell'applicazione.

Svantaggi di DI

  1. È un po 'complesso da imparare, e se abusato può portare a problemi di gestione e altri problemi.
  2. Molti errori di compilazione vengono inviati al runtime.
  3. I framework di iniezione delle dipendenze sono implementati con una riflessione o una programmazione dinamica. Ciò può ostacolare l'uso dell'automazione IDE, come "trova riferimenti", "mostra gerarchia di chiamate" e refactoring sicuro.

È possibile implementare l'iniezione di dipendenza da soli (Pure Vanilla) o utilizzare librerie o framework di terze parti.

Librerie e quadri che implementano DI

  • Primavera (Java)
  • Google Guice (Java)
  • Pugnale (Java e Android)
  • Castle Windsor (.NET)
  • Unità (NET)

Per saperne di più sull'iniezione delle dipendenze, puoi consultare le risorse seguenti:

Java Dependency Injection - Esercitazione sull'esempio di DI Design Pattern - JournalDev

Utilizzo dell'iniezione di dipendenza in Java - Introduzione - Tutorial - Vogella

Inversione dei contenitori di controllo e modello di iniezione di dipendenza - Martin Fowler

Spero che sia d'aiuto!

Se ti è piaciuto l'articolo e vuoi leggere altri articoli fantastici, seguimi qui (Bhavya Karia) e mostra il tuo supporto perché mi motiva a scrivere di più.

Se hai domande o feedback per me, allora connettiamoci su LinkedIn, Twitter, Facebook.

Modifica 1:

Grazie a Sergey Ufocoder ora questo articolo è stato convertito in lingua russa. I miei amici russi e che tutti sanno leggere la lingua russa lo danno.

Link all'articolo

Inoltre, se vuoi applicare DI in JavaScript e stai cercando una libreria, Jo Surikat ti suggerisce di provare la sua libreria.

Di-Ninja

Un'altra fantastica libreria DI in JavaScript è stata suggerita da Nicolas Froidure.

knifecycle

Modifica 2:

Se sei uno sviluppatore di PHP, non preoccuparti, anche tu sei coperto. Gordon Forsythe ha raccomandato questa straordinaria biblioteca che tutti voi potreste voler provare.

Auryn

Grazie per tutte le gentili parole che ho ricevuto. Condividi l'articolo in modo che sempre più persone possano essere avvantaggiate.

Se hai imparato anche una cosa o due, batti le mani quante più volte (50 ) per mostrare il tuo supporto!