2009-03-03 6 views
6

¿El "Principio de Inversión de Dependencia" (DIP) y el "Principio de Diseño a Interfaces" expresan el mismo principio? Si no, ¿cuál sería la diferencia?¿Los "principios de inversión de dependencia" y "diseño de interfaces" son los mismos?

EDITAR

Para clarificar y delimitar el contexto un poco: por la interfaz me refiero a una interfaz de programación, como Java interface o una clase base abstracta pura en C++. No hay otros 'contratos' involucrados.

+0

¿Quiere decir Inyección de dependencia (también conocida como Inversión de control)? – tehvan

+0

No encuentro ninguna información en Google sobre el "Principio de Diseño a Interfaces". ¿Puede explicarme qué quiere decir con eso? – Trumpi

+0

Probablemente signifique "diseño por contrato" – troelskn

Respuesta

-1

"diseño por contrato" e "inyección de dependencia" están muy relacionados, pero tienen diferentes niveles de abstracción. "diseño por contrato" es un principio de diseño muy general, que puede ser respaldado por diversas técnicas; En un lenguaje que tiene un sistema de clase similar a Java, una técnica es usar interfaces para evitar dependencias de clase concretas. La "inyección de dependencia" es otra técnica que a menudo se basa en la existencia de interfaces para funcionar (pero no siempre es necesario; depende del idioma). Diría que la "inyección de dependencia" respalda el principio de "diseño por contrato".

0

El diseño de las interfaces (como una variante de design by contract) admite la inversión de la dependencia. Ambos reducen el acoplamiento. Sin embargo:

  • Diseño de interfaces y DBC dice nada acerca de cómo los objetos son creados (DIP, por ejemplo, abstract factories, factory methods).
  • Inversión de dependencias (dependency injection) generalmente se basa en interfaces, pero se centra en el ciclo de vida del objeto en lugar del diseño de clases. Puede usar DIP con clases base abstractas si lo desea, por lo que no está realmente comprometido con las interfaces puras.

Los enfoques tienden a complementarse entre sí.

+0

A (pura) clase base abstracta = interfaz. – eljenso

+1

¿Y dónde habla el DIP sobre la creación de objetos/ciclos de vida? Tal vez algunos patrones que entran en la categoría de "creación" o "ciclo de vida" van bien con DIP, pero seguramente DIP como principio no se preocupa por eso y se trata de diseño. – eljenso

+2

Dependencia * inversión * y dependencia * inyección * están lejos de ser lo mismo. –

2

Sólo quería hablar y citar a Derek Greer en another question very similar to this one, ya que responde esta pregunta muy bien, en mi opinión.

"Lo que la Dependencia Inversion Principio no se refiere a es la simple práctica de abstraer dependencias mediante el uso de interfaces (por ejemplo MyService → [ILogger ⇐ Logger])."

Si bien esto desacopla un componente del detalle de implementación específica de la dependencia, no invierten la relación entre el consumidor y la dependencia (por ejemplo [MyService → IMyServiceLogger] ⇐ Logger)."

2

Dependencia inversión es asegurar los módulos de nivel superior no dependa de módulos de nivel inferior. Por lo tanto, la lógica de la aplicación no depende de su modelo comercial o lógica de negocios. Hay una clara separación de preocupaciones.

El principio establece que su aplicación define y posee una interfaz que su nivel empresarial debe implementar. Esto forma en que su nivel de negocio depende de la interfaz definida de su aplicación. Por lo tanto, las dependencias están invertidas.

Expandiendo esto, si ahora tiene tres aplicaciones, cada una con sus propias interfaces implementadas por el nivel empresarial, su nivel empresarial puede cambiar, y siempre que implementen las interfaces como deben, entonces sus aplicaciones no son más prudentes.

Un buen ejemplo de Java de este principio y cómo un proyecto de este tipo estaría estructurado se puede encontrar aquí, en mi sitio web: http://www.jeenisoftware.com/maven-dip-principle-example/

Dependencia inversión no es tanto sobre el diseño de interfaz, aunque eso es lo que está sucediendo , se trata más bien de implementar un servicio. En otras palabras, un tipo de patrón de diseño orientado al servicio.

Cuestiones relacionadas