Dagger 2 per sviluppatori Android principianti - Introduzione
Questo articolo è la prima parte di una serie di articoli destinati, secondo l'autore, a coloro che non possono occuparsi dell'iniezione di dipendenza e del framework Dagger 2 , o semplicemente lo faranno. Originale scritto il 18 novembre 2017. Le immagini e le GIF provengono dall'originale. Traduzione gratis.

Dagger 2 è un framework di iniezione delle dipendenze in fase di compilazione completamente statico per Java e Android . Dagger 2 è un adattamento supportato da Google del framework Dagger di Square .
Comprendere le dipendenze e le relazioni è il primo passo per ottenere una comprensione più chiara dei concetti di programmazione orientata agli oggetti. Allora cos'è la dipendenza? Ad esempio, abbiamo una classe
Due classi che si usano a vicenda sono chiamate "accoppiate" . La relazione tra le classi può essere "stretta" o "allentata" . Le dipendenze sono sempre dirette, cioè la classe
Le dipendenze sono cattive perché riducono la riutilizzabilità del codice e complicano anche il processo di test, il che rende il progetto più difficile da mantenere.
Le dipendenze possono essere di vario tipo: classe, interfaccia, da metodi, da campi, dirette, indirette e altre.

Dagger 2 è un framework di iniezione delle dipendenze in fase di compilazione completamente statico per Java e Android . Dagger 2 è un adattamento supportato da Google del framework Dagger di Square .
Per chi è questo articolo?
Se sei uno sviluppatore Android principiante che studia Android direttamente e contemporaneamente acquisisce conoscenza di Java , allora questo articolo fa per te. Se hai provato a imparare Dagger 2 e quello che hai trovato su Internet ti è sembrato un po' difficile - non preoccuparti, ci sono passato anch'io (siamo tutti un po' speciali, ognuno ha bisogno di un approccio diverso nello spiegare qualcosa) e questo l'articolo fa sicuramente al caso tuo. Se hai già familiarità con Dependency Injection e Dagger , puoi imparare qualcosa di nuovo o chiarire alcune cose per te stesso.Serie di articoli
- Dagger 2 per sviluppatori Android inesperti. Introduzione (sei qui) .
- Dagger 2 per sviluppatori Android inesperti. Iniezione di dipendenza. Parte 1.
- 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.
Requisiti
Si presume che tu abbia già familiarità con il linguaggio di programmazione Java , i principi OOP e lo sviluppo Android .Cos'è la dipendenza?
Nota: userò le analogie della serie TV Game of Thrones per spiegare questo concetto. Se non hai familiarità con questa serie, puoi sostituire i nomi delle classi con quelli più convenienti per te. E dovresti assolutamente iniziare a guardare questo spettacolo.Comprendere le dipendenze e le relazioni è il primo passo per ottenere una comprensione più chiara dei concetti di programmazione orientata agli oggetti. Allora cos'è la dipendenza? Ad esempio, abbiamo una classe
Targaryens
che usa un'altra classe o interfaccia chiamata internamenteDragons
... Quindi classeTargaryens
dipende dalla classe o dall'interfacciaDragons
... GIF
Ciò significa che la classeTargaryens
non posso lavorare senzaDragons
... Significa anche che ovunque verrà utilizzata la classeTargaryens
la classe sarà presenteDragons
, cioè, non possiamo riutilizzareTargaryens
nessun riutilizzoDragons
... In questo casoTargaryens
È la classe dipendente, eDragons
- È dipendenza. Il tossicodipendente dipende dalle loro dipendenze.Due classi che si usano a vicenda sono chiamate "accoppiate" . La relazione tra le classi può essere "stretta" o "allentata" . Le dipendenze sono sempre dirette, cioè la classe
Targaryens
dipende daDragons
ma classeDragons
potrebbe non dipendere dalla classeTargaryens
...class Targaryens {
public Targaryens () {
// Every time we use Targaryens we need to instantiate Dragons
Dragons dragons = new Dragons ();
dragons.callForWar ();
}
}
Perché le dipendenze fanno male?
Un gran numero di dipendenze in una classe porta a problemi di dipendenza difficile , il che è negativo per i seguenti motivi:- Le possibilità di riutilizzo del codice sono ridotte.
- Il processo di test diventa più complicato.
- La manutenibilità del codice peggiora man mano che il progetto cresce.
# Riutilizzabile (riutilizzabilità)
Quando classi e metodi sono accoppiati in modo lasco, non correlati o indipendenti da molti altri, la riutilizzabilità del codice aumenta. Il riutilizzo del codice è una delle idee di base della programmazione orientata agli oggetti.#Test
Per i test, puoi simulare oggetti specifici. Ma se ci sono molte dipendenze in una classe o in un metodo, sarà difficile testarlo. Se la classe Java (ad esempio,Targaryens
) crea un'istanza di un'altra classe (Dragons
) tramite l'operatorenew
, allora questa classe (Targaryens
) non può essere testato indipendentemente dalla classe creata tramite l'operatorenew
(Dragons
).# Supportato (mantenibilità)
Quando il codice non può essere testato correttamente, parti di esso sono impossibili o difficili da riutilizzare e il progetto continua a crescere, allora il progetto diventa molto difficile da mantenere. La manutenibilità dipende da molti altri fattori, ma finché i nuovi sviluppatori del tuo team comprendono il sistema e rendono più confortevole il lavoro dei colleghi, il tuo progetto è ancora supportato.Tipi di dipendenza
Esistono molti tipi di dipendenze, ma si possono distinguere le principali:- Dipendenza dalle classi.
- Dipendenza dalle interfacce.
- Dipendenza da metodi o campi.
- Dipendenza diretta e indiretta.
# Dipendenza dalle classi
Abbiamo visto un esempio di dipendenza di classe in precedenza. Costruttore di classiTargaryens
dipende o ha bisogno di una classeDragons
chiamare il metodocallForWar()
...# Dipendenza dalle interfacce
MetodoexecutePlan
accetta l'interfacciaWarStrategy
come dipendenza.WarStrategy
può essere venduto da tutte le casate (Targaryen, Stark, Lannister e così via).public Result executePlan (WarStrategy strategy) {
// WarStrategy is implemented by all houses
}
# Dipendenza da metodi o campi
Il seguente metodo prende un oggettoHouseClass
, e il metodo che chiamagetKing()
è una dipendenza che non può essere identificata nella firma del metodo.public String extractName (HouseClass house) {
return house.getKing ();
// returns the name of the king of a particular house
}
# Dipendenze dirette e indirette
Permettetemi di divagare con un altro esempio. ClasseTargaryens
dipende dalla classeStarks
nella conquista del trono. MaStarks
dipendono da altri regni del nord, per esempio,Mormont
... Quindi si scopre cheTargaryens
dipendono direttamente daStarks
e indirettamente daMormont
...Sommario
Se una classe Java crea un'istanza di un'altra classe tramite l'operatorenew
, quindi questa classe non può essere utilizzata o testata indipendentemente dalla classe creata tramite l'operatorenew
... Questa si chiama dipendenza.Le dipendenze sono cattive perché riducono la riutilizzabilità del codice e complicano anche il processo di test, il che rende il progetto più difficile da mantenere.
Le dipendenze possono essere di vario tipo: classe, interfaccia, da metodi, da campi, dirette, indirette e altre.