¿Qué es Inversión de Control?

votos
1k

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?
Publicado el 06/08/2008 a las 04:35
fuente por usuario
En otros idiomas...                            


38 respuestas

votos
55
  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.

Respondida el 06/08/2008 a las 05:33
fuente por usuario

votos
13

Estoy de acuerdo con NilObject , pero me gustaría añadir a esto:

si te encuentras copiando un método completo y solo cambiando una pequeña parte del código, puedes considerar abordarlo con inversión de control

Si te encuentras copiando y pegando códigos, casi siempre estás haciendo algo mal. Codificado como el principio de diseño Once and Only Once .

Respondida el 06/08/2008 a las 06:20
fuente por usuario

votos
485

La inversión del control es lo que obtienes cuando se vuelven a llamar los programas, por ejemplo, como un programa de interfaz gráfica de usuario.

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.

Respondida el 06/08/2008 a las 06:42
fuente por usuario

votos
1k

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 el TextEditory 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 la TextEditorclase depende directamente de la SpellCheckerclase.

En el segundo ejemplo de código estamos creando una abstracción al tener la SpellCheckerclase de dependencia en la TextEditorfirma del constructor (no inicializando la dependencia en la 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 que crea la TextEditorclase tiene el control sobre qué SpellCheckerimplementación usar porque estamos inyectando la dependencia a la TextEditorfirma.

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

Respondida el 06/08/2008 a las 08:22
fuente por usuario

votos
38

Pero creo que debes ser muy cuidadoso con eso. Si usa en exceso este patrón, hará un diseño muy complicado y un código aún más complicado.

Como en este ejemplo con TextEditor: si solo tiene un SpellChecker, ¿no es realmente necesario usar IoC? A menos que necesites escribir pruebas unitarias o algo ...

De todos modos: ser razonable. Los patrones de diseño son buenas prácticas pero no la Biblia para ser predicada. No lo pegue en todas partes.

Respondida el 06/08/2008 a las 23:08
fuente por usuario

votos
23
  1. La inversión del control es un patrón utilizado para desacoplar componentes y capas en el sistema. El patrón se implementa inyectando dependencias en un componente cuando se construye. Estas dependencias generalmente se proporcionan como interfaces para un mayor desacoplamiento y para respaldar la capacidad de prueba. Los contenedores IoC / DI como Castle Windsor, Unity son herramientas (bibliotecas) que se pueden usar para proporcionar IoC. Estas herramientas proporcionan funciones extendidas más allá de la gestión de dependencia simple, incluida la vida, AOP / Interceptación, política, etc.

  2. a. Alivia un componente de ser responsable de administrar sus dependencias.
    segundo. Ofrece la capacidad de intercambiar implementaciones de dependencia en diferentes entornos.
    do. Permite que un componente sea probado a través de burlas de dependencias.
    re. Proporciona un mecanismo para compartir recursos a lo largo de una aplicación.

  3. a. Crítico cuando se realiza un desarrollo basado en pruebas. Sin IoC puede ser difícil de probar, porque los componentes bajo prueba están altamente acoplados al resto del sistema.
    segundo. Crítico al desarrollar sistemas modulares. Un sistema modular es un sistema cuyos componentes pueden ser reemplazados sin requerir una recompilación.
    do. Es crítico si hay muchas preocupaciones transversales que deben abordarse, de manera similar en una aplicación empresarial.

Respondida el 19/09/2008 a las 03:27
fuente por usuario

votos
34

IoC / DI para mí está enviando dependencias a los objetos que llaman. Súper simple.

La respuesta no técnica es poder cambiar el motor de un automóvil justo antes de encenderlo. Si todo se conecta correctamente (la interfaz), eres bueno.

Respondida el 19/09/2008 a las 03:54
fuente por usuario

votos
3
  1. Así que el número 1 arriba . ¿Qué es Inversión de Control?

  2. El mantenimiento es lo primero que soluciona para mí. Garantiza que estoy usando interfaces para que dos clases no sean íntimas entre sí.

Al usar un contenedor como Castle Windsor, resuelve problemas de mantenimiento aún mejor. Ser capaz de cambiar un componente que va a una base de datos por uno que usa persistencia basada en archivos sin cambiar una línea de código es impresionante (cambio de configuración, ya está).

Y una vez que ingresas a los genéricos, se pone aún mejor. Imagine tener un editor de mensajes que recibe registros y publica mensajes. No le importa lo que publica, pero necesita un asignador para llevar algo de un registro a un mensaje.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

Lo escribí una vez, pero ahora puedo insertar muchos tipos en este conjunto de códigos si publico diferentes tipos de mensajes. También puedo escribir mapeadores que toman un registro del mismo tipo y asignarlos a diferentes mensajes. Usar DI con Generics me ha dado la capacidad de escribir muy poco código para realizar muchas tareas.

Ah, sí, hay problemas de capacidad de prueba, pero son secundarios a los beneficios de IoC / DI.

Definitivamente estoy amando IoC / DI.

3. Se vuelve más apropiado en el momento en que tienes un proyecto de tamaño mediano con algo más de complejidad. Diría que se vuelve apropiado desde el momento en que empiezas a sentir dolor.

Respondida el 19/09/2008 a las 05:59
fuente por usuario

votos
15

Por ejemplo, la tarea # 1 es la creación de objeto. Sin concepto COI, tarea # 1 se supone que debe ser realizado por Programmer.But Con el concepto COI, tarea # 1 se llevaría a cabo por contenedor.

En resumen control se invierte Desde el programador del recipiente. Por lo tanto, se llama como la inversión de control.

He encontrado un buen ejemplo aquí .

Respondida el 27/01/2010 a las 13:15
fuente por usuario

votos
72

Antes de utilizar Inversión de Control usted debe estar bien consciente del hecho de que tiene sus pros y contras y usted debe saber por qué lo usa, si lo hace.

Pros:

  • Su código se desacopla para que pueda intercambiar fácilmente las implementaciones de una interfaz con implementaciones alternativas
  • Es un gran aliciente para la codificación en contra de las interfaces en lugar de implementaciones
  • Es muy fácil escribir pruebas unitarias para su código, ya que no depende de nada más que los objetos que acepta en su constructor / setters y se puede inicializar fácilmente con los objetos adecuados de forma aislada.

Contras:

  • COI no sólo se invierte el flujo de control en su programa, sino que también nubla considerablemente. Esto significa que puede no acaba de leer su código y saltar de un lugar a otro debido a las conexiones que normalmente estarían en su código no están en el código más. En cambio, es en 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 insectos donde se obtiene su configuración XML o anotaciones mal y puede pasar mucho tiempo para encontrar por qué su contenedor IoC inyecta una referencia nula en uno de sus objetos bajo ciertas condiciones.

Personalmente veo los puntos fuertes de la COI y me gustan mucho pero tienden a evitar el COI siempre que sea posible, ya que convierte su software en una colección de clases que ya no constituyen un programa "real", sino sólo algo que necesita ser elaborado por configuración XML de metadatos o la anotación y caerían (y baja) de distancia sin ella.

Respondida el 12/02/2010 a las 15:31
fuente por usuario

votos
356

¿Qué es la Inversión de Control?

Si usted sigue estos sencillos pasos dos, usted ha hecho la inversión de control:

  1. Separar lo -to-separe de cuando hacer -to-parte.
  2. Asegúrese de que cuando se parte sabe tan poco como sea posible sobre qué parte; y viceversa.

Hay varias técnicas posibles para cada uno de estos pasos basados ​​en la tecnología / idioma que está utilizando para su aplicación.

-

La inversión de parte de la Inversión de Control (COI) es lo confuso; porque la inversión es el término relativo. La mejor manera de entender la COI es olvidarse de esa palabra!

-

Ejemplos

  • Manejo de Eventos. Los controladores de eventos (lo-a-do parte) - Eventos ganadería (cuando-a-separe)
  • Interfaces. Componente cliente (cuando-a-separe) - aplicación de interfaz de componente (a lo separe)
  • fixure xUnit. Montaje y desmontaje (lo-a-separe) - marcos xUnit llamadas a configuración al principio y al final TearDown (cuando-a-separe)
  • patrón de diseño método plantilla. Método plantilla cuando-a-separe - aplicación subclase primitiva lo-a-separe
  • métodos de contenedores DLL en COM. DllMain, DllCanUnload, etc (lo-a-separe) - COM / OS (cuando-a-do parte)
Respondida el 22/07/2010 a las 18:34
fuente por usuario

votos
14

Parece que lo más confuso sobre "COI", el acrónimo y el nombre de la que se encuentra es que es demasiado glamour de un nombre - casi un nombre ruido.

¿Realmente necesitamos un nombre con el que describir la diferencia entre la programación de procedimiento y por eventos? OK, si es necesario, pero no tenemos que escoger un nuevo "más grande que la vida" nombre que confunde más que soluciones?

Respondida el 19/01/2011 a las 04:50
fuente por usuario

votos
13

Dejar que quiere decir que hacemos alguna reunión en un hotel.

Mucha gente, muchas garrafas de agua, muchos vasos de plástico.

Cuando alguien quiere beber, ella llenado del vaso, la bebida y tirar la taza en el suelo.

Después de hora o algo que tenemos un suelo cubierto de vasos de plástico y agua.

Dejar que el control invertido.

En la misma reunión en el mismo lugar, pero en vez de vasos de plástico que tenemos un camarero con una taza de vidrio (Singleton)

y ella todo el tiempo ofrece a los huéspedes potable.

Cuando alguien quiere beber, ella consigue a partir de vidrio camarero, bebida y volver de nuevo al camarero.

Dejando de lado la cuestión de la higiene última forma de control de proceso, es mucho más eficaz y económica.

Y esto es exactamente lo que la primavera (otro contenedor IoC, por ejemplo: Guice) hace. En lugar de let a la aplicación crear lo que necesita el uso de nueva palabra clave (que toma la taza de plástico), Spring IoC contenedores todos oferta de tiempo para la aplicación de la misma instancia (Singleton) del objeto sea necesario (vaso de agua).

Piense en usted como organizador de dicha junta. Es necesario la forma de enviar mensajes a la administración del hotel que

Reunión de los miembros necesitarán vaso de agua, pero no pedazo de la torta.

Ejemplo:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Enlaces útiles:-

Respondida el 26/09/2012 a las 18:54
fuente por usuario

votos
4

COI también se conoce como inyección de dependencias (DI). Es un proceso mediante el cual los objetos definen sus dependencias, es decir, los otros objetos con los que trabajan, sólo a través de argumentos de constructor, argumentos a un método de fábrica, o propiedades que se establecen en la instancia de objeto después de que se construye o se volvió de un método de fábrica . El contenedor inyecta entonces esas dependencias cuando se crea el grano. Este proceso es fundamentalmente el inverso, de ahí el nombre de Inversión de Control (COI), del propio grano de control de la instanciación o ubicación de sus dependencias mediante el uso de la construcción directa de las clases, o un mecanismo como el patrón Service Locator

Primavera-marco-referance.pfd página 27 (si al contar todas las páginas del documento PDF, que está en la página 51)

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/pdf/spring-framework-reference.pdf

Respondida el 24/01/2013 a las 15:52
fuente por usuario

votos
7

Una muy simple explicación por escrito se puede encontrar aquí

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

dice

"Cualquier aplicación no trivial se compone de dos o más clases que colaboran entre sí para realizar alguna lógica de negocio. Tradicionalmente, cada objeto es responsable de obtener sus propias referencias a los objetos que colabora con (sus dependencias). Al aplicar el DI, el objetos reciben sus dependencias en tiempo de creación por alguna entidad externa que coordina cada objeto en el sistema. en otras palabras, las dependencias se inyectan en los objetos ".

Respondida el 22/02/2013 a las 15:13
fuente por usuario

votos
77

Inversión de Control, (o COI), está a punto de conseguir la libertad (Te casas, que perdió la libertad y que está siendo controlado. La inversión se divorció de ti, que acabas de implementar de control. Eso es lo que llamamos, "desconectada". Buen sistema informático desalienta alguna relación muy estrecha.) más flexibilidad (la cocina en su oficina sólo sirve agua del grifo limpia, que es su única opción cuando se quiere beber. su jefe implementado Inversión de control mediante la creación de una nueva máquina de café. Ahora se obtiene el la flexibilidad de elegir entre el agua del grifo o café.) y una menor dependencia (Su pareja tiene un trabajo, usted no tiene un trabajo, que dependen económicamente de su pareja, por lo que están controladas. A encontrar un trabajo, que ha implementado Inversión de Control. Buen sistema informático anima en la dependencia.)

Cuando se utiliza un ordenador de sobremesa, que ha esclavizado (o decir, controlada). Usted tiene que sentarse delante de una pantalla y mire. Usando el teclado para escribir y utilizando el ratón para navegar. Y un software mal escrito puede servir como esclavo aún más. Si reemplaza el escritorio con un ordenador portátil, entonces algo invertida de control. Usted puede tomar fácilmente y moverse. Así que ahora usted puede controlar dónde se encuentra con su ordenador, en lugar de su ordenador controlarla.

Mediante la implementación de Inversión de Control, un consumidor de software / objeto conseguir más controles / opciones sobre el software / objetos, en lugar de ser controlado o tener menos opciones.

Con estas ideas en mente. Todavía echamos de menos una parte clave de la COI. En el escenario de la COI, el consumidor de software / objeto es un marco sofisticado. Eso significa que el código que ha creado no es llamado por sí mismo. Ahora vamos a explicar por qué esta forma en que funciona mejor para una aplicación web.

Suponga que su código es un grupo de trabajadores. Que necesitan para construir un coche. Estos trabajadores necesitan un lugar y las herramientas (un marco de software) para construir el coche. Un tradicional marco de software será como un garaje con muchas herramientas. Por lo que los trabajadores necesitan para hacer un plan a sí mismos y utilizar las herramientas para construir el coche. La construcción de un coche no es un negocio fácil, va a ser muy difícil para los trabajadores para planificar y cooperan correctamente. Una modernamarco de software será como una fábrica de automóviles moderno con todas las instalaciones y los administradores en su lugar. Los trabajadores no tienen que hacer ningún plan, los gerentes (parte del marco, que son las personas más inteligentes y de hecho el plan más sofisticado) ayudará a coordinar de manera que los trabajadores saben cuándo hacer su trabajo (framework llama su código). Los trabajadores sólo tiene que ser lo suficientemente flexible como para utilizar cualquier herramienta de los gerentes dan a ellos (mediante el uso de la inyección de dependencias).

A pesar de que los trabajadores dan el control de la gestión del proyecto en el nivel superior a los gerentes (el marco). Pero es bueno tener algunos profesionales ayudan a cabo. Este es el concepto de la COI verdaderamente venido.

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

Inyección de Dependencia y la inversión de control están relacionados. Inyección de dependencia está en el micro nivel y la Inversión de Control está en el macro nivel. Usted tiene que comer cada bocado (aplicar DI) con el fin de terminar una comida (aplicar COI).

Respondida el 04/03/2013 a las 20:33
fuente por usuario

votos
34

Supongamos que usted es un objeto. Y vas a un restaurante:

Sin COI : pedir "manzana", y siempre se sirven de manzana cuando se pide más.

Con la COI : Puede solicitar "fruto". Usted puede obtener diferentes frutas cada vez que te sirven. por ejemplo, manzana, naranja, melón de agua.

Así que, obviamente, la COI se prefiere cuando te gusta las variedades.

Respondida el 25/09/2013 a las 15:00
fuente por usuario

votos
81

Inversion de los controles es sobre la separación de preocupaciones.

Sin COI : Usted tiene un ordenador portátil ordenador y accidentalmente rompe la pantalla. Y maldito, se encuentra la misma pantalla modelo de portátil está en ninguna parte en el mercado. Por lo que está atascado.

Con la COI : Tiene un escritorio de ordenador y accidentalmente rompe la pantalla. Así obtendrán una información que sólo puede tomar casi cualquier monitor de escritorio del mercado, y funciona bien con su escritorio.

Su escritorio implementa con éxito COI en este caso. Se acepta un tipo de variedad de monitores, mientras que el portátil no es así, se necesita una pantalla específica de ser arreglados.

Respondida el 25/09/2013 a las 15:24
fuente por usuario

votos
10

COI se trata de invertir la relación entre el código y el código de terceros (biblioteca / marco):

  • En s normales / w desarrollo, se escribe el main () método y llama a los métodos "biblioteca". Usted está en control :)
  • En COI el "marco" controla main () y llama a sus métodos. El marco está en control :(

DI (inyección de dependencias) es acerca de cómo fluye el control en la aplicación. aplicación de escritorio tradicional tenía flujo de control de su aplicación (método main ()) para otras llamadas a métodos biblioteca, pero con flujo de control DI es invertida que es marco se encarga de iniciar su aplicación, inicializándola e invocando sus métodos cuando sea necesario.

Al final siempre gana :)

Respondida el 19/09/2014 a las 19:25
fuente por usuario

votos
17

Voy a escribir mi sencilla comprensión de estos dos términos:

For quick understanding just read examples*

Inyección de dependencias (DI):
Dependencia de inyección generalmente significa pasar un objeto de la que depende método, como un parámetro a un método, en lugar de tener el método de crear el objeto dependiente .
Lo que significa en la práctica es que el método no depende directamente de una implementación particular; cualquier aplicación que cumpla con los requisitos se puede pasar como un parámetro.

Con estos objetos decir arreglan sus dependencias. Y la primavera hace que esté disponible.
Esto lleva a débilmente acoplados desarrollo de aplicaciones.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inversión de Control de Contenedores (COI):
Esta es una característica común de los marcos, la COI maneja objetos Java
- a partir de instancias a la destrucción a través de su BeanFactory.
-java componentes que se crean instancias por el contenedor IoC se llaman las habas y el contenedor IoC gestiona el alcance de un frijol, eventos del ciclo de vida, y cualquier característica de AOP para el que se ha configurado y codificados.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Mediante la implementación de Inversión de Control, un consumidor de software / objeto conseguir más controles / opciones sobre el software / objetos, en lugar de ser controlado o tener menos opciones.

La inversión de control como una guía de diseño tiene los siguientes objetivos:

Hay un desacoplamiento de la ejecución de una determinada tarea de implementación.
Cada módulo puede centrarse en lo que está diseñado para.
Módulos no hacen suposiciones acerca de lo que hacen otros sistemas, pero dependen de sus contratos.
Sustitución de módulos tiene ningún efecto secundario en otros módulos
Voy a mantener las cosas en abstracto aquí, se puede visitar siguientes enlaces para detalle comprensión del tema.
Una buena lectura con el ejemplo

Explicación detallada

Respondida el 10/11/2014 a las 08:43
fuente por usuario

votos
7

hablar de programación

COI en términos sencillos: Es el uso de la interfaz como una forma de algo específico (como un campo o un parámetro) como un comodín que puede ser utilizado por algunas clases. Permite la reutilización del código.

Por ejemplo, supongamos que tenemos dos clases: Perro y gato . Tanto comparte las mismas cualidades / Estados: la edad, el tamaño, el peso. Así que en lugar de crear una clase de servicio llamado DogService y CatService , puedo crear una sola llamada AnimalService que permite utilizar perros y gatos solamente si utilizan la interfaz IAnimal .

Sin embargo, pragmáticamente hablando, que tiene algunos hacia atrás.

a) La mayoría de los desarrolladores no saben cómo usarlo . Por ejemplo, puedo crear una clase llamada de atención al cliente y que pueda crear automáticamente (utilizando las herramientas del IDE) una interfaz llamada ICliente . Así, no es raro encontrar una carpeta llena de clases e interfaces, no importa si las interfaces se pueden volver a utilizar o no. Se llama hinchado. Algunas personas podrían argumentar que "puede ser en el futuro podríamos usarlo". : - |

b) Tiene algunas limitings. Por ejemplo, vamos a hablar sobre el caso del perro y del gato y quiero añadir un nuevo servicio (funcionalidad) sólo para perros. Digamos que quiero para calcular el número de días que tengo que entrenar a un perro ( trainDays()), para el gato que es inútil, los gatos no pueden ser entrenados (estoy bromeando).

b.1) Si añado trainDays()al Servicio AnimalService entonces también funciona con los gatos y no es válida en absoluto.

b.2) puedo añadir una condición en trainDays()donde se evalúa qué clase se utiliza. Pero va a romper por completo el COI.

b.3) Puedo crear una nueva clase de servicio llamado DogService sólo para la nueva funcionalidad. Pero, además de aumentar la capacidad de mantenimiento del código, porque vamos a tener dos clases de servicio (con una funcionalidad similar) para el perro y es malo.

Respondida el 19/04/2015 a las 12:07
fuente por usuario

votos
3

Creación de un objeto dentro de clase se llama estrecho acoplamiento, Spring elimina esta dependencia siguiendo un patrón de diseño (DI / COI). En qué objeto de la clase en aprobada en constructor en lugar de crear en la clase. Más sobre damos variable de referencia super clase en el constructor para definir la estructura más general.

Respondida el 13/05/2015 a las 08:52
fuente por usuario

votos
2

El uso de la COI no está new'ing de seguridad de los objetos. Su contenedor IoC hará eso y gestionar el tiempo de vida de ellos.

Resuelve el problema de tener que cambiar manualmente cada instancia de un tipo de objeto a otro.

Es apropiado cuando usted tiene una funcionalidad que puede cambiar en el futuro o que pueden ser diferentes en función del entorno o de la configuración utilizados en.

Respondida el 16/07/2015 a las 16:06
fuente por usuario

votos
7

Inversión de Control es un principio genérico, mientras que la inyección de dependencias se da cuenta de este principio como un patrón de diseño para la construcción gráfico de objetos (es decir, controles de configuración cómo los objetos se hace referencia a uno al otro, más que el propio objeto controlar cómo obtener la referencia a otro objeto).

En cuanto a Inversión de Control como un patrón de diseño, tenemos que mirar lo que estamos invirtiendo. Inyección de dependencias invierte el control de la construcción de un gráfico de objetos. Si dicho en términos sencillos, la inversión de control implica un cambio en el flujo de control del programa. P.ej. En aplicación tradicional independiente, tenemos el método principal, desde donde el control se pasa a otras bibliotecas de terceros (en el caso, hemos utilizado la función tercero de la biblioteca del partido), sino a través de la inversión de control de control se transfiere desde el código de biblioteca de terceros a nuestro código , ya que estamos dando el servicio de la biblioteca de terceros. Pero hay otros aspectos que necesitan ser invertida dentro de un programa - por ejemplo, la invocación de métodos e hilos para ejecutar el código.

Para aquellos interesados en más profundidad sobre Inversión de Control un documento ha sido publicado esbozar un cuadro más completo de Inversión de Control como un patrón de diseño (OfficeFloor: el uso de patrones de oficina para mejorar el diseño de software http://doi.acm.org/10.1145/ 2739011.2739013 con una copia gratuita disponible para descargar desde http://www.officefloor.net/mission.html )

Lo que se identifica es la siguiente relación:

Inversión de Control (para los métodos) = dependencia (estado) Inyección + Continuación Inyección + Inyección Thread

Respondida el 29/10/2015 a las 01:27
fuente por usuario

votos
14

Respondiendo sólo la primera parte. ¿Qué es?

Inversión de Control (COI) medios para crear instancias de dependencias primera y última instancia de una clase (opcionalmente inyección de ellos a través de constructor), en lugar de crear una instancia de la clase primero y luego la instancia de clase creación de instancias de dependencias. Por lo tanto, la inversión de control invierte el flujo de control del programa. En lugar de la parte llamada controlar el flujo de control (mientras que la creación de dependencias), la persona que llama controla el flujo de control del programa .

Respondida el 10/01/2016 a las 21:49
fuente por usuario

votos
3

Para entender el concepto, Inversión de Control (IoC) o dependencia Inversión Principio (DIP) implica dos actividades: la abstracción, y la inversión. Inyección de dependencias (DI) es sólo uno de los pocos de los métodos de inversión.

Para leer más sobre esto se puede leer mi blog aquí

  1. ¿Qué es?

Es una práctica donde se deja que el comportamiento real venir de fuera del límite (Clase de Programación Orientada a Objetos). La entidad límite sólo se conoce la abstracción (por ejemplo, interfaz, clase abstracta, delegado en la programación orientada a objetos) de él.

  1. ¿Qué problemas resuelve?

En términos de programación, la COI tratar de resolver código monolítica por lo que es modular, desacoplamiento diversas partes de él, y hacer que la unidad comprobable.

  1. ¿Cuándo es apropiado y cuándo no?

Es adecuada la mayor parte del tiempo, a menos que tenga situación en la que lo que desea es monolítica de código (por ejemplo, programa muy simple)

Respondida el 02/06/2016 a las 22:46
fuente por usuario

votos
6

Me gusta esta explicación: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

Se inicia simple y muestra ejemplos de código también.

introducir descripción de la imagen aquí

El consumidor, X, necesita la clase consumido, Y, para lograr algo. Todo eso es bueno y natural, pero ¿X realmente necesita saber que utiliza Y?

¿No es suficiente que X sabe que utiliza algo que tiene el comportamiento, los métodos, propiedades, etc., de Y sin saber que en realidad implementa el comportamiento?

Mediante la extracción de una definición abstracta del comportamiento utilizado por X en Y, como se ilustra I a continuación, y dejando que el consumidor X utiliza una instancia de que en lugar de Y se puede seguir haciendo lo que hace sin tener que conocer los detalles acerca de Y.

introducir descripción de la imagen aquí

En la ilustración anterior Y implementa I y X utiliza una instancia de I. Si bien es muy posible que todavía utiliza X Y lo que es interesante es que X no sabe que. Sólo sabe que utiliza algo que implementa I.

Leer el artículo para obtener más información y descripción de los beneficios tales como:

  • X no depende de Y ya
  • Más flexible, la aplicación se puede decidir en tiempo de ejecución
  • Aislamiento de la unidad de código, las pruebas más fácil

...

Respondida el 15/02/2017 a las 23:03
fuente por usuario

votos
1

La primera versión de Java EE (J2EE en el momento) introdujo el concepto de inversión de control (COI), lo que significa que el contenedor podría tomar el control de su código de negocio y prestar servicios técnicos (como la transacción o gestión de la seguridad).

Respondida el 03/04/2017 a las 19:42
fuente por usuario

votos
4

Yo entiendo que la respuesta ya se ha dado aquí. Pero aún así creo, algunos conceptos básicos sobre la inversión de control tienen que ser discutidas aquí en longitud para los futuros lectores.

Inversión de Control (IoC) se ha construido en un principio muy simple llamado Hollywood Principio . Y dice que,

No nos llame, le llamaremos

Lo que significa es que no van a Hollywood para cumplir su sueño en lugar si son dignos de Hollywood a continuación va a encontrar y hacer que su sueño se hace realidad. Casi invertida, ¿eh?

Ahora bien, cuando hablamos sobre el principio de la COI, que utilizamos para olvidarse de la Hollywood. Para COI, tiene que haber tres elementos, un Hollywood, usted y una tarea como para cumplir su sueño.

En nuestro mundo de la programación, Hollywood representan un marco genérico (puede ser escrito por usted u otra persona), que representa el código de usuario que escribió y la tarea representar lo que quiere lograr con su código. Ahora que no siempre va a desencadenar su tarea por sí mismo, no en la COI! En lugar de haber diseñado todo en su marco de tal manera que se disparará su tarea para usted. Por lo tanto usted ha construido un marco reutilizable que se puede hacer a alguien un héroe o un villano otra. Pero ese marco es siempre responsable, que sabe cuándo recoger a alguien y ese alguien sólo sabe lo que quiere ser.

Un ejemplo de la vida real, se da aquí. Supongamos, se quiere desarrollar una aplicación web. Así, se crea un marco que se encargará de todas las cosas comunes de una aplicación web debe manejar como el manejo de petición HTTP, la creación de menú de la aplicación, sirviendo páginas, la gestión de las cookies, desencadenando eventos, etc.

Y después de salir de algunos ganchos en su marco donde se puede poner códigos adicionales para generar páginas de menús personalizados, galletas, o cerrar la sesión algunos eventos de usuario, etc. En cada petición del navegador, su marco tendrá una duración y ejecuta sus códigos personalizados si enganchado luego servir de nuevo al navegador.

Por lo tanto, la idea es bastante simple. En lugar de crear una aplicación de usuario que controlará todo, primero se crea un marco reutilizable que controlará todo luego escribir sus códigos personalizados y engancharlo al marco para ejecutar los de tiempo.

Laravel y EJB son ejemplos de una marcos tales.

Referencia:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

Respondida el 01/10/2017 a las 08:24
fuente por usuario

votos
4

He encontrado un ejemplo muy claro aquí que explica cómo 'se invierte el control de' la.

código clásico (sin inyección de dependencias)

Así es como un código de no usar DI funcionará más o menos:

  • Aplicación necesita Foo (por ejemplo, un controlador), por lo que:
  • Aplicación crea Foo
  • Aplicación llama Foo
    • Foo necesita Bar (por ejemplo, un servicio), por lo que:
    • Foo crea Bar
    • Foo llama Bar
      • Bar necesita Bim (un servicio, un repositorio, ...), así:
      • Bar crea Bim
      • Bar hace algo

Utilizando la inyección de dependencia

Así es como un código usando DI funcionará más o menos:

  • Foo necesidades de aplicación, que necesita Bar, que necesita Bim, por lo que:
  • Aplicación crea Bim
  • Aplicación crea bar y le da Bim
  • Foo aplicación crea y le da Barra
  • Aplicación llama Foo
    • Foo llama Bar
      • Bar hace algo

El control de las dependencias se invierte de un ser llamado a la vocación.

¿Qué problemas resuelve?

La inyección de dependencia hace que sea fácil de intercambiar con los diferentes aplicación de las clases inyectados. Mientras que las pruebas unitarias se puede inyectar una implementación ficticia, lo que hace que la prueba sea mucho más fácil.

Ejemplo: Supongamos que su aplicación almacena el archivo subido por el usuario en la unidad de Google, con su código DI controlador puede tener este aspecto:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

Cuando los requisitos de cambio dicen que, en lugar de Google Drive se le pide que utilice el Dropbox. Sólo tiene que escribir una aplicación Dropbox para el StorageServiceInterface. No es necesario que realice los cambios en el controlador, siempre y cuando la aplicación de Dropbox se adhiere a la StorageServiceInterface.

Mientras que las pruebas se puede crear la maqueta para el StorageServiceInterface con la implementación ficticio en el que todos los métodos devuelven nulo (o cualquier valor predefinido como por su exigencia de pruebas).

En cambio si tuviera la clase del controlador para construir el objeto de almacenamiento con la newpalabra clave de esta manera:

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

Cuando se quiere cambiar con la aplicación de Dropbox tiene que reemplazar todas las líneas donde newobjeto GoogleDriveService se construye y utilizar el DropboxService. Además cuando se prueba la clase SomeController el constructor siempre espera la clase GoogleDriveService y los métodos actuales de esta clase se activan.

¿Cuándo es apropiado y cuándo no? En mi opinión DI utiliza cuando se piensa que hay (o puede haber) implementaciones alternativas de una clase.

Respondida el 04/11/2017 a las 10:27
fuente por usuario

votos
3

La inversión de control es cuando vas a la tienda de comestibles y su esposa le da la lista de productos a comprar.

En términos de programación se aprobó una función de llamada getProductList()a la función que se está ejecutando doShopping();

Permite al usuario de la función para definir algunas partes de ella por lo que es más flexible.

Respondida el 15/12/2017 a las 15:35
fuente por usuario

votos
4

La inversión de control consiste en la transferencia de control de biblioteca en el cliente. Tiene más sentido cuando hablamos de un cliente que inyecta (pasa) un valor de función (expresión lambda) en una función de orden superior (función de biblioteca) que controla (cambios) el comportamiento de la función de la biblioteca. Un cliente o un marco que inyecta dependencias de la biblioteca (que llevan el comportamiento) en bibliotecas también pueden ser considerados COI

Respondida el 24/12/2017 a las 15:34
fuente por usuario

votos
0

La inversión de control significa controlar cómo los componentes (clases) se comportan. Por lo que su llamada "inversión" porque antes de este patrón de las clases eran cableado y fueron definitivas sobre lo que van a hacer por ejemplo,

importar una biblioteca que tiene una TextEditory SpellCheckerclases. Ahora, naturalmente, esto SpellCheckersólo sería comprobar la ortografía de la lengua Inglés. Supongamos que si desea que el TextEditorde manejar el idioma alemán y ser capaz de revisar la ortografía tiene ningún control sobre él.

con la COI este control se invierte es decir, su dado a usted, ¿cómo? la biblioteca implementaría algo como esto:

Tendrá una TextEditorclase y luego tendrá una ISpeallChecker(que es una interfaz en lugar de un concret SpellCheckerclase) y al configurar las cosas en la COI contenedor por ejemplo la primavera puede proporcionar su propia implementación de 'ISpellChecker' que comprobar la ortografía de la lengua alemana. por lo que el control de cómo va a funcionar corrección ortográfica se ineverted se toma de esa biblioteca y le será administrado. Eso es COI.

Respondida el 14/02/2019 a las 23:03
fuente por usuario

votos
0

¿Qué es? Inversión de (acoplamiento) de control, cambia la dirección de acoplamiento para la firma del método. Con el control invertida, la definición de la firma del método es dictado por la implementación del método (en lugar de la persona que llama del método). Explicación completa aquí

¿Qué problema soluciona? De arriba hacia abajo acoplamiento en los métodos. Esto elimina posteriormente necesidad de refactorización.

¿Cuándo es apropiado usar y cuándo no? Para pequeñas aplicaciones bien definidas que no están sujetos a grandes cambios, es probable que una sobrecarga. Sin embargo, para aplicaciones menos definidos que van a evolucionar, se reduce el acoplamiento inherente de la firma del método. Esto le da a los desarrolladores más libertad para desarrollar la aplicación, evitando la necesidad de hacer costosas refactorización de código. Básicamente, permite la aplicación de evolucionar con poco reproceso.

Respondida el 28/02/2019 a las 17:37
fuente por usuario

votos
0

Para entender la COI, habría que hablar de dependencia Inversion.

Dependencia de la inversión: dependa de abstracciones, no en concreciones.

La inversión de control: Principal vs abstracción, y cómo el principal es el pegamento de los sistemas.

DIP y la COI

Estos son algunos buenos mensajes que hablan de esto:

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/

Respondida el 13/04/2019 a las 14:58
fuente por usuario

votos
0

Realmente no comprender por qué hay un montón de respuestas incorrectas e incluso la aceptaron no es del todo precisos para preparar cosas difíciles de entender. La verdad es siempre simple y limpio.

Como @Schneider comentó en la respuesta de @ Marcos Harrison , por favor, acabo de leer el post de Martin Fowler discutir COI.

https://martinfowler.com/bliki/InversionOfControl.html

Uno de los más amo es:

Este fenómeno es Inversión de Control (también conocido como el Principio de Hollywood - "No nos llame, le llamaremos").

¿Por qué?

Wiki para la COI , que podría citar un fragmento.

La inversión de control se utiliza para aumentar la modularidad del programa y que sea extensible ... entonces popularizó aún más en 2004 por Robert C. Martin y Martin Fowler .

Robert C. Martin: el autor de <<Clean Code: A Handbook of Agile Software Craftsmanship>>.

Martin Fowler: el autor de <<Refactoring: Improving the Design of Existing Code>>.

Respondida el 09/05/2019 a las 03:39
fuente por usuario

votos
1

He leído un montón de respuestas para esto, pero si alguien todavía está confundido y necesita un plus ultra "laymans término" explicar COI aquí es mi opinión:

Imagine un padre y un hijo a hablar entre sí.

Sin COI:

* Padres : Sólo se puede hablar cuando te pido que las preguntas y que sólo puede actuar cuando te dé permiso.

Padres : Esto quiere decir, que no me puede preguntar si se puede comer, jugar, ir al baño o incluso dormir si yo no te pido.

Padres : ¿Quieres comer?

Niño : No.

Padres : Está bien, voy a estar de vuelta. Espérame.

Niño : (quiere jugar, pero ya no hay duda de que el padre, el niño no puede hacer nada).

Después de 1 hora...

Padres : estoy de vuelta. ¿Quieres jugar?

Niño : Sí.

Padres : Permiso concedido.

Niño : (finalmente es capaz de jugar).

Este escenario simple explica el control se centra en el padre. La libertad del niño es limitado y depende en gran medida cuestión de los padres. El niño puede sólo hablar cuando se le preguntó a hablar, y puede SOLAMENTE actuar cuando concedido el permiso.

Con la COI:

El niño tiene ahora la capacidad de hacer preguntas y el padre puede responder con respuestas y permisos. Simplemente el medio de control se invierte! El niño es ahora libre de hacer preguntas en cualquier momento y aunque todavía hay la dependencia con los padres con respecto a los permisos, que no depende de los medios de hablar / hacer preguntas.

En una forma tecnológica de explicar, esto es muy similar a la consola / cáscara / cmd vs interacción GUI. (¿Qué es la respuesta de Mark Harrison por encima de respuesta más no.2). En la consola, que dependen de la lo que se pide / INDICADA, y no se puede saltar a otros menús y características sin contestar es cuestión en primer lugar; siguiendo un estricto flujo secuencial. (programación esto es como un bucle método / función). Sin embargo, con interfaz gráfica de usuario, los menús y las funciones están diseñadas, y el usuario puede seleccionar lo que necesita por lo tanto tener más el control y ser menos restringido. (programación, menús tienen devolución de llamada cuando se selecciona y se lleva a cabo una acción).

Respondida el 07/08/2019 a las 02:45
fuente por usuario

votos
0

Dado que ya hay muchas respuestas para la pregunta, pero ninguno de ellos muestra el desglose del término de control Inversion veo una oportunidad para dar una respuesta más concisa y útil.

Inversión de Control es un patrón que implementa la Dependencia Inversion Principio (DIP). estados DIP lo siguiente: 1. Los módulos de alto nivel no deben depender de los módulos de bajo nivel. Ambos deben depender de abstracciones (por ejemplo, interfaces). 2. Las abstracciones no deben depender de los detalles. Detalles (implementaciones concretas) deben depender de abstracciones.

Hay tres tipos de Inversión de Control:

Interfaz de Inversión proveedores no deben definir una interfaz. En su lugar, el consumidor debe definir la interfaz y los proveedores deben ponerlo en práctica. Interfaz de Inversion permite eliminar la necesidad de modificar el consumidor cada vez que se añade un nuevo proveedor.

Inversión de flujo de control de cambios del flujo. Por ejemplo, usted tiene una aplicación de consola en la que le pide que introduzca muchos parámetros y después de cada entraron parámetro que se ve obligado a pulsar Intro. Puede aplicar Flujo Inversion aquí e implementar una aplicación de escritorio en el que el usuario puede elegir la secuencia de introducción de parámetros, el usuario puede editar los parámetros, y en el último paso, el usuario debe pulsar Enter sólo una vez.

Inversion creación Puede ser implementado por los siguientes patrones: patrón de la fábrica, Servicio de Localización y inyección de dependencias. Creación Inversion ayuda a eliminar las dependencias entre los tipos de hacer avanzar el proceso de dependencia objetos creación fuera del tipo que utiliza estos objetos de dependencia. ¿Por qué dependencias son malos? Aquí hay un par de ejemplos: creación directa de un nuevo objeto en el código hace que las pruebas más difíciles; es imposible cambiar las referencias en asambleas sin recompilación (OCP violación principio); no se puede reemplazar fácilmente un escritorio-UI por una interfaz de usuario web.

Respondida el 12/08/2019 a las 18:36
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more