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.
Sembra che quel ragazzo abbia una vita dura ... –
Inizia con "C'era una volta ....." – Martin
non insegnargli l'iniezione di dipendenza o qualsiasi cosa relativa alla programmazione ...... lasciagli godere vita – Xinus