Dagger 2 per sviluppatori Android inesperti. Iniezione di dipendenza. Parte 1
Questo articolo è la seconda parte di una serie di articoli destinati, secondo l'autore, a coloro che non possono comprendere l' iniezione di dipendenza e il framework Dagger 2 , o semplicemente lo faranno. Originale scritto il 25 novembre 2017. Le immagini e le GIF provengono dall'originale. Traduzione gratis.

Questo è il secondo articolo della serie Dagger 2 per sviluppatori Android principianti. ... Se non hai letto il primo, allora sei qui .
Prima di esaminare l'iniezione di dipendenza, dobbiamo capire come evitare la trappola di essere circondati da dipendenze. Il problema dei legami forti (forte dipendenza) come gli Estranei (White Walkers). Non dobbiamo arruolarci nel loro esercito, al contrario, dobbiamo trovare un modo per sconfiggerli.
L'iniezione di dipendenza è solo un metodo per evitare relazioni forti. Ci sono molti altri modi. Per lo sviluppo Android, questo metodo è considerato il più semplice e molti progetti su larga scala utilizzano una strategia di iniezione delle dipendenze.
Confrontalo con Game of Thrones. Cersei si sta preparando per una grande guerra. Invece di bruciare tutti i soldi del suo regno, cerca di ottenere un prestito dalla banca di ferro di Braavos. In questa situazione, il denaro è dipendenza. Tutte le case hanno bisogno di soldi per fare la guerra. Pertanto, un oggetto esterno (banco di ferro) inietterà dipendenza (denaro) da oggetti dipendenti (case).
In altre parole, l'iniezione di dipendenza si basa sul concetto di inversione del controllo , che dice che una classe dovrebbe ricevere le sue dipendenze dall'esterno. In poche parole, nessuna classe dovrebbe creare un'istanza di un'altra classe, ma dovrebbe ricevere tutte le istanze dalla classe di configurazione.
Successivamente, devi portare entrambe le case in guerra. Creiamo una classe
In un'applicazione orientata agli oggetti ben progettata, ogni oggetto ha un numero minimo di responsabilità, gli oggetti si affidano ad altri per fare la maggior parte del lavoro. In questo esempio, la classe
Sebbene l'opzione di creare dipendenze all'interno del costruttore di classi funzioni abbastanza bene in piccole applicazioni, introduce degli svantaggi man mano che il progetto cresce.
In primo luogo, la classe diventa piuttosto inflessibile. Se l'applicazione deve essere eseguita su più piattaforme o in più modalità, ad esempio, è necessario sostituire la classe
In secondo luogo, non è possibile testare queste classi in isolamento. istanza
Come accennato in precedenza, combattere le forti dipendenze è come combattere gli Estranei senza le armi adeguate.
L'iniezione di dipendenza è una tecnica per risolvere o prevenire il problema dei collegamenti forti. Esponendo le dipendenze all'esterno, questo metodo rende la classe indipendente, verificabile e gestibile.
Abbiamo anche esaminato un esempio con dipendenze rigide , creando uno scenario di battaglia bastardo.

Questo è il secondo articolo della serie Dagger 2 per sviluppatori Android principianti. ... Se non hai letto il primo, allora sei qui .
Serie di articoli
- Dagger 2 per sviluppatori Android inesperti. Introduzione.
- Dagger 2 per sviluppatori Android inesperti. Iniezione di dipendenza. Parte 1 (sei qui) .
- Dagger 2 per sviluppatori Android inesperti. Iniezione di dipendenza. Parte 2 .
- Dagger 2 per sviluppatori Android inesperti. Pugnale 2.Parte 1 .
- Dagger 2 per sviluppatori Android inesperti. Pugnale 2.Parte 2 .
- Dagger 2 per sviluppatori Android inesperti. Pugnale 2. Livello avanzato.
Parte 1 . - Dagger 2 per sviluppatori Android inesperti. Pugnale 2. Livello avanzato.
Parte 2.
All'inizio della serie
Nell'ultimo articolo abbiamo discusso delle dipendenze. Abbiamo imparato cos'è una dipendenza, discusso i loro tipi, l'impatto sul processo di sviluppo e la manutenibilità del progetto.Che cos'è l' iniezione di dipendenza (DI)
In precedenza, abbiamo capito cos'è la dipendenza e come influisce su un progetto. Ora diamo un'occhiata a cos'è l'iniezione di dipendenza.Prima di esaminare l'iniezione di dipendenza, dobbiamo capire come evitare la trappola di essere circondati da dipendenze. Il problema dei legami forti (forte dipendenza) come gli Estranei (White Walkers). Non dobbiamo arruolarci nel loro esercito, al contrario, dobbiamo trovare un modo per sconfiggerli.
media
Strategia per risolvere il problema dei legami forti (hard dependency) o il problema degli Estranei
Abbiamo bisogno di un piano chiaro per affrontare o prevenire legami forti. Questa strategia o piano è chiamata iniezione di dipendenza (DI) . In altre parole, per uccidere l'Estraneo, devi bruciarlo o usare un'arma di vetro di drago. Allo stesso modo, per evitare legami forti, è necessario utilizzare l'iniezione di dipendenza.L'iniezione di dipendenza è solo un metodo per evitare relazioni forti. Ci sono molti altri modi. Per lo sviluppo Android, questo metodo è considerato il più semplice e molti progetti su larga scala utilizzano una strategia di iniezione delle dipendenze.
Metodo di iniezione delle dipendenze
L'iniezione di dipendenza è una tecnica in cui un oggetto espone le dipendenze di un altro oggetto. Una dipendenza è un oggetto che possiamo usare (un servizio ). L'iniezione (iniezione) è il trasferimento di una dipendenza a un oggetto dipendente ( client ), che utilizzerà questa dipendenza. Il servizio fa parte dello stato del cliente. La fornitura di un servizio al client anziché consentire al client di creare o trovare un servizio è un requisito di base del modello di progettazione Dependency Injection (DI) .Confrontalo con Game of Thrones. Cersei si sta preparando per una grande guerra. Invece di bruciare tutti i soldi del suo regno, cerca di ottenere un prestito dalla banca di ferro di Braavos. In questa situazione, il denaro è dipendenza. Tutte le case hanno bisogno di soldi per fare la guerra. Pertanto, un oggetto esterno (banco di ferro) inietterà dipendenza (denaro) da oggetti dipendenti (case).
In altre parole, l'iniezione di dipendenza si basa sul concetto di inversione del controllo , che dice che una classe dovrebbe ricevere le sue dipendenze dall'esterno. In poche parole, nessuna classe dovrebbe creare un'istanza di un'altra classe, ma dovrebbe ricevere tutte le istanze dalla classe di configurazione.
Esempio 1
Smetti di parlare. Smontiamo il codice. Diamo un'occhiata a un piccolo esempio con due scenari. Nel primo scenario, creeremo diverse classi con dipendenze rigide , ovvero senza utilizzare l'iniezione di dipendenza. Quindi, seguendo il modello di iniezione di dipendenza, ci liberiamo dei legami forti.Scenario 1. Senza usare l'iniezione di dipendenza
Problema: Battle bastard - Starkey (Starks) Bolton (Boltons) si preparano alla guerra per catturare il Nord. Dobbiamo prepararli e portarli in guerra. media
Poiché l'esempio può includere molte case, creiamo un'interfaccia generaleHouse
, includeremo i metodiprepareForWar()
ereportForWar()
...public interface House {
void prepareForWar();
void reportForWar();
}
Quindi, creiamo classi per le case.Starks
eBoltons
... Le classi implementeranno l'interfacciaHouse
...public class Starks implements House {
@Override
public void prepareForWar () {
// something happens
System.out.println (this.getClass (). GetSimpleName () + "prepared for war");
}
@Override
public void reportForWar () {
// something happens
System.out.println (this.getClass (). GetSimpleName () + "reporting ..");
}
}
public class Boltons implements House {
@Override
public void prepareForWar () {
// something happens
System.out.println (this.getClass (). GetSimpleName () + "prepared for war");
}
@Override
public void reportForWar () {
// something happens
System.out.println (this.getClass (). GetSimpleName () + "reporting ..");
}
}
La nota:this.getClass().getSimpleName()
restituisce solo il nome della classeSuccessivamente, devi portare entrambe le case in guerra. Creiamo una classe
War
e chiedi a entrambe le case di prepararsi per la guerra e di denunciarla.public class War {
private Starks starks;
private Boltons boltons;
public War(){
starks = new Starks();
boltons = new Boltons();
starks.prepareForWar();
starks.reportForWar();
boltons.prepareForWar();
boltons.reportForWar();
}
}
Analizzare la guerra
Considera il costruttore di classiWar
... Ha bisogno di due classi per lavorareStarks
eBoltons
... Queste classi vengono create all'interno del costruttore, preparano la guerra e la segnalano.In un'applicazione orientata agli oggetti ben progettata, ogni oggetto ha un numero minimo di responsabilità, gli oggetti si affidano ad altri per fare la maggior parte del lavoro. In questo esempio, la classe
War
dipende daStarks
eBoltons
... Queste sono dipendenze di classeWar
... Senza di loroWar
non funzionerà. Prima che una classe possa iniziare a svolgere funzioni reali, tutte le sue dipendenze devono essere soddisfatte in qualche modo. Dipendenze di classeWar
in questo esempio sono soddisfatte istanziando le classi nel costruttore.Sebbene l'opzione di creare dipendenze all'interno del costruttore di classi funzioni abbastanza bene in piccole applicazioni, introduce degli svantaggi man mano che il progetto cresce.
In primo luogo, la classe diventa piuttosto inflessibile. Se l'applicazione deve essere eseguita su più piattaforme o in più modalità, ad esempio, è necessario sostituire la classe
Boltons
ad un altro o dividerlo in più oggetti. Non diventa così facile farlo.In secondo luogo, non è possibile testare queste classi in isolamento. istanza
War
crea automaticamente altri due oggetti che verranno eventualmente testati insieme alla classeWar
... Questo può diventare un problema se uno degli oggetti dipende da una risorsa esterna costosa, ad esempio,Allies
(alleati) o uno degli oggetti stesso dipende da molti altri.Come accennato in precedenza, combattere le forti dipendenze è come combattere gli Estranei senza le armi adeguate.
Sommario
In questo articolo, abbiamo trattato in dettaglio le dipendenze e l'iniezione di dipendenza. Nessuna classe dovrebbe creare un'istanza di un'altra classe, ma dovrebbe ricevere tutte le istanze dalla classe di configurazione.L'iniezione di dipendenza è una tecnica per risolvere o prevenire il problema dei collegamenti forti. Esponendo le dipendenze all'esterno, questo metodo rende la classe indipendente, verificabile e gestibile.
Abbiamo anche esaminato un esempio con dipendenze rigide , creando uno scenario di battaglia bastardo.
Qual è il prossimo?
Nel prossimo articolo, implementeremo la classeWar
utilizzando il pattern Dependency Injection con l'approccio tradizionale.