Pregunta ¿Qué es Inversión de Control?


La inversión de Control (o IoC) puede ser bastante confusa cuando se encuentra por primera vez.

  1. ¿Qué es?
  2. ¿Qué problemas resuelve?
  3. ¿Cuándo es apropiado y cuándo no?

1426
2017-08-06 03:35


origen


Respuestas:


Los patrones de Inversion of Control (IoC) y Dependency Injection (DI) tienen que ver con la eliminación de dependencias de su código.

Por ejemplo, supongamos que su aplicación tiene un componente de editor de texto y desea proporcionar un corrector ortográfico. Su código estándar se vería así:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Lo que hemos hecho aquí crea una dependencia entre TextEditor y el SpellChecker. En un escenario de IoC, en cambio, haríamos algo como esto:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

En el primer ejemplo de código estamos instanciando SpellChecker (this.checker = new SpellChecker();), lo que significa que TextEditor clase depende directamente de la SpellChecker clase.

En el segundo ejemplo de código estamos creando una abstracción al tener el SpellChecker clase de dependencia en TextEditor firma del constructor (no iniciando la dependencia en clase). Esto nos permite llamar a la dependencia y luego pasarla a la clase TextEditor de la siguiente manera:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Ahora el cliente crea el TextEditor clase tiene el control sobre cual SpellChecker implementación a usar porque estamos inyectando la dependencia a la TextEditor firma.

Este es solo un ejemplo simple, hay una buena serie de artículos por Simone Busoli que lo explica en mayor detalle.


1137
2017-08-06 07:22



Inversión de control es lo que obtienes cuando se vuelven a llamar los programas, p. como un programa de GUI.

Por ejemplo, en un menú de la vieja escuela, es posible que tenga:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

controlando así el flujo de interacción del usuario.

En un programa GUI o somesuch, en su lugar decimos

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

Entonces, ahora el control se invierte ... en lugar de que la computadora acepte la entrada del usuario en un orden fijo, el usuario controla el orden en que se ingresan los datos y cuando los datos se guardan en la base de datos.

Básicamente, cualquier elemento con un bucle de evento, devoluciones de llamada o ejecuciones de ejecución se incluye en esta categoría.


495
2017-08-06 05:42



¿Qué es Inversión de Control?

Si sigues estos simples dos pasos, has hecho la inversión de control:

  1. Separar qué-hace parte de cuandoparte de la vida
  2. Asegurarse de que cuando parte sabe como pequeño como sea posible sobre qué parte; y viceversa.

Existen varias técnicas posibles para cada uno de estos pasos en función de la tecnología / idioma que está utilizando para su implementación.

-

los inversión parte de la inversión de control (IoC) es lo confuso; porque inversión es el término relativo. ¡La mejor manera de entender la IoC es olvidarse de esa palabra!

-

Ejemplos

  • Manejo de eventos. Manejadores de eventos (parte de qué hacer) - Eventos de crianza (parte de cuándo hacer)
  • Interfaces Componente cliente (parte de las tareas): implementación de la interfaz de componentes (parte de lo que se debe hacer)
  • xUnit fixure. Configuración y TearDown (parte de lo que se debe hacer): xUnit frameworks llama a la configuración al principio y TearDown al final (parte de la tarea)
  • Patrón de diseño de método de plantilla. Método de la plantilla Cuándo hacer la parte - Implementación de la subclase primitiva ¿Qué hacer?
  • Métodos de contenedor DLL en COM. DllMain, DllCanUnload, etc. (parte de lo que debe hacer) - COM / OS (parte de cuándo hacer)

359
2017-07-22 17:34



La inversión de los controles se trata de separar las preocupaciones.

Sin IoC: Usted tiene un ordenador portátil computadora y accidentalmente rompes la pantalla. Y maldita sea, encuentras que el mismo modelo de pantalla de laptop no está en el mercado. Entonces estás atrapado.

Con IoC: Usted tiene un escritorio computadora y accidentalmente rompes la pantalla. Usted puede simplemente agarrar casi cualquier monitor de escritorio del mercado, y funciona bien con su escritorio.

Su escritorio implementa IoC con éxito en este caso. Acepta una variedad de monitores, mientras que la computadora portátil no, necesita una pantalla específica para ser reparada.


89
2017-09-25 14:24



La inversión del control (o IoC) se trata de obtener la libertad (Te casas, pierdes la libertad y te controlan. Te divorciaste, acabas de implementar la Inversión del control. Eso es lo que llamamos "desacoplado". Un buen sistema informático desalienta una relación muy estrecha). más flexibilidad (La cocina de su oficina solo sirve agua limpia del grifo, esa es su única opción cuando quiere beber. Su jefe implementó Inversion of Control configurando una nueva máquina de café. Ahora tiene la flexibilidad de elegir agua de grifo o café. ) y menos dependencia (Su pareja tiene un trabajo, usted no tiene un trabajo, usted depende financieramente de su pareja, por lo que está controlado. Encuentra un empleo, ha implementado la Inversión de control. Un buen sistema informático fomenta la dependencia).

Cuando usa una computadora de escritorio, se ha esclavizado (o dicho, controlado). Tienes que sentarte frente a una pantalla y mirarlo. Usando el teclado para escribir y usar el mouse para navegar. Y un software mal escrito puede esclavizarlo aún más. Si reemplaza su computadora de escritorio con una computadora portátil, entonces tendrá un control un tanto invertido. Puedes tomarlo y moverte fácilmente. Ahora puede controlar dónde se encuentra con su computadora, en lugar de controlarla desde su computadora.

Al implementar Inversion of Control, un consumidor de software / objeto obtiene más controles / opciones sobre el software / los objetos, en lugar de ser controlado o tener menos opciones.

Con las ideas anteriores en mente. Todavía extrañamos una parte clave de IoC. En el escenario de IoC, el consumidor de software / objetos es un marco sofisticado. Eso significa que el código que creó no es llamado por usted mismo. Ahora expliquemos por qué esta forma funciona mejor para una aplicación web.

Supongamos que su código es un grupo de trabajadores. Necesitan construir un auto. Estos trabajadores necesitan un lugar y herramientas (un marco de software) para construir el automóvil. UN tradicional el marco del software será como un garaje con muchas herramientas. Entonces los trabajadores necesitan hacer un plan ellos mismos y usar las herramientas para construir el auto. Construir un automóvil no es un negocio fácil, será muy difícil para los trabajadores planificar y cooperar adecuadamente. UN moderno El marco de software será como una fábrica de automóviles moderna con todas las instalaciones y gerentes en su lugar. Los trabajadores no tienen que hacer ningún plan, los gerentes (parte del marco, son las personas más inteligentes e hicieron el plan más sofisticado) ayudarán a coordinar para que los trabajadores sepan cuándo hacer su trabajo (el marco llama a su código). Los trabajadores solo necesitan ser lo suficientemente flexibles como para usar cualquier herramienta que los gerentes les den (mediante el uso de Inyección de Dependencia).

Aunque los trabajadores dan el control de la gestión del proyecto en el nivel superior a los administradores (el marco). Pero es bueno tener ayuda de algunos profesionales. Este es el concepto de IoC realmente provienen.

Las aplicaciones web modernas con una arquitectura MVC dependen del marco para hacer enrutamiento de URL y poner los controladores en su lugar para que el marco llame.

La inyección de dependencia y la inversión del control están relacionadas. La Inyección de Dependencia está en el micro nivel y la inversión de control está en el macro nivel. Tienes que comer cada bocado (implementar DI) para terminar una comida (implementar IoC).


80
2018-03-04 19:33



Antes de usar Inversión de control, debe ser consciente del hecho de que tiene sus pros y sus contras, y debe saber por qué lo usa si lo hace.

Pros:

  • Su código se desacopla para que pueda intercambiar fácilmente implementaciones de una interfaz con implementaciones alternativas
  • Es un fuerte motivador para codificar contra interfaces en lugar de implementaciones
  • Es muy fácil escribir pruebas de unidad para su código porque no depende de nada más que los objetos que acepta en su constructor / instalador y puede inicializarlos fácilmente con los objetos correctos de forma aislada.

Contras:

  • IoC no solo invierte el flujo de control en su programa, sino que también lo nubla considerablemente. Esto significa que ya no puede leer su código y saltar de un lugar a otro porque las conexiones que normalmente estarían en su código ya no están en el código. En cambio, es en los archivos de configuración XML o anotaciones y en el código de su contenedor IoC que interpreta estos metadatos.
  • Surge una nueva clase de errores en la que obtiene su configuración XML o sus anotaciones erróneas y puede pasar mucho tiempo averiguando por qué su contenedor IoC inyecta una referencia nula en uno de sus objetos bajo ciertas condiciones.

Personalmente veo los puntos fuertes de IoC y realmente me gustan, pero tiendo a evitar IoC siempre que sea posible porque convierte su software en una colección de clases que ya no constituyen un programa "real", sino simplemente algo que necesita ser ensamblado por La configuración XML o los metadatos de la anotación caerían (y se desmoronarían) sin ella.


73
2018-02-12 14:31



  1. Artículo de Wikipedia. Para mí, la inversión de control está convirtiendo tu código escrito secuencialmente y convirtiéndolo en una estructura de delegación. En lugar de que su programa controle todo de manera explícita, su programa configura una clase o biblioteca con ciertas funciones a las que llamar cuando suceden ciertas cosas.

  2. Soluciona la duplicación de código. Por ejemplo, en los viejos tiempos, escribía manualmente su propio bucle de eventos, buscando en las bibliotecas del sistema nuevos eventos. Hoy en día, en la mayoría de las API modernas, simplemente le dice a las bibliotecas del sistema qué eventos le interesan, y le avisará cuando ocurran.

  3. La inversión del control es una forma práctica de reducir la duplicación de código, y si se encuentra copiando un método completo y solo cambiando una pequeña parte del código, puede considerar abordarlo con inversión de control. La inversión de control se hace fácil en muchos idiomas a través del concepto de delegados, interfaces o incluso punteros de función sin formato.

    No es apropiado usarlo en todos los casos, porque el flujo de un programa puede ser más difícil de seguir cuando se lo escribe de esta manera. Es una forma útil de diseñar métodos cuando se escribe una biblioteca que se volverá a utilizar, pero se debe usar con moderación en el núcleo de su propio programa a menos que realmente resuelva un problema de duplicación de código.


55
2017-08-06 04:33