stringtranslate.com

Inversión de control

En ingeniería de software , la inversión de control ( IoC ) es un principio de diseño en el que partes escritas a medida de un programa de computadora reciben el flujo de control de un marco genérico . El término "inversión" es histórico: una arquitectura de software con este diseño "invierte" el control en comparación con la programación procedimental . En la programación de procedimientos, el código personalizado de un programa llama a bibliotecas reutilizables para encargarse de tareas genéricas, pero con la inversión de control, es el marco el que llama al código personalizado.

La inversión de control ha sido ampliamente utilizada por los marcos de desarrollo de aplicaciones desde el surgimiento de los entornos GUI [1] [2] y continúa utilizándose tanto en entornos GUI como en marcos de aplicaciones de servidor web. La inversión de control hace que el marco sea extensible mediante los métodos definidos por el programador de la aplicación. [3]

La programación basada en eventos a menudo se implementa utilizando IoC, de modo que el código personalizado solo necesita ocuparse del manejo de eventos, mientras que el marco o el entorno de ejecución maneja el bucle de eventos y el envío de eventos/mensajes. En los marcos de aplicaciones de servidores web, el envío suele denominarse enrutamiento y los controladores pueden denominarse puntos finales.

La frase "inversión de control" también se ha utilizado por separado en la comunidad de programadores de Java para referirse específicamente a los patrones de inyección de dependencias de objetos que ocurren con los "contenedores de IoC" en marcos de trabajo de Java como el marco de Spring . [4] En este sentido diferente, "inversión de control" se refiere a otorgar al marco control sobre las implementaciones de dependencias que utilizan los objetos de la aplicación [5] en lugar del significado original de otorgar al marco control del flujo (control sobre el tiempo). de ejecución del código de la aplicación, por ejemplo, devoluciones de llamada).

Descripción general

Como ejemplo, con la programación tradicional, la función principal de una aplicación podría realizar llamadas a funciones en una biblioteca de menús para mostrar una lista de comandos disponibles y solicitar al usuario que seleccione uno. [6] Por lo tanto, la biblioteca devolvería la opción elegida como el valor de la llamada a la función, y la función principal usa este valor para ejecutar el comando asociado. Este estilo era común en las interfaces basadas en texto . Por ejemplo, un cliente de correo electrónico puede mostrar una pantalla con comandos para cargar correo nuevo, responder el correo actual, crear correo nuevo, etc., y la ejecución del programa se bloquearía hasta que el usuario presione una tecla para seleccionar un comando.

Por otro lado, con la inversión de control, el programa se escribiría utilizando un marco de software que conoce elementos gráficos y de comportamiento comunes, como sistemas de ventanas , menús, control del mouse, etc. El código personalizado "llena los espacios en blanco" del marco, como proporcionar una tabla de elementos de menú y registrar una subrutina de código para cada elemento, pero es el marco el que monitorea las acciones del usuario e invoca la subrutina cuando se selecciona un elemento de menú. . En el ejemplo del cliente de correo, el marco podría seguir las entradas del teclado y del mouse y llamar al comando invocado por el usuario por cualquier medio y al mismo tiempo monitorear la interfaz de red para saber si llegan nuevos mensajes y actualizar la pantalla cuando alguna red se detecta actividad. El mismo marco podría usarse como esqueleto para un programa de hoja de cálculo o un editor de texto. Por el contrario, el marco no sabe nada sobre navegadores web, hojas de cálculo o editores de texto; implementar su funcionalidad requiere código personalizado.

La inversión de control conlleva la fuerte connotación de que el código reutilizable y el código específico del problema se desarrollan de forma independiente aunque operen juntos en una aplicación. Las devoluciones de llamada , los programadores , los bucles de eventos y el método de plantilla son ejemplos de patrones de diseño que siguen el principio de inversión de control, aunque el término se usa más comúnmente en el contexto de la programación orientada a objetos . ( La inyección de dependencia es un ejemplo de la idea separada y específica de "invertir el control sobre las implementaciones de dependencias" popularizada por los marcos de Java) .

La inversión de control a veces se denomina "principio de Hollywood: no nos llames, nosotros te llamaremos". [1]

Fondo

La inversión de control no es un término nuevo en informática. Martin Fowler remonta la etimología de la frase a 1988, [7] pero está estrechamente relacionada con el concepto de inversión de programa descrito por Michael Jackson en su metodología de Programación Estructurada Jackson en la década de 1970. [8] Un analizador ascendente puede verse como una inversión de un analizador de arriba hacia abajo : en un caso, el control reside en el analizador, mientras que en el otro caso, reside en la aplicación receptora.

El término fue utilizado por Michael Mattsson en una tesis (con su significado original de un marco que llama al código de una aplicación en lugar de viceversa) [9] y luego fue tomado de ahí [10] por Stefano Mazzocchi y popularizado por él en 1999 en un ya desaparecido Proyecto de Apache Software Foundation, Avalon, en el que se refería a un objeto principal que pasaba las dependencias de un objeto secundario además de controlar el flujo de ejecución. [11] La frase fue popularizada aún más en 2004 por Robert C. Martin y Martin Fowler , el último de los cuales remonta los orígenes del término a la década de 1980. [7]

Descripción

En la programación tradicional, el flujo de la lógica empresarial está determinado por objetos que están vinculados estáticamente entre sí. Con la inversión de control, el flujo depende del gráfico de objetos que se construye durante la ejecución del programa. Este flujo dinámico es posible gracias a las interacciones entre objetos que se definen mediante abstracciones. Este enlace en tiempo de ejecución se logra mediante mecanismos como la inyección de dependencia o un localizador de servicios . En IoC, el código también podría vincularse estáticamente durante la compilación, pero encontrar el código para ejecutar leyendo su descripción desde una configuración externa en lugar de con una referencia directa en el código mismo.

En la inyección de dependencia, un objeto o módulo dependiente se acopla al objeto que necesita en tiempo de ejecución . Por lo general, no se puede saber qué objeto en particular satisfará la dependencia durante la ejecución del programa en el momento de la compilación mediante el análisis estático . Si bien se describe aquí en términos de interacción de objetos, el principio puede aplicarse a otras metodologías de programación además de la programación orientada a objetos .

Para que el programa en ejecución vincule objetos entre sí, los objetos deben poseer interfaces compatibles . Por ejemplo, la clase Apuede delegar el comportamiento a la interfaz Ique implementa la clase B; el programa crea una instancia de Ay By luego lo inyecta Ben A.

Usar

Código de ejemplo

Eventos DOM HTML

Los navegadores web implementan inversión de control para eventos DOM en HTML. El desarrollador de la aplicación utiliza document.addEventListener()para registrar una devolución de llamada.

<!doctype html> < html  lang = "en" > < head >  < meta  charset = "utf-8" >  < title > DOM Nivel 2 </ title > </ head > < body >  < h1 > Evento DOM Nivel 2 controlador </ h1 >  < p >< grande >< span  id = "salida" >> span >> grande >> p > < script > var registradoListener = función () { documento . getElementById ( "salida" ). InnerHTML = "<large>Se llamó al oyente registrado.</large>" ; } documento . addEventListener ( "hacer clic" , registradoListener , verdadero );                 documento . getElementById ( "salida" ). InnerHTML = "<large>El controlador de eventos ha sido registrado. Si hace clic en la página, su navegador web llamará al controlador de eventos.</large>"   </script> </body> </html>

Marcos de aplicaciones web

Este código de ejemplo para una aplicación web Asp.NetCore crea un host de aplicación web, registra un punto final y luego pasa el control al marco: [12]

var constructor = aplicación web . CreateBuilder ( argumentos ); var aplicación = constructor . Construir (); aplicación . MapGet ( "/" , () => "¡Hola mundo!" ); aplicación . Correr ();         

Ver también

Referencias

  1. ^ abc Sweet, Richard (25 de junio de 1985). "El entorno de programación Mesa". Avisos ACM SIGPLAN . 20 (7): 216–229. doi : 10.1145/17919.806843.
  2. ^ Visual_Basic_(clásico)
  3. ^ Johnson, Ralph E.; Foote, Brian (junio-julio de 1988). "Diseño de clases reutilizables". Revista de programación orientada a objetos . 1 (2): 22–35. CiteSeerX 10.1.1.101.8594 . Consultado el 29 de abril de 2014 . 
  4. ^ ab Fowler, Martín. "Inversión de Contenedores de Control y el patrón de Inyección de Dependencias". MartinFowler.com . Consultado el 4 de junio de 2023 .
  5. ^ ab "Spring Framework El contenedor de IoC". docs.spring.io . Consultado el 25 de mayo de 2023 .
  6. ^ Inyección de dependencia.
  7. ^ ab Inversión de control en Bliki de Martin Fowler
  8. ^ "Introducción al método de diseño Jackson" (PDF) .
  9. ^ Mattsson, Michael (febrero de 1996). "Marcos orientados a objetos, un estudio de cuestiones metodológicas". Departamento de Ciencias de la Computación, Universidad de Lund. CiteSeerX 10.1.1.36.1424 . LU-CS-TR: 96-167. 
  10. ^ Stefano Mazzocchi (22 de enero de 2004). "Sobre la inversión del control". Archivado desde el original el 2 de febrero de 2004.
  11. ^ "Patrones del COI: Marco Avalon". El Proyecto Apache Avalon . Consultado el 8 de junio de 2023 .
  12. ^ ab Ryan Nowak, Kirk Larkin, Rick Anderson. ""Enrutamiento en ASP.Net Core"". aprender.microsoft.com . Microsoft . Consultado el 25 de mayo de 2023 . El enrutamiento es responsable de hacer coincidir las solicitudes HTTP entrantes y enviarlas a los puntos finales ejecutables de la aplicación. Los puntos finales son las unidades de código ejecutable de manejo de solicitudes de la aplicación. Los puntos finales se definen en la aplicación y se configuran cuando se inicia la aplicación.{{cite web}}: Mantenimiento CS1: varios nombres: lista de autores ( enlace )

enlaces externos