2009-05-04 8 views
9

Otra forma de hacer esta pregunta es: ¿qué es Inversión de control según usted?¿La inversión de control es específica de los lenguajes OO?

Formulo esta pregunta porque el artículo de Wikipedia en IoC ha sido secuestrado por una explicación que no es de OO. Esto está tomado de la discussion page y es a partir de 2007:

he tomado la libertad de reescribir por completo la página, ya que el contenido anterior fue completamente absorbido por "orientado a objetos" balbuceo sin sentido ...

No veo cómo la inversión de control tiene sentido fuera del lenguaje OO. Ya hay muchas explicaciones para ceder el control en los lenguajes de procedimiento (la programación de eventos es una) y los lenguajes puramente funcionales no necesitan un concepto como Inversion of Control, ya que tienen funciones de orden superior.

Además, en el article, donde Martin Fowler elabora IoC, maneja exclusivamente ejemplos de OO.

Entonces, ¿IoC es exclusivamente un concepto OO, y qué es exactamente?

Para mí, IoC intenta convertir las funciones en datos dentro de las limitaciones que imponen la mayoría de los lenguajes OO, e intenta pasar esas funciones como datos como argumentos para otras funciones. Esa no es la única parte de IoC, pero hay algo de eso.

También existe el patrón de diseño de fábrica, donde se construyen y configuran árboles de objetos antes de pasarlos.

Para mí, IoC es exclusivamente un concepto OO.

¿Cuál es tu respuesta?

Respuesta

11

Miras el problema teórico desde un punto de vista de implementación. La primera pregunta que surge debe ser exactamente ¿qué control invierte?

Entonces se dará cuenta de que no importa si es un objeto, método, función o lo que se transmita, sino lo que realmente hace el código.

En resumen, cuando aplica Dependency Injection, invierte el control de la creación y el uso de dependencias (de recursos).

Cuando asigna a la API de Windows un puntero a una función de devolución de llamada, les otorga el control de llamar a su función con sus propios parámetros.

Como ve, IoC es solo un concepto teórico, y por supuesto, puede haber diferentes implementaciones prácticas de él.

7

Bueno, el concepto de "inversión de control" parece aplicable donde quiera que tenga alguna forma de pasar los punteros a las funciones. Básicamente, los conceptos de plug-in y las DLL con firmas compatibles (piénsese en los controladores, por ejemplo) no son más que una forma de IoC.

Sin embargo, cuando utilice IoC con un tipo enriquecido y un modelo de contenedor, básicamente estará en el mundo OO automáticamente. Y los conceptos de OOP se ajustan muy bien a los conceptos de la IoC, especialmente en los lenguajes que soportan la herencia múltiple con clases virtuales puras (o "interfaces", como también se llaman).

13

La inversión de control definitivamente no es un concepto OO.

IoC existe y se usa con bastante frecuencia en idiomas que no son OO. Es muy común en C, por ejemplo. Un buen ejemplo de esto es la API de Windows: cada vez que llamas a funciones de la API de Windows que funcionan a través de devoluciones de llamadas, básicamente estás utilizando IoC en su forma más primitiva.

Por ejemplo, eche un vistazo a la función EnumWindows. Con esto, pasa un puntero de función (EnumWindowsProc) a una biblioteca, y su código se ejecuta desde el código de la biblioteca.

Compare esto con la definición de Inversión de control de Wikipedia: "La inversión de control ocurre cuando un procedimiento de biblioteca llama procedimiento (s) de usuario".

Es exactamente lo mismo.

Sin embargo, IoC realmente se vuelve muy potente, flexible y fácil de usar cuando agrega un sistema de tipos enriquecidos y muchas de las otras herramientas que vienen con OOP. Esto lo hace más común, ya que es "más agradable" trabajar con él, pero existía antes de OOP.

+0

Totalmente de acuerdo con que es más fácil de usar con un sistema de tipo rico. Se vuelve incluso más fácil con las funciones de ciudadanos de primera clase. – xtofl

1

De hecho, la implementación OO de IoC es bastante elaborada, porque las funciones no suelen ser ciudadanos de primera clase.

Como Azder mencionó: IoC se utiliza por muchas razones. Voy a resumir algunos aquí para convencer :)

iteración

#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); 

La creación de hilos

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

caso general el envío de

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

Ninguno de estos ejemplos están orientadas a objeto QED

Cuestiones relacionadas