Diferencia entre "Inversión de Control", "Inversión de dependencia" y " Desacoplamiento"


Estoy leyendo teoría sobre inversión de dependenciay desacoplamiento y no puedo ver la diferencia entre los dos.

Dependency inversion habla de desacoplar componentes funcionales para que los componentes de nivel superior no dependan de los componentes de nivel inferior.

El desacoplamiento habla de lo mismo y de cómo lograrlo. Pero entonces tenemos Contenedores IoC que desordenan las cosas aún más. ¿Por qué no se llaman más bien Contenedores de Inversión de Dependencias o aún mejor Contenedores de inyección de dependencias , porque sirven para el acoplamiento en tiempo de ejecución de componentes independientes?

Entonces tenemos Inversión de Control. Es básicamente lo mismo que Inversión de dependencia ¿no es así? ¿Por qué hay tres términos que describen la misma cosa? ¿O soy ciego?

  1. ¿Cuál es la diferencia entre los tres?
  2. ¿Qué tiene que hacer el CoI en los contenedores del CoI?
Author: Robert Harvey, 2010-10-12

3 answers

La disociación es un principio muy general aplicable en muchos ámbitos. La inversión de dependencias es una forma específica de desacoplamiento en la que desacopla los niveles más altos de su sistema de los niveles más bajos separándolos en bibliotecas y utilizando interfaces. Esto le permite reemplazar partes de nivel inferior de su sistema sin grandes modificaciones.

Por ejemplo, en lugar de que las partes de nivel superior del sistema creen instancias concretas de las clases de nivel inferior, un CoI el contenedor se puede usar para desacoplar cómo se crean los objetos.

Inversion of control es un principio de diseño utilizado por las bibliotecas de framework que permiten al framework recuperar algo de control de la aplicación. Es decir, un marco de ventanas puede volver a llamar al código de la aplicación cuando ocurren ciertos eventos de la interfaz de usuario. Martin Fowler usa el término Principio de Hollywood como en No nos llames, te llamaremos . El desacoplamiento es una parte importante de la inversión de control.

Pero, ¿qué tiene un contenedor IoC que ver con la inversión de control? Para citar a Martin Fowler :

Inversión de control es un término demasiado genérico, y por lo tanto la gente lo encuentra confuso. Como resultado, con mucha discusión con varios defensores del CoI, nos decidimos por la inyección de Dependencia de nombres.

(Tenga en cuenta que Martin Fowler habla de inyección de dependencia, no inversión de dependencia.)

Un contenedor CoI ayuda para implementar la inyección de dependencia y tal vez un mejor término sería contenedor de inyección de dependencia. Sin embargo, el nombre del contenedor del CoI parece pegarse. La inyección de dependencia es un componente importante en la inversión de dependencia, pero el uso de contenedores IoC para la inyección de dependencia puede ser confuso ya que la inversión de control es un principio más amplio y genérico.

Usted señala que el nombramiento no es muy consistente, pero eso no debería ser una gran sorpresa, ya que estos términos han sido independientes inventados y utilizados a pesar de que se superponen.

 51
Author: Martin Liversage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-02 20:44:48

La Inyección de Dependencia logra Disociación con Inversión de Control.

 38
Author: Boris Pavlović,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-12 10:19:50

Encuentro la siguiente explicación de DIP in the Wild artículo sobre martinfowler.com sencillo de entender (aquí DI = Inyección de Dependencia, DIP = Principio de Inversión de Dependencia, IoC = Inversión de Control):

DI es acerca de cómo un objeto adquiere una dependencia. Cuando una dependencia es proporcionado externamente, entonces el sistema está utilizando DI. El CoI trata sobre quién inicia la llamada. Si su código inicia una llamada, no es IoC, si las llamadas al contenedor / sistema / biblioteca volver al código que usted proporcionó es, es CoI.

DIP, por otro lado, es sobre el nivel de la abstracción en el mensajes enviados desde su código a la cosa que está llamando. (...) DI es acerca de cableado, IoC es acerca de la dirección, y DIP es acerca de la forma [del objeto de los cuales depende el código].

 13
Author: hidro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 09:10:42