Pregunta

Otra forma de hacer esta pregunta es: ¿qué es la inversión de control según usted?

Hago esta pregunta porque el artículo de Wikipedia en IoC ha sido secuestrado por un no-OO explicación. Esto se toma de la página de discusión y es de 2007:

  

Me tomé la libertad de volver a escribir la página por completo, ya que el contenido anterior fue completamente tomado por "sin sentido" orientado a objetos " balbuceo ...

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

También, en el artículo donde Martin Fowler elabora sobre IoC, maneja exclusivamente los ejemplos de OO.

Entonces, ¿es IoC 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, y trata de pasar esas funciones como datos como argumentos a otras funciones. Esa no es la única parte de IoC, pero hay algo de eso.

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

Para mí, IoC es exclusivamente un concepto OO.

¿Cuál es tu respuesta?

¿Fue útil?

Solución

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

Entonces te darás cuenta de que no importa si se trata de un objeto, un método, una función o cualquier otra cosa que se transmita, pero lo que realmente hace el código.

En resumen, cuando realiza la inyección de dependencia, invierte el control de la creación y el uso de dependencias (de recursos).

Cuando le asignas un puntero a una función de la API de Windows a una función de devolución de llamada, les das el control de llamar a tu función con sus propios parámetros.

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

Otros consejos

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 llama a alguna de las funciones de la API de Windows que funcionan a través de devoluciones de llamada, básicamente está utilizando IoC en su forma más primitiva.

Por ejemplo, eche un vistazo a la función EnumWindows . Usando esto, pasa un indicador 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 se produce cuando un procedimiento de biblioteca llama a los procedimientos del usuario. "

Es exactamente lo mismo.

Sin embargo, IoC realmente se vuelve muy poderoso, flexible y fácil de usar cuando agregas un sistema de tipo rico y muchas de las otras herramientas que vienen con OOP. Esto lo hace más común, ya que es " mejor " para trabajar, pero existía antes de la POO.

Bueno, el concepto de " inversión de control " Parece aplicable en cualquier lugar donde tengas alguna forma de pasar los punteros de función. Básicamente, los conceptos de complementos y DLL con firmas compatibles (por ejemplo, los controladores) no son más que una forma de IoC.

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

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

Como mencionó Azder: IoC se usa por muchas razones. 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 );

Creación de hilos

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

Envío de eventos generales

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

Ninguno de estos ejemplos está orientado a objetos, q.e.d ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top