Qual è un buon modo per spiegare l' iniezione di dipendenza ?
Ho trovato diversi tutorial su Google, ma nessuno di questi potrebbe supporre che il lettore sia solo un principiante di Java. Come lo spiegheresti a un principiante?
Qual è un buon modo per spiegare l' iniezione di dipendenza ?
Ho trovato diversi tutorial su Google, ma nessuno di questi potrebbe supporre che il lettore sia solo un principiante di Java. Come lo spiegheresti a un principiante?
Risposte:
Ti do l'iniezione di dipendenza per i bambini di cinque anni.
Quando vai a prendere le cose dal frigorifero per te stesso, puoi causare problemi. Potresti lasciare la porta aperta, potresti avere 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 è dichiarare la necessità "Ho bisogno di qualcosa da bere a pranzo" e poi ci assicureremo che tu abbia qualcosa quando ti siedi per mangiare.
Che dire di questo?
Se hai una classe Employee
e questo dipendente ne ha una Address
puoi Employee
definire la classe 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;
}
}
Finora sembra tutto a posto.
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 trova nel costruttore.
Ogni volta che vuoi creare Employee
un'istanza hai bisogno di Address
un'istanza:
Address someAddress = ....
Employee oscar = new Employee( someAddress );
Lavorare in questo modo diventa problematico soprattutto quando si desidera eseguire test unitari.
Il problema principale si presenta quando è necessario testare un oggetto particolare, è necessario creare un'istanza di un altro oggetto e molto probabilmente è necessario creare un'istanza di un altro oggetto per farlo. La catena potrebbe diventare ingestibile.
Per evitare ciò, è possibile modificare il costruttore in questo modo:
public Employee(){
}
Utilizzando un costruttore no args.
Quindi puoi impostare l'indirizzo quando vuoi:
Address someAddress = ....
Employee oscar = new Employee();
oscar.setAddress( someAddress );
Ora, questo può essere un trascinamento, se hai diversi attributi o se gli oggetti sono difficili da creare.
Tuttavia, pensaci, diciamo, aggiungi l' Department
attributo:
class Employee {
private Address address;
private Department department;
....
Se hai 300 dipendenti e tutti devono avere lo stesso dipartimento e inoltre lo stesso dipartimento deve essere condiviso tra alcuni altri oggetti (come l'elenco delle società dei dipartimenti o i ruoli che ogni dipartimento ha ecc.), Allora avrai avere difficoltà con la visibilità Department
dell'oggetto e condividerlo con tutta la rete di oggetti.
Qual è l' iniezione di dipendenza al riguardo per aiutarti a "iniettare" queste dipendenze nel tuo codice. La maggior parte dei framework ti consente di farlo specificando in un file esterno quale oggetto deve essere iniettato.
Assumi un file delle proprietà per un iniettore di dipendenza fittizio:
#mock employee
employee.address = MockAddress.class
employee.department = MockDepartment.class
#production setup
employee.address = RealAddress.class
employee.department = RealDepartment.class
Definirai cosa iniettare per un determinato scenario.
Quello che farà il framework di Dependency Injector è impostare gli oggetti corretti per te, quindi non devi codificare setAddress
o setDepartment
. Ciò sarebbe possibile mediante riflessione o generazione di codice o altre tecniche.
Quindi, la prossima volta che devi testare la Employee
classe, puoi iniettare mock Address
e Departments
oggetti senza dover codificare tutto il set / ottenere per tutti i tuoi test. Ancora meglio, puoi iniettare oggetti reali Address
e Department
nel codice di produzione e avere comunque la sicurezza che il tuo codice funzioni come testato.
È praticamente tutto.
Comunque non penso che questa spiegazione sia adatta per un bambino di 5 anni come da lei richiesto.
Spero che lo trovi ancora utile.
Quando si scrive una classe, è naturale che faccia uso di altri oggetti. Potresti avere una connessione al database, ad esempio, o qualche altro servizio che usi. Questi altri oggetti (o servizi) sono dipendenze. Il modo più semplice per scrivere il codice è semplicemente quello di creare e usare quegli altri oggetti. Ciò significa che il tuo oggetto ha una relazione inflessibile con tali dipendenze: indipendentemente dal motivo per cui stai invocando il tuo oggetto, utilizza le stesse dipendenze.
Una tecnica più potente è quella di essere in grado di creare il tuo oggetto e fornirgli dipendenze da usare. Quindi potresti creare una connessione al database da usare, quindi passarla 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 delle dipendenze, in cui si "iniettano" le dipendenze nell'oggetto.
A proposito: nel moderno stile di presentazione dell'uso di foto di flickr per illustrare concetti, questo potrebbe essere illustrato con un tossicodipendente che si spara con la droga. Oh, aspetta, questa è dipendenza dall'iniezione ... OK, scusa, brutto scherzo.
Non conosco alcun tutorial semplificato, ma posso darti una versione di quasi 25 250 parole o meno:
Con l'iniezione delle dipendenze un oggetto non configura i propri componenti in base a cose che già conosce, piuttosto l'oggetto è configurato da una logica di livello superiore e quindi chiama componenti di cui non aveva una conoscenza preliminare incorporata. L'idea è di rendere l'oggetto più un componente e meno un'applicazione, trasferendo 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 inserisce la configurazione in XML e utilizza un framework per caricare dinamicamente le classi.
Quando ti viene dato un nuovo Nintendo, puoi semplicemente utilizzare i pulsanti e il touchscreen per giocare.
Ma nella fabbrica Nintendo, devono sapere come metterne uno insieme.
Quando le persone intelligenti in fabbrica pubblicheranno un Nintendo DS, all'interno sarà diverso, ma saprai comunque come usarlo.