2009-05-04 9 views
9

Un altro modo per porre questa domanda è: cosa è Inversion of Control secondo te?L'inversione del controllo è specifica per le lingue OO?

Ho fatto questa domanda perché l'articolo di Wikipedia su IoC è stato dirottato da una spiegazione non OO. Questo è preso dalla discussion page ed è dal 2007:

mi sono permesso di riscrivere della pagina, come il contenuto precedente è stato interamente assorbito dal senso "object oriented" balbettio ...

Non vedo come Inversion of Control abbia senso al di fuori del linguaggio OO. Ci sono già molte spiegazioni per abbandonare il 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, nello article dove Martin Fowler elabora su IoC, gestisce esclusivamente gli esempi OO.

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

Per me, IoC tenta di trasformare le funzioni in dati entro i limiti imposti dalla maggior parte dei linguaggi OO e tenta di passare tali funzioni-come-dati come argomenti ad altre funzioni. Questa non è l'unica parte di IoC, ma ce n'è una parte.

C'è anche il modello di progettazione di fabbrica, in cui alberi di oggetti vengono costruiti e configurati prima di essere trasferiti.

Per me, IoC è esclusivamente un concetto OO.

Qual è la tua risposta?

risposta

11

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

Quindi ti renderai conto che non importa se è un oggetto, un metodo, una funzione o qualcosa che viene passato in giro, ma che cosa fa in realtà il codice.

In breve, quando si esegue Iniezione di dipendenza, si inverte il controllo della creazione e dell'utilizzo delle dipendenze (delle risorse).

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

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

7

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

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

13

L'inversione di controllo non è assolutamente un concetto OO.

IoC esiste ed è utilizzato abbastanza frequentemente in lingue non OO. È molto comune in C, ad esempio. Un primo esempio di questo è l'API di Windows - ogni volta che chiamate le funzioni dell'API di Windows che funzionano tramite le callback, in pratica state usando IoC nella sua forma più primitiva.

Ad esempio, dare un'occhiata alla funzione EnumWindows. Usando questo, si passa un puntatore di funzione (EnumWindowsProc) a una libreria e il codice viene eseguito dal codice della libreria.

Confrontare questo con la definizione di Inversion of Control da Wikipedia: "L'inversione di controllo si verifica quando una procedura di libreria chiama le procedure utente."

È esattamente lo stesso.

Tuttavia, IoC diventa davvero molto potente, flessibile e facile da usare quando si aggiunge un sistema di tipo ricco e molti altri strumenti forniti con OOP. Questo rende più comune, dal momento che è "più bello" con cui lavorare, ma esisteva prima di OOP.

+0

Totalmente d'accordo con questo è più facile da usare con un sistema di tipo ricco. Diventa _even_ più facile con funzioni di cittadini di prima classe. – xtofl

1

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

Come indicato da Azder: IoC viene utilizzato per molti motivi. Cercherò di riassumere alcuni qui di convincere :)

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 Discussione

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

evento Generale dispacciamento

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

Nessuno di questi esempi sono Object Oriented, QED