Domanda

Inversion of Control (o IoC) può essere molto confusa quando si è incontrato per la prima volta.

  1. Che cosa è?
  2. Quale problema risolve?
  3. Quando è opportuno utilizzare e quando no?
È stato utile?

Soluzione

L'Inversion of Control (IoC) e la Dependency Injection (DI) i modelli sono tutti circa la rimozione delle dipendenze dal codice.

Ad esempio, dire la vostra applicazione è un editor di testo, componente e si desidera fornire il controllo ortografico.Il codice sarebbe simile a questa:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Quello che abbiamo fatto qui crea una dipendenza tra il TextEditor e il SpellChecker.In un Cio scenario vorremmo invece fare qualcosa di simile a questo:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

Nel primo esempio di codice ci sono istanziare SpellChecker (this.checker = new SpellChecker();), il che significa che il TextEditor classe dipende direttamente dalla SpellChecker classe.

Nel secondo esempio di codice ci sono la creazione di un'astrazione dal fatto di avere il SpellChecker classe dipendenza in TextEditor costruttore firma (non l'inizializzazione di dipendenza in classe).Questo ci permette di chiamare la dipendenza quindi passare il TextEditor classe in questo modo:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Ora il client creazione di TextEditor di classe ha il controllo su quali SpellChecker implementazione usare perché stiamo iniettando la dipendenza dell' TextEditor firma.

Questo è solo un semplice esempio, c'è una buona serie di articoli da Simone Busoli che spiega in modo dettagliato.

Altri suggerimenti

Inversione del Controllo è quello che si ottiene quando il programma richiamate, ad es.come un programma con interfaccia grafica.

Per esempio, in una vecchia scuola di menu, si potrebbe avere:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

ciò consente di controllare il flusso di interazione con l'utente.

In un programma con interfaccia grafica o somesuch, invece, diciamo:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

Così ora il controllo è invertito...invece del computer accettare l'input dell'utente in un ordine fisso, l'utente controlla l'ordine in cui vengono immessi i dati, e quando i dati vengono salvati nel database.

Fondamentalmente, nulla con un ciclo di eventi, callback, oppure eseguire il trigger rientra in questa categoria.

Che cosa è l'Inversione di Controllo?

Se si seguono queste semplici operazioni, hanno fatto inversione di controllo:

  1. Separato cosaa fare la parte da quandoa fare la parte.
  2. Assicurarsi che quando sa come poco come possibile circa cosa parte;e viceversa.

Ci sono diverse tecniche possibili per ognuna di queste fasi si basano sulla tecnologia/linguaggio che si sta utilizzando per l'attuazione.

--

Il inversione parte di Inversion of Control (IoC) è confusa;perché inversione è un termine relativo.Il modo migliore per capire Cio è di dimenticare che la parola!

--

Esempi

  • La Gestione Degli Eventi.I Gestori di eventi (cosa-fare parte) -- la generazione di Eventi (quando a fare parte)
  • Interfacce.Componente client (quando a fare parte) -- Componente implementazione dell'Interfaccia (cosa-fare parte)
  • xUnit apparecchio.Setup e TearDown (cosa-fare parte) -- xUnit quadri chiamate per l'Installazione di inizio e di Demolizione alla fine (quando a fare parte)
  • Metodo di modello di modello di progettazione.modello metodo di -- primitiva sottoclasse di attuazione per fare parte
  • DLL contenitore di metodi in COM.DllMain, DllCanUnload, ecc (cosa-fare parte) -- COM/OS (quando a fare parte)

Inversione di Controlli sulla distinzione riguarda.

Senza Cio:Si dispone di un computer portatile computer e accidentalmente rompere lo schermo.E maledizione, è possibile trovare lo stesso modello di schermo del computer portatile è in nessuna parte del mercato.Quindi sei bloccato.

Con Cio:Si dispone di un desktop computer e accidentalmente rompere lo schermo.Si può solo afferrare qualsiasi desktop monitor dal mercato, e funziona bene con il vostro desktop.

Il tuo desktop con successo implementa Cio in questo caso.Accetta una varietà di tipo di monitor, mentre il portatile non necessita di una specifica dello schermo per ottenere fisso.

Inversion of Control (o Cio), è di circa ottenere la libertà (Ti sposi, hai perso la libertà e si sono controllati.È divorziato, appena implementato Inversione del Controllo.Che è quello che abbiamo chiamato, "disaccoppiati".Un buon sistema di computer scoraggia alcuni rapporto molto stretto.) più flessibilità (La cucina in ufficio serve solo acqua di rubinetto pulita, che è l'unica scelta quando si vuole bere.Il tuo capo implementato Inversione del Controllo mediante costituzione di una nuova macchina per il caffè.Ora si ottiene la flessibilità di scegliere l'acqua del rubinetto o del caffè.) e di una minore dipendenza (Il tuo compagno ha un lavoro, non hanno un lavoro, è finanziariamente dipende dal vostro partner, quindi, sono controllati.Si trova un lavoro, si sono implementate Inversione del Controllo.Un buon sistema di computer incoraggia in-dipendenza.)

Quando si utilizza un computer desktop, avete slave (o dire, controllato).È necessario sedersi davanti a uno schermo e guardare.Utilizzare la tastiera per digitare e usare il mouse per navigare.E un software mal progettato può slave è ancora di più.Se si sostituisce il desktop con un portatile, quindi è un po ' invertita di controllo.Si può facilmente prendere e spostare in giro.Così ora è possibile controllare dove sono con il computer, invece che al computer controllo di essa.

Mediante l'attuazione di Inversion of Control, un software/oggetto consumatore di ottenere di più per il controllo/opzioni sul software/oggetti, invece di essere controllato o di avere un minor numero di opzioni.

Con le idee di cui sopra in mente.Ci manca ancora una parte fondamentale del Cio.Nello scenario del Cio, il software in oggetto di consumo è un sofisticato framework.Questo significa che il codice che hai creato non è chiamato da soli.Ora proviamo a spiegare perché in questo modo funziona meglio per un'applicazione web.

Supponiamo che il tuo codice è un gruppo di lavoratori.Hanno bisogno di costruire una macchina.Questi lavoratori hanno bisogno di un luogo e di strumenti (software framework) per costruire l'auto.Un tradizionale software framework sarà come un garage con molti strumenti.Così i lavoratori hanno bisogno di fare un piano di se stessi e di utilizzare gli strumenti per costruire la macchina.La costruzione di un auto non è un'attività facile, sarà davvero difficile per i lavoratori di pianificare e di collaborare.Un moderno il software del quadro, come una moderna fabbrica di automobili con tutti i servizi e i gestori del posto.I lavoratori non devono effettuare alcun piano, i gestori (parte del quadro, sono le persone più intelligenti e più sofisticati piano) per coordinare in modo che i lavoratori non sapere quando fare il loro lavoro (quadro chiama il tuo codice).I lavoratori devono essere sufficientemente flessibili per l'utilizzo di tutti gli strumenti di i gestori dare a loro (tramite l'Iniezione di Dipendenza).

Anche se i lavoratori danno il controllo di gestione il progetto di alto livello per i dirigenti (il quadro).Ma è bene avere alcuni professionisti aiutare.Questo è il concetto di Cio veramente venire da.

Moderne applicazioni Web con architettura MVC dipende dal framework per eseguire il Routing URL e mettere il Controller per il quadro di chiamata.

La Dependency Injection e Inversion of Control sono correlati.L'Iniezione di dipendenza è in micro livello e Inversion of Control è in macro livello.Devi mangiare ogni boccone (implementazione DI), per terminare un pasto (implementare Cio).

Prima di utilizzare Inversion of Control si dovrebbe essere ben consapevole del fatto che ha i suoi pro e contro e si dovrebbe sapere perché si dovrebbe usare se si fa così.

Pro:

  • Il codice viene disaccoppiato in modo che si può facilmente scambiare le implementazioni di un'interfaccia con le implementazioni alternative
  • Si tratta di una forte motivazione per la codifica contro le interfacce invece di implementazioni
  • E ' molto facile scrivere unit test per codice, poiché non dipende da nient'altro che gli oggetti che si accetta nel suo costruttore/setter e si può facilmente inizializzare con il diritto di oggetti in isolamento.

Contro:

  • Cio non solo inverte il flusso di controllo del programma, inoltre, nuvole notevolmente.Questo significa che è possibile non solo leggere il codice e saltare da un posto all'altro perché le connessioni che sarebbe normalmente nel codice non sono nel codice più.Invece è nel file di configurazione XML o le annotazioni e il codice del tuo IoC container che interpreta questi metadati.
  • Nasce una nuova classe di bug dove si ottiene la vostra configurazione XML o le annotazioni di sbagliato e si può spendere un sacco di tempo a cercare di capire perché il vostro IoC container inietta un riferimento null in uno dei tuoi oggetti in determinate condizioni.

Personalmente vedo i punti di forza di Cio, e mi piace molto di loro, ma io tendo a evitare Cio, ogni qualvolta possibile, perché trasforma il vostro software in un insieme di classi che non costituiscono più un "vero" programma ma solo qualcosa che deve essere messo insieme da XML di configurazione o di annotazione metadati e sarebbe caduta (e cade) a parte senza di essa.

  1. Articolo Di Wikipedia.Per me, inversion of control è trasformare il vostro in sequenza codice scritto e trasformandolo in una struttura della delega.Invece il tuo programma in modo esplicito il controllo di tutto, il programma consente di impostare una classe o di una libreria con determinate funzioni, chiamato quando certe cose accadono.

  2. Si risolve la duplicazione del codice.Per esempio, nei vecchi tempi, si dovrebbe scrivere manualmente il ciclo di eventi, di polling le librerie di sistema per i nuovi eventi.Oggigiorno, la maggior parte dei moderni Api basta dire le librerie di sistema quali eventi ti interessa, e ti consente di sapere quando si verificano.

  3. Inversion of control è un modo pratico per ridurre la duplicazione del codice, e se vi trovate la copia di un intero metodo e cambiando solo un piccolo pezzo di codice, si può prendere in considerazione di affrontare con inversione del controllo.Inversion of control è facile in molte lingue, attraverso il concetto di delegati, interfacce, o anche prima di puntatori a funzione.

    Non è opportuno utilizzare in tutti i casi, perché il flusso di un programma può essere più difficile da seguire quando scritto in questo modo.È un modo utile per i metodi di progettazione, durante la scrittura di una biblioteca che sarà riutilizzato, ma deve essere usato con parsimonia nel nucleo del vostro programma, a meno che davvero risolve un problema di duplicazione di codice.

Ma credo che si debba essere molto attenti con esso.Se volete abusare di questo modello, è molto complicato design e ancora più complicato il codice.

Come in questo esempio con TextEditor:se si dispone di un solo correttore Ortografico forse non è proprio necessario usare Cio ?A meno che non avete bisogno di scrivere unit test o qualcosa del genere ...

Comunque:essere ragionevole.Modello di progettazione sono buone pratiche ma la Bibbia non può essere insegnata.Non si attaccano ovunque.

Si supponga di un oggetto.E si va in un ristorante:

Senza Cio:si chiede "apple", e si è sempre servita di apple quando si chiedere di più.

Con Cio:È possibile chiedere il "frutto".È possibile ottenere diversi tipi di frutta ogni volta che si ottiene servita.per esempio, mela, arancia, o melone d'acqua.

Così, ovviamente, Cio è preferito quando ti piace la varietà.

IoC / DI me sta spingendo fuori dipendenze di chiamare gli oggetti.Super semplice.

La non-risposta dei tecnici è in grado di scambiare il motore di una macchina poco prima che si accende.Se tutto ganci in alto a destra (l'interfaccia), vi sono buone.

  1. Inversion of control è un modello utilizzato per il disaccoppiamento dei componenti e livelli del sistema.Il modello è implementato attraverso l'iniezione delle dipendenze in un componente di quando è stata costruita.Queste dipendenze sono forniti di solito come interfacce per ulteriore disaccoppiamento e per il supporto di testabilità.IoC / DI contenitori come il Castello di Windsor, l'Unità sono strumenti (librerie) che può essere utilizzato per la fornitura dei Cio.Questi strumenti forniscono funzionalità estese al di sopra e al di là della semplice gestione delle dipendenze, compresa la vita, AOP / Intercettazione, la politica, etc.

  2. un.Allevia un componente da un responsabile per la gestione è di dipendenze.
    b.Offre la possibilità di scambiare dipendenza implementazioni in ambienti diversi.
    c.Permette una componente di essere testato attraverso beffardo di dipendenze.
    d.Fornisce un meccanismo per la condivisione di risorse all'interno di un'applicazione.

  3. un.Critico quando si fa il test-driven development.Senza Cio può essere difficile prova, perché i componenti sono sottoposti a test sono altamente accoppiato al resto del sistema.
    b.Critico durante lo sviluppo di sistemi modulari.Un sistema modulare è un sistema i cui componenti possono essere sostituiti senza che richiedere la ricompilazione.
    c.Critiche se ci sono molte questioni trasversali che devono affrontare, partilarly in un'applicazione enterprise.

Scriverò il mio semplice la comprensione di questi due termini:

For quick understanding just read examples*

La Dependency Injection(DI):
L'iniezione di dipendenza, in genere, significa il passaggio di un oggetto su cui il metodo dipende, come parametro di un metodo, piuttosto che il metodo di creare l'oggetto dipendente.
Che cosa significa, in pratica, è che il metodo non dipende direttamente da una particolare implementazione;qualsiasi applicazione che soddisfa i requisiti può essere passato come parametro.

Con questi oggetti raccontano le loro dipendenze.E la primavera rende disponibile.
Questo porta a loosely coupled lo sviluppo di applicazioni.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inversion of Control(IoC) Contenitore:
Questa è una caratteristica comune di quadri CIO gestisce gli oggetti java
– dalla creazione di un'istanza di distruzione attraverso la sua BeanFactory.
-Componenti Java che vengono istanziati dal IoC container sono chiamati fagioli, e il IoC container gestisce un fagiolo ambito, eventi del ciclo di vita, e qualsiasi AOP caratteristiche per i quali è stato configurato e codificati.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Mediante l'attuazione di Inversion of Control, un software/oggetto consumatore di ottenere di più per il controllo/opzioni sul software/oggetti, invece di essere controllato o avere meno opzioni.

Inversione di controllo come una linea guida di progettazione propone le seguenti finalità:

C'è un disaccoppiamento dell'esecuzione di un determinato compito, a partire dall'implementazione.
Ogni modulo può concentrarsi su ciò che è stato progettato per.
I moduli di non fare ipotesi su ciò che agli altri sistemi, ma si basano sui loro contratti.
La sostituzione dei moduli ha nessun effetto collaterale su altri moduli
Io non mancherà di tenere le cose astratte, qui, È possibile visitare il seguente link per dettagli comprensione dell'argomento trattato.
Una buona lettura, con l'esempio

Spiegazione dettagliata

Rispondere solo la prima parte.Che cosa è?

Inversion of Control (IoC) significa creare istanze di dipendenze di prima e ultima istanza di una classe (facoltativamente iniettando attraverso costruttore), invece di creare un'istanza della classe prima e quindi l'istanza della classe la creazione di istanze di dipendenze.Così, inversion of control inverte il flusso di controllo del programma. Invece di il chiamato controllo il flusso di controllo (durante la creazione di dipendenze), il chiamante controlla il flusso di controllo del programma.

Per esempio, attività#1 è quello di creare l'oggetto.Senza CIO concetto, attività#1 dovrebbe essere fatto dal Programmatore.Ma Con CIO concetto, attività#1 dovrebbe essere fatto da contenitore.

In breve il Controllo viene invertita da Programmatore a contenitore.Quindi, è chiamato inversion of control.

Ho trovato un buon esempio qui.

Lasciate dire che facciamo una riunione in alcuni hotel.

Molte persone, molte caraffe di acqua, molti bicchieri di plastica.

Quando qualcuno vuole bere, lei riempire la tazza, bere e gettare il bicchiere sul pavimento.

Dopo ore o qualcosa che abbiamo un pavimento coperto di bicchieri di plastica e acqua.

Far invertire controllo.

La stessa riunione nel luogo stesso, ma invece di bicchieri di plastica abbiamo un cameriere con una coppa di vetro (Singleton)

e lei tutto il tempo offre agli ospiti potabile.

Quando qualcuno vuole bere, lei ottenere da cameriere in vetro, bevande e farlo tornare al cameriere.

Lasciando da parte la questione del igiene, ultima forma di bere il controllo di processo è molto più efficace ed economica.

E questo è esattamente ciò che la Primavera (un altro IoC container, per esempio:Guice) non.Invece di lasciare applicazione per creare quello che è necessario utilizzare la parola chiave new (prendendo il bicchiere di plastica), Spring IoC container di offrire all'applicazione stessa istanza (singleton) di un oggetto(un bicchiere di acqua).

Pensare a te stesso come organizzatore della riunione.È necessario il modo per messaggio a hotel di amministrazione che

riunione soci avranno bisogno di un bicchiere di acqua, ma non un pezzo di torta.

Esempio:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Link utili:-

Sono d'accordo con NilObject, ma vorrei aggiungere a questo:

se vi trovate la copia di un intero metodo e cambiando solo un piccolo pezzo di codice, si può prendere in considerazione di affrontare con inversione del controllo

Se vi trovate copia e incolla il codice in giro, sei quasi sempre a fare qualcosa sbagliato.Codificata come il principio di progettazione Una volta e Solo una Volta.

Sembra che la parte più confusa "Cio" la sigla e il nome che sorge è che è troppo glamour di un nome - quasi un rumore di nome.

Abbiamo davvero bisogno di un nome per descrivere la differenza tra procedurale e programmazione guidata dagli eventi?OK, se abbiamo bisogno, ma abbiamo bisogno di scegliere un nuovo "bigger than life" nome confonde di più di quanti ne risolva?

Cio è di circa invertendo il rapporto tra il codice e il codice di terze parti (libreria/framework):

  • Nel normale sviluppo s/w, scrivere l' main() metodo e chiamata "libreria" metodi. Si il controllo :)
  • In Cio, il "quadro" controlli main() e chiamate i vostri metodi.Il Quadro è il controllo :(

DI (Dependency Injection) è su come i flussi di controllo nell'applicazione.Tradizionali applicazioni desktop aveva il controllo di flusso dall'applicazione(metodo main ()) per altri libreria chiamate di metodo, ma DI flusso di controllo è invertita che il framework si occupa di avvio dell'app, l'inizializzazione e invocando metodi ogni volta che è necessario.

Alla fine si vince sempre :)

Inversion of control quando si va al negozio di alimentari e tua moglie ti dà la lista dei prodotti da acquistare.

In termini di programmazione, ha passato una funzione di callback getProductList() per la funzione di esecuzione - doShopping().

Esso consente all'utente di la funzione di definire alcune parti di esso, rendendo più flessibile.

Una semplice spiegazione scritta può essere trovato qui

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

Si dice -

"Qualsiasi banale applicazione è composta di due o più classi che collaborare con gli altri per eseguire la logica di business.Tradizionalmente, ogni oggetto è responsabile per ottenere una sua i riferimenti agli oggetti collabora con (dipendenze).Quando l'applicazione DI, gli oggetti sono dato loro dipendenze al momento della creazione ora da qualche entità esterna che coordina ogni oggetto in sistema.In altre parole, le dipendenze vengono iniettati oggetti."

Inversion of Control è un generico principio, mentre l'Iniezione di Dipendenza realizza questo principio come un modello di progettazione per l'oggetto grafico di costruzione (es.configurazione controlli come gli oggetti sono riferimenti a vicenda, piuttosto che l'oggetto stesso controllo, come ottenere il riferimento a un altro oggetto).

Guardando Inversione del Controllo come un modello di progettazione, abbiamo bisogno di guardare a ciò che stanno invertendo.L'Iniezione di dipendenza inverte il controllo della costruzione di un grafico di oggetti.Se detto in altri termine, inversion of control implica cambiamento nel flusso di controllo del programma.Es.Nel tradizionale app stand-alone, abbiamo il metodo principale, da cui il controllo viene passato ad altre librerie di terze parti(nel caso, abbiamo usato la libreria di terze parti, funzione), ma attraverso di inversion of control controllo viene trasferito dalla libreria di terze parti di codice del nostro codice, come si sta assumendo il servizio di libreria di terze parti.Ma ci sono altri aspetti che devono essere invertito all'interno di un programma - ad es.invocazione di metodi e fili per eseguire il codice.

Per coloro che sono interessati in modo più approfondito su Inversion of Control un foglio di carta è stato pubblicato delineare un quadro più completo di Inversione del Controllo come un modello di progettazione (OfficeFloor:uso ufficio di modelli per migliorare la progettazione del software http://doi.acm.org/10.1145/2739011.2739013 con una copia gratuita disponibile per il download http://www.officefloor.net/about.html).

Che cosa è individuato è il seguente relazione:

Inversion of Control (per i metodi) = Dipendenza (stato) Iniezione + Continuazione Iniezione + Thread

Sintesi della relazione summenzionata per Inversion of Control disponibile http://dzone.com/articles/inversion-of-coupling-control

Ho trovato un esempio molto chiaro qui il che spiega come: "il controllo è invertite".

Classico codice (senza iniezione di Dipendenza)

Qui è come un codice che non utilizzo DI circa di lavoro:

  • Applicazione necessita di Pippo (ad es.un controller), quindi:
  • Applicazione di crea Pippo
  • Applicazione chiama Pippo
    • Pippo esigenze Bar (ad es.un servizio), così:
    • Pippo crea Bar
    • Pippo chiama Bar
      • Bar esigenze Bim (un servizio, un archivio, ...), così:
      • Bar crea Bim
      • Bar fa qualcosa

Utilizza la dependency injection

Qui è come un codice di utilizzo DI circa di lavoro:

  • Applicazione necessita di Pippo, che ha bisogno di un Bar, che ha bisogno di Bim, così:
  • Applicazione di crea Bim
  • Applicazione di crea Bar e dà Bim
  • Applicazione di crea Pippo e dà Bar
  • Applicazione chiama Pippo
    • Pippo chiama Bar
      • Bar fa qualcosa

Il controllo delle dipendenze è invertito rispetto a quello di essere chiamati a una sola chiamata.

Quali problemi risolve?

L'iniezione di dipendenza rende facile scambiare con l'attuazione del iniettato classi.Mentre i test di unità si può iniettare un manichino di attuazione, il che rende il test molto più facile.

Ex:Si supponga che l'applicazione memorizza l'utente ha caricato il file in Google Drive, con DI il codice del controller simile a questa:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

Quando il mutare delle esigenze dico, invece di GoogleDrive viene chiesto di usare Dropbox.Hai solo bisogno di scrivere un dropbox attuazione per il StorageServiceInterface.Non devi apportare modifiche al controller come lungo come Dropbox attuazione aderisce al StorageServiceInterface.

Durante il test è possibile creare il finto per il StorageServiceInterface con il manichino di attuazione, in cui tutti i metodi restituiscono null(o qualsiasi valore predefinito secondo il vostro requisito di prova).

Se invece avete avuto la classe controller per costruire l'oggetto di archiviazione con il new parola chiave come questo:

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

Quando si desidera modificare con Dropbox attuazione è necessario sostituire tutte le linee in cui new GoogleDriveService l'oggetto è costruito e utilizzare il DropboxService.Inoltre quando si verifica la SomeController classe il costruttore si aspetta sempre il GoogleDriveService classe e l'effettivo metodi di questa classe sono attivati.

Quando è giusto e quando no? A mio parere è l'uso DI quando si pensa che ci sono (o ci possono essere) implementazioni alternative di una classe.

Programmazione di lingua

Cio in termini semplici:È l'uso di Interfaccia come un modo di qualcosa di specifico (come un campo o di un parametro) come un jolly che può essere utilizzato da alcune classi.Permette il riutilizzo del codice.

Per esempio, diciamo che abbiamo due classi : Cane e Gatto.Sia condivide la stessa qualità/stati:l'età, le dimensioni, il peso.Così, invece di creare una classe di servizio DogService e CatService, Posso creare una singola chiamata AnimalService permette di utilizzare Cani e gatti solo se si utilizza l'interfaccia IAnimal.

Tuttavia, pragmaticamente parlando, ha un po ' indietro.

a) La maggior parte degli sviluppatori non so come usarlo.Per esempio, posso creare una classe chiamata Cliente e Posso creare automaticamente (utilizzando gli strumenti dell'IDE) un'interfaccia denominata ICustomer.Così, non è raro trovare una cartella piena di classi e interfacce, non importa se le interfacce saranno riutilizzati o non.Si chiama GONFIO.Alcune persone potrebbero obiettare che "potrebbe essere, in futuro, potrebbe usarlo.:-|

b) ha dei limitings.Per esempio, parliamo di un caso di Cane e Gatto e voglio aggiungere un nuovo servizio (funzionalità) solo per i cani.Diciamo che ho voglia di calcolare il numero di giorni in cui ho bisogno di addestrare un cane (trainDays()), per il gatto è inutile, i gatti possono essere addestrati (sto scherzando).

b.1) Se mi aggiungi trainDays() per il Servizio AnimalService quindi funziona anche con i gatti e non è valido a tutti.

b.2) posso aggiungere una condizione in trainDays() dove si valuta la classe in cui è utilizzato.Ma si romperà completamente il Cio.

b.3) posso creare una nuova classe di servizio DogService solo per le nuove funzionalità.Ma per migliorare la manutenibilità del codice, perché abbiamo due classi di servizio (con funzionalità simili) per Cane e fa male.

Mi piace questa spiegazione: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

È semplice e mostra esempi di codice, come pure.

enter image description here

Il consumatore, X, ha consumato classe, Y, per ottenere qualcosa.Che è tutto buono e naturale, ma X davvero bisogno di sapere che si usi la Y?

Non è sufficiente che X sa che si utilizza qualcosa che ha il comportamento, i metodi, le proprietà, ecc, di Y, senza sapere che in realtà implementa il comportamento?

Estraendo una definizione astratta del comportamento da X in Y, illustrato come io sotto, e lasciare che il consumatore X utilizzare un'istanza di che, invece di Y può continuare a fare ciò che fa, senza dover conoscere i dettagli circa Y.

enter image description here

Nella figura sopra riportata, Y implementa I e X utilizza un'istanza di I.Mentre è del tutto possibile che X usa ancora la Y, la cosa interessante è che X non so che.Si sa solo che si utilizza qualcosa che implementa I.

Leggi l'articolo per maggiori informazioni e descrizione dei benefici, come:

  • X non dipende da Y più
  • Più flessibile, l'attuazione può essere deciso in fase di runtime
  • Isolamento di unità di codice, più facile il test

...

Capisco che la risposta è già stata data qui.Ma io continuo a pensare, alcune nozioni di base circa l'inversione del controllo devono essere discussi qui di lunghezza per i futuri lettori.

Inversion of Control (IoC) è stato costruito su un principio semplicissimo chiamato Hollywood Principio.E si dice che,

Non chiamarci, ti chiamo

Che cosa significa è che non va a Hollywood per realizzare il tuo sogno, piuttosto, se si degna di Hollywood a trovare e rendere il vostro sogno si avvera.Praticamente invertita, eh?

Ora possiamo discutere sul principio del Cio, si usa per dimenticare Hollywood.Per Cio, ci deve essere tre elementi, a Hollywood, è un compito di realizzare il vostro sogno.

Nel nostro mondo della programmazione, Hollywood rappresentano un framework generico (può essere scritto da te o da qualcun altro), si rappresentano il codice utente che hai scritto e l'attività rappresentano la cosa che si vuole realizzare con il vostro codice.Ora non c'è mai andare a stimolare il compito da soli, non in Cio!Piuttosto hai progettato tutto in modo che il tuo quadro attiverà il vostro compito per voi.Così è stato costruito un riutilizzabili quadro che può rendere qualcuno un eroe o di un altro criminale.Ma che quadro è sempre in carica, si sa, quando a prendere qualcuno e quel qualcuno conosce solo ciò che si vuole essere.

Un esempio di vita reale sarebbe qui.Supponiamo che si desidera sviluppare un'applicazione web.Così, si crea un quadro di riferimento che si occuperà di tutte le cose comuni di un'applicazione web deve gestire, come la gestione della richiesta http, la creazione di menu dell'applicazione, serve le pagine, la gestione dei cookies, eventi etc.

E poi ci si lascia qualche ganci nel quadro dove è possibile inserire ulteriori codici per generare un menu personalizzato pagine, i cookie o la registrazione di alcuni eventi utente, etc.Su ogni richiesta del browser, il quadro verrà eseguito ed esegue i vostri codici personalizzati, se collegato poi servire al browser.

Così, l'idea è molto semplice.Piuttosto che la creazione di una applicazione per l'utente che avrà il controllo di tutto, prima si crea un riutilizzabili in ambito di controllo di tutto, quindi scrivere i vostri codici personalizzati e il gancio per il framework per eseguire tali nel tempo.

Laravel e EJB sono esempi di un tale quadro di riferimento.

Riferimento:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

Inversion of control è di circa il trasferimento di controllo dalla libreria per il cliente.Ha più senso quando si parla di un client che inietta (passa) un valore della funzione (lambda expression) in un ordine superiore di funzione (funzione di libreria) che controlla (modifiche) il comportamento della funzione di libreria.Un client o di un quadro che inietta le dipendenze delle librerie (che portano comportamento) in librerie possono anche essere considerati Cio

  1. Così il numero 1 sopra. Che cosa è l'Inversione di Controllo?

  2. La manutenzione è il numero uno cosa che si risolve per me.Garantisce sto usando le interfacce in modo che due classi non sono intimo con l'altro.

Utilizzando un contenitore come il Castello di Windsor, che non risolve i problemi di manutenzione anche meglio.Essere in grado di sostituire un componente che va a un database, per uno che utilizza file in base persistenza senza cambiare una riga di codice è impressionante (modifica della configurazione, il gioco è fatto).

E una volta che si ottiene in generics, è ancora meglio.Immaginate di avere un messaggio di publisher che riceve records e pubblica i messaggi.Non importa cosa pubblica, ma ha bisogno di un mapper per prendere qualcosa da un record a un messaggio.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

L'ho scritto una volta, ma ora posso iniettare molti tipi in questa parte di codice se posso pubblicare i diversi tipi di messaggi.Posso anche scrivere mappatori che prendere un record dello stesso tipo e la mappa per loro di messaggi diversi.Utilizzo DI farmaci Generici, che mi ha dato la possibilità di scrivere poco codice, per svolgere molti compiti.

Oh sì, ci sono testabilità preoccupazioni, ma sono secondari ai benefici del Cio/DI.

Io sono sicuramente amare Cio/DI.

3 .Diventa più appropriato il minuto si dispone di un progetto di medie dimensioni di un po ' più di complessità.Direi che diventa appropriato il minuto si inizia a sentire dolore.

La creazione di un oggetto all'interno della classe è chiamato accoppiamento stretto, Primavera rimuove questa dipendenza, seguendo un modello di progettazione(DI/IOC).In cui oggetto della classe in passato nel costruttore, piuttosto che creare in classe.Più sopra abbiamo dare super-classe di riferimento variabile in funzione di costruzione per definire la struttura più generale.

Utilizzando Cio non siete nuovi ing up i tuoi oggetti.Il IoC container che fanno e gestire il ciclo di vita di loro.

Si risolve il problema di dover modificare manualmente ogni istanza di un tipo di oggetto a un altro.

È opportuno quando si dispone di una funzionalità che potrebbe cambiare in futuro, o che possono essere diversi a seconda dell'ambiente o di configurazione utilizzato.

Per comprendere il concetto, Inversion of Control (IoC) o di Dipendenza Inversione di Principio (DIP) prevede due attività:astrazione, e l'inversione.La Dependency Injection (DI) è solo uno dei pochi con l'inversione metodi.

Per saperne di più su questo si può leggere il mio blog Qui

  1. Che cosa è?

È una pratica in cui si lascia che il comportamento effettivo dal di fuori del confine (Classe Object Oriented Programming).Il confine entità conosce solo l'astrazione (e.g interfaccia, classe astratta, delegato nella Programmazione Object Oriented) di esso.

  1. Quali problemi risolve?

In termini di programmazione, Cio tenta di risolvere monolitico codice, rendendo modulare, il disaccoppiamento varie parti di esso, e rendere unit-test.

  1. Quando è giusto e quando no?

È opportuno che la maggior parte del tempo, a meno che non si dispone di una situazione in cui si desidera solo monolitico codice (e.g programma molto semplice)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top