11

Durante aproximadamente 2 meses he estado leyendo todo lo que puedo encontrar para estos 3 temas y todavía no estoy seguro de haberlo conseguido.DIP vs. DI vs. IoC

  1. Dependencia Inversión Principio. Significa que siempre debes confiar únicamente en las interfaces y no en sus implementaciones. Si su clase depende de cualquier otra clase, eso es malo, porque depende de los detalles de esa segunda clase. Si su clase depende de la interfaz, eso está absolutamente bien, ya que este tipo de dependencia solo significa que su clase necesita algo abstracto que pueda hacer algo específico y que realmente no le importe la forma en que lo hace.

    Como P en "DIP" es sinónimo de "Principio", probablemente debería definir de esta manera: Dependencia Inversion principio es un principio que requiere que todas las entidades de su código que sólo dependen de los detalles que realmente necesidad.

    Por "detalles que realmente necesitan" me refiero a interfaces para el caso más simple. También utilicé la palabra "entidades" para enfatizar que DIP también es aplicable a los procedimientos y cualquier otra cosa, no solo a las clases.

  2. Dependencia de inyección. Solo es aplicable a entidades habilitadas para DI. La entidad activada por DI es una entidad que está "abierta" para configurar su comportamiento sin cambiar sus componentes internos. Hay 2 tipos básicos de inyección (cuando se habla de clases):

    • Constructor inyección - es cuando se pasa todos los detalles requeridos "abstractas" al objeto simplemente por el momento está a punto de ser construido.
    • Setter Injection - es cuando "aclaras" los aspectos necesarios después de que el objeto ya ha sido creado.

    Por lo tanto, la definición es, probablemente, como siguiente: inyección de dependencia es un proceso de pasar los detalles "abstractos" a la entidad que realmente necesita estos detalles.

    Por "realmente necesita estos detalles" quiero decir interfaces para el caso más simple. La palabra "entidades" se usa, como siempre, para enfatizar que DI también se aplica a procedimientos y cualquier otra cosa.

  3. Inversión de control. A menudo se define como "diferencia entre bibliotecas y marcos", como "escribir programas de cualquier forma que haya hecho en la programación de procedimientos", etc. Esa es la cosa más confusa para mí. Creo que la idea principal aquí es simplemente iniciar cualquier acción. O haces algo "siempre que quieras" (forma procedimental), o "esperas" hasta que alguien te pregunte (forma de IoC).

    Mi definición es: COI es una propiedad del flujo de ejecución de su programa, cuando no se hace nada hasta que piden que hacerlo.

    Suena exactamente como "Principio de Hollywood", pero creo que "Hollywood Principle" y IoC son absolutamente la misma idea.

¿Lo entiendo?

Respuesta

15

Mi opinión es esta: DIP es el principio que nos guía hacia DI. Básicamente, acoplamiento flojo es el objetivo, y hay al menos dos formas de lograrlo.

  • inyección de dependencias
  • Servicio de Localización de

Sin embargo, Service Locator is an anti-pattern y no tiene nada que ver con el DIP. DI, sin embargo, es la aplicación correcta del DIP.

El relationship between DI and IoC has been explained before.

Por cierto, cuando se habla de DI y acoplamiento flojo, la terminología presentada en Domain-Driven Design es la más aplicable. Básicamente, Services are the only kinds of objects subjected to DI.

+0

"DI, sin embargo, es la aplicación correcta del DIP". No entiendo cómo sigue esto. –

+1

@DaveHillier Cuando sus clases usan DI para obtener implementaciones de detalles de bajo nivel de los que dependen, entonces están siguiendo el DIP. La idea es que la clase de "alto nivel" solo depende de una abstracción (interfaz) de un detalle de bajo nivel. Sin embargo, cuando creamos esa clase de alto nivel (a través de 'new') necesita una implementación real de esa interfaz para usar, de lo contrario obtendrá una excepción de puntero nulo. ¿Cómo obtiene la clase de alto nivel una clase concreta cuando todo lo que sabe es una interfaz? Inyección de dependencia. Vea el excelente libro de Mark Seemann para más detalles de DI. –

+0

https://martinfowler.com/articles/dipInTheWild.html – lfk

0

Mi 20c, código de inicio. Probablemente tengas al menos una idea aproximada de cómo funciona. Codificar una prueba de concepto (POC) será una excelente manera de ver cómo encajan las cosas y trabajar en tiempo de desarrollo y ejecución. La lectura solo te llevará tan lejos, hacer realmente ayudará a que haga clic.

Si no sabe por dónde empezar, la mayoría de las publicaciones de blog sobre DI tienen ejemplos simples que puede ejecutar. No te quedes atascado en qué marco utilizar (Unity, Spring, Castle Windsor, etc.) porque realmente no importa para un POC.

+1

Estoy muy preocupado por el hecho de que la mayoría de estos blogs solo tratan de "Service Locator vs. DI". Es realmente difícil encontrar algo sobre el uso real. – agibalov

Cuestiones relacionadas