208

Qual è un buon modo per spiegare dependency injection?Come spiegare l'iniezione di dipendenza a un bambino di 5 anni?

Ho trovato diversi tutorial su Google, ma nessuno di loro presuppone che il lettore sia solo un principiante Java. Come lo spiegheresti a un novizio?

+72

Sembra che quel ragazzo abbia una vita dura ... –

+24

Inizia con "C'era una volta ....." – Martin

+8

non insegnargli l'iniezione di dipendenza o qualsiasi cosa relativa alla programmazione ...... lasciagli godere vita – Xinus

risposta

790

Ti do un'iniezione di dipendenza per bambini di cinque anni.

Quando si va fuori dal frigorifero per conto proprio, si possono causare problemi. Potresti lasciare la porta aperta, potresti ottenere qualcosa che mamma o papà non vogliono che tu abbia. Potresti anche cercare qualcosa che non abbiamo nemmeno o che è scaduto.

Quello che dovresti fare è affermare un bisogno, "Ho bisogno di qualcosa da bere a pranzo", e poi ci assicureremo che tu abbia qualcosa quando ti siedi per mangiare.

+47

+1 - molto bello – Bob

+33

Questa risposta sta andando posti. –

+3

Assolutamente geniale. +1 –

10

Non so di nessun tutorial semplificate, ma posso darvi quasi 250-parole o meno Versione:

Con l'iniezione di dipendenza di un oggetto non configura il proprio componenti basati su cose che già conosce, piuttosto l'oggetto è configurato da una logica di livello superiore, e quindi chiama componenti che non avevano una precognizione incorporata. L'idea è di rendere l'oggetto più di un componente e meno di un'applicazione, spostando le attività di configurazione a un livello superiore. Ciò rende più probabile che l'oggetto sia utile in futuro o con una configurazione diversa.

È meglio per i test, è meglio quando arriva il momento di rivedere l'applicazione. Un'implementazione tipica mette la configurazione in XML e utilizza un framework per caricare dinamicamente le classi.

93

Che dire di questo?

Se si dispone di una classe Employee e questo dipendente ha un Address si può avere la classe Employee definito come segue:

class Employee { 
    private Address address; 

    // constructor 
    public Employee(Address newAddress) { 
     this.address = newAddress; 
    } 

    public Address getAddress() { 
    return this.address; 
    } 
    public void setAddress(Address newAddress) { 
     this.address = newAddress; 
    } 
} 

Tutto sembra bene finora.

Questo codice mostra una relazione HAS-A tra il dipendente e il suo indirizzo, va bene.

Ora, questa relazione HAS-A ha creato una dipendenza tra di loro. Il problema si presenta all'interno del costruttore.

Ogni volta che si desidera creare un'istanza Employee avete bisogno di un Address esempio:

Address someAddress = .... 
Employee oscar = new Employee(someAddress); 

Lavorando in questo modo diventa problematico soprattutto quando si desidera eseguire test di unità.

Il problema principale si verifica quando è necessario testare un particolare oggetto, è necessario creare un'istanza di altro oggetto e molto probabilmente è necessario creare un'istanza di ancora altro oggetto per farlo. La catena potrebbe diventare ingestibile.

Per evitare questo, si potrebbe cambiare il costruttore in questo modo:

public Employee(){ 
    } 

Utilizzando un costruttore senza argomenti.

Quindi è possibile impostare l'indirizzo quando vuoi:

Address someAddress = .... 
Employee oscar = new Employee(); 
oscar.setAddress(someAddress); 

Ora, questo può essere un peso, se si dispone di diversi attributi o se gli oggetti sono difficili da creare.

Eppure, pensare a questo, diciamo, è aggiungere l'attributo Department:

class Employee { 
     private Address address; 
     private Department department; 

    .... 

Se si dispone di 300 dipendenti, e tutti loro bisogno di avere il reparto stessa, e oltre a quello stesso reparto deve essere condiviso tra alcuni altri oggetti (come l'elenco di reparti dell'azienda, oi ruoli che ogni reparto ha, ecc.) allora avrai un momento difficile con la visibilità dell'oggetto Department e condividerlo attraverso tutta la rete di oggetti.

Che Injection Dependency è tutto su di esso per aiutare a, beh, "iniettare" queste dipendenze nel codice. La maggior parte dei framework ti permette di farlo specificando in un file esterno, quale oggetto deve essere iniettato.

Assumere un file di proprietà per un iniettore di dipendenza fittizia:

#mock employee 
    employee.address = MockAddress.class 
    employee.department = MockDepartment.class 

    #production setup 
    employee.address = RealAddress.class 
    employee.department = RealDepartment.class 

potrai definire cosa per iniettare per un determinato scenario.

Ciò che il framework Dependency Injector farà è impostare gli oggetti corretti per voi, in modo da non dover codificare setAddress o setDepartment. Ciò avverrebbe mediante riflessione, generazione di codice o altre tecniche.

Così, la prossima volta che avete bisogno di testare la classe Employee si può iniettare finte Address e Departments oggetti senza dover codificare tutti i set/get per tutto il vostro test. Ancora meglio, è possibile iniettare oggetti realiAddress e Department nel codice di produzione e avere comunque la certezza che il codice funzioni come testato.

Questo è praticamente tutto.

Ancora non penso che questa spiegazione sia adatta per un 5 anni come richiesto.

Spero che tu lo trovi ancora utile.

+3

Oppure: Le iniezioni di dipendenza si verificano quando * hai * qualcosa * che imposta le dipendenze per te. Questo qualcosa è di solito un quadro. :) – OscarRyz

+2

davvero uno intelligente. – OscarRyz

24

Quando si scrive un corso, è naturale che faccia uso di altri oggetti. Potresti avere una connessione al database, per esempio, o qualche altro servizio che usi. Questi altri oggetti (o servizi) sono delle dipendenze. Il modo più semplice per scrivere il codice è semplicemente creare e utilizzare quegli altri oggetti. Ma questo significa che il tuo oggetto ha una relazione inflessibile con queste dipendenze: indipendentemente dal motivo per cui stai invocando il tuo oggetto, usa le stesse dipendenze.

Una tecnica più potente è quella di essere in grado di creare il proprio oggetto e fornirlo con le dipendenze da utilizzare. Quindi potresti creare una connessione al database da usare, quindi consegnarla al tuo oggetto. In questo modo, puoi creare il tuo oggetto con dipendenze diverse in momenti diversi, rendendo il tuo oggetto più flessibile. Questa è l'iniezione di dipendenza, dove si "iniettano" le dipendenze nell'oggetto.

BTW: Nello stile moderno di presentazione delle foto di Flickr per illustrare concetti, questo potrebbe essere illustrato con un tossicodipendente che si sparava con la droga. Oh, aspetta, questa è dipendenza da iniezione ... OK, scusa, brutto scherzo.

+5

non è un brutto scherzo: D –

7

Quando ti viene assegnata una nuova console Nintendo, puoi semplicemente utilizzare i pulsanti e il touch screen per giocare.

Ma alla fabbrica Nintendo, hanno bisogno di sapere come metterne uno insieme.

Quando le persone intelligenti della fabbrica presentano un Nintendo DS, sarà diverso all'interno, ma saprai comunque come utilizzarlo.

+5

Questo suona più come una descrizione di interfacce o polimorfismo, ma ti do credito per * effettivamente * essere comprensibile per un bambino di 5 anni. – Natix