Domanda

Un altro modo di porre questa domanda è: cos'è Inversion of Control secondo te?

Pongo questa domanda perché l'articolo di Wikipedia su IoC è stato dirottato da un non-OO spiegazione. Questo è tratto dalla pagina di discussione e proviene dal 2007:

  

Mi sono preso la libertà di riscrivere completamente la pagina, poiché il contenuto precedente è stato completamente ripreso da un "oggetto orientato" senza senso " ciarlatano ...

Non vedo come Inversion of Control abbia alcun senso al di fuori del linguaggio OO. Esistono già molte spiegazioni per rinunciare al controllo nei linguaggi procedurali (la programmazione degli eventi è uno) e i linguaggi puramente funzionali non hanno bisogno di un concetto come Inversion of Control poiché hanno funzioni di ordine superiore.

Inoltre, nell'articolo in cui Martin Fowler elabora l'IoC, gestisce esclusivamente esempi OO.

Quindi, l'IoC è esclusivamente un concetto OO, e cos'è esattamente?

Per me, IoC cerca di trasformare le funzioni in dati entro i limiti imposti dalla maggior parte delle lingue OO e cerca di passare quelle funzioni come dati come argomenti ad altre funzioni. Questa non è l'unica parte di IoC, ma ce n'è una parte.

Esiste anche il modello di progettazione di fabbrica, in cui alberi di oggetti vengono costruiti e configurati prima di essere passati.

Per me, IoC è esclusivamente un concetto OO.

Qual è la tua risposta?

È stato utile?

Soluzione

Si guarda al problema teorico da un punto di vista attuativo. La prima domanda che si pone dovrebbe essere esattamente quale controllo inverti ?

Quindi ti renderai conto che non importa se si tratta di un oggetto, metodo, funzione o quant'altro viene passato, ma cosa fa effettivamente il codice.

In breve, quando si fa Iniezione delle dipendenze, si inverte il controllo della creazione e dell'uso delle dipendenze (delle risorse).

Quando si assegna a una funzione API di Windows un puntatore a una funzione di callback, si dà loro il controllo di chiamare la funzione con i propri parametri.

Quindi vedete, l'IoC è solo un concetto teorico e, naturalmente, ci possono essere diverse implementazioni pratiche di esso.

Altri suggerimenti

L'inversione del controllo non è sicuramente un concetto di OO.

IoC esiste ed è usato abbastanza frequentemente in lingue non OO. È molto comune in C, per esempio. Un esempio lampante di ciò è l'API di Windows: ogni volta che chiami qualsiasi funzione dell'API di Windows che funziona tramite callback, stai fondamentalmente usando l'IoC nella sua forma più primitiva.

Ad esempio, dai un'occhiata alla funzione EnumWindows . Usando questo, passi un puntatore a funzione (EnumWindowsProc) a una libreria e il tuo codice viene eseguito dal codice della libreria.

Confronta questo con la definizione di Inversion of Control da Wikipedia: "Inversion of control si verifica quando una procedura di libreria chiama procedure utente."

È esattamente lo stesso.

Tuttavia, l'IoC diventa davvero molto potente, flessibile e facile da usare quando si aggiunge un sistema di tipo avanzato e molti degli altri strumenti forniti con OOP. Questo lo rende più comune, poiché è "più bello" con cui lavorare, ma esisteva prima di OOP.

Bene, il concetto di "inversione di controllo" sembra applicabile ovunque tu abbia un modo per passare i puntatori di funzione in giro. Fondamentalmente, i concetti di plug-in e le DLL con firme compatibili (ad esempio i driver) non sono altro che una forma di IoC.

Tuttavia, quando si utilizza l'IoC con un tipo ricco e un modello contenitore, in pratica si sarà automaticamente nel mondo OO. E i concetti di OOP si associano molto bene ai concetti IoC, specialmente nei linguaggi che supportano l'ereditarietà multipla con classi virtuali pure (o "interfacce", come quelle sono anche chiamate).

In effetti, l'implementazione OO di IoC è abbastanza elaborata, perché le funzioni non sono spesso cittadini di prima classe.

Come menzionato Azder: l'IoC viene utilizzato per molte ragioni. Ne riassumerò alcuni qui per convincere :)

L'iterazione

#ruby
{1,2,3}.each{ |i| puts i }

#haskell
map [1,2,3] ( \i -> write i )

//the stl algorithms
int printint( int i ){ return printf( "%d", i ); }
std::foreach( onetwothree.begin(), onetwothree.end(), &printi );

Creazione thread

CreateThread( NULL, 0, &myFunction, NULL, 0, NULL );

Invio di eventi generali

//javascript
document.getElementById( "mybutton" )
            .addEventListener( 
                 function(e){ alert("buttonPressed") } );

Nessuno di questi esempi è orientato agli oggetti, q.e.d ..

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