Come spiegare l'iniezione di dipendenza a un bambino di 5 anni? [chiuso]


208

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?


72
Sembra che quel ragazzo abbia una vita difficile ...
ire_and_curses,

24
Inizia con "C'era una volta ....."
Martin,

1
Stiamo parlando di un principiante Java o di un bambino di cinque anni letterale?
Ha

2
# Iniezione di dipendenza # non dipende dall'età dello studente, è uguale per tutti
Rakesh Juyal,

2
Rakesh: il video introduttivo di JavaOne 2009 si basa sul presupposto che anche un anno 13 può essere uno sviluppatore Java perché Java è "ovunque" e "facile".
Esko,

Risposte:


789

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.


93

Che dire di questo?

Se hai una classe Employeee questo dipendente ne ha una Address puoi Employeedefinire 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 Employeeun'istanza hai bisogno di Addressun'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' Departmentattributo:

  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à Departmentdell'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 setAddresso setDepartment. Ciò sarebbe possibile mediante riflessione o generazione di codice o altre tecniche.

Quindi, la prossima volta che devi testare la Employeeclasse, puoi iniettare mock Addresse Departmentsoggetti senza dover codificare tutto il set / ottenere per tutti i tuoi test. Ancora meglio, puoi iniettare oggetti reali Address e Departmentnel 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.


3
Oppure: le iniezioni di dipendenza sono quando hai qualcosa che imposta le dipendenze per te. Questo qualcosa è di solito un quadro. :)
OscarRyz,

2
davvero molto intelligente.
OscarRyz,

24

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.


10

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.


7

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.


5
Sembra più una descrizione di interfacce o polimorfismo, ma ti do il merito di essere effettivamente comprensibile per un bambino di 5 anni.
Natix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.