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

introduzione

Nell'ingegneria del software, l' inserimento delle dipendenze è una tecnica con cui 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 ancora, ma non è particolarmente facile da capire. Quindi capiamolo meglio.

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

Dipendenza o dipendenza significa fare affidamento su qualcosa per il supporto. Come se dicessi che ci affidiamo troppo ai telefoni cellulari di quanto significhi che dipendiamo da loro.

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

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

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

Quindi, il trasferimento dell'attività di creazione dell'oggetto a qualcun altro e l'utilizzo diretto della dipendenza è chiamato inserimento delle dipendenze.

Perché dovrei usare l'inserimento delle dipendenze?

Supponiamo di avere una classe di auto che contiene vari oggetti come ruote, motore, ecc.

Qui la classe car è responsabile della creazione di tutti gli oggetti di dipendenza. E se decidessimo di abbandonare MRFWheels in futuro e volessimo usare Yokohama Wheels?

Avremo bisogno di ricreare l'oggetto auto con una nuova dipendenza da Yokohama. Ma quando si utilizza l'inserimento 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 all'intermediario nel nostro codice che fa tutto il lavoro di creare l'oggetto ruote preferito e fornirlo alla classe Auto.

Rende la nostra classe Auto indipendente dalla creazione degli oggetti di Ruote, Batteria, ecc.

Esistono fondamentalmente tre tipi di inserimento delle dipendenze:

  1. iniezione del costruttore: le dipendenze vengono fornite tramite un costruttore di classi.
  2. setter injection: il client espone un metodo setter che l'iniettore utilizza per iniettare la dipendenza.
  3. iniezione di interfaccia: la dipendenza fornisce un metodo iniettore che inietterà la dipendenza in qualsiasi client passato ad essa. I client devono implementare un'interfaccia che esponga un metodo setter che accetti 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, allora DI lo esamina e non dovrebbe riguardare la classe che usa quegli oggetti. In questo modo, se gli oggetti cambiano in futuro, è responsabilità del DI fornire gli oggetti appropriati alla classe.

Inversione del controllo: il concetto alla base di 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 SOLID - ilcinque principi di base della programmazione e progettazione orientata agli oggetti di Uncle Bob - che afferma che una classe dovrebbe dipendere dall'astrazione e non dalle concrezioni (in termini semplici, hard-coded).

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'inserimento delle dipendenze : fornisce alla classe gli oggetti richiesti.

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

Vantaggi dell'utilizzo di DI

  1. Aiuta negli unit test.
  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ù facile.
  4. Aiuta ad 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 in fase di compilazione vengono inviati in fase di esecuzione.
  3. I framework di inserimento delle dipendenze vengono implementati con la riflessione o la programmazione dinamica. Questo può ostacolare l'uso dell'automazione IDE, come "trova riferimenti", "mostra gerarchia delle chiamate" e refactoring sicuro.

Puoi implementare l'inserimento delle dipendenze da solo (Pure Vanilla) o utilizzare librerie o framework di terze parti.

Librerie e framework che implementano DI

  • Primavera (Java)
  • Google Guice (Java)
  • Dagger (Java e Android)
  • Castle Windsor (.NET)
  • Unity (.NET)

Per ulteriori informazioni sull'inserimento delle dipendenze, puoi consultare le risorse seguenti:

Java Dependency Injection - Tutorial di esempio di design pattern DI - JournalDev

Utilizzo dell'inserimento delle dipendenze in Java - Introduzione - Tutorial - Vogella

Inversione dei contenitori di controllo e del modello di iniezione delle dipendenze - Martin Fowler

Spero che sia d'aiuto!

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

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

Modifica 1:

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

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 PHP, non preoccuparti, hai anche coperto tutto. Gordon Forsythe ha consigliato questa fantastica libreria 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 solo una o due cose, per favore condividi questa storia!