Principio de inversión de dependencia: comprender cómo los componentes de bajo nivel y los componentes de alto nivel dependen de las abstracciones

10

Estoy aprendiendo sobre el principio de inversión de dependencia. Se afirma que:

Los módulos de alto nivel no deberían depender de los módulos de bajo nivel. Ambos deberían depender de abstracciones.

Durante un tiempo traté de comprender lo que significa que tanto los componentes de alto nivel como los componentes de bajo nivel dependen de las abstracciones y dependen de ellos .

Supongo que ambos deberían depender de la misma abstracción de alguna manera. Por favor corrígeme si esto está mal.

He llegado a alguna conclusión sobre lo que esto significa. Por favor confirme si esto es correcto.

ingrese la descripción de la imagen aquí

" Los componentes de alto nivel dependen de la abstracción" - Significado:

Los componentes de alto nivel se comunican con una interfaz para comunicarse con los componentes de bajo nivel , en lugar de comunicarse directamente con componentes concretos de bajo nivel. Los componentes de bajo nivel implementan esta interfaz.

" Los componentes de bajo nivel dependen de la abstracción" - Significado:

Los componentes de bajo nivel están definidos y diseñados en los términos de la interfaz. Están diseñados para adaptarse a la interfaz . Dependen de la interfaz, en la forma en que la interfaz define cómo están diseñados. (A menudo, las clases de bajo nivel implementan esa interfaz).

De esta manera, tanto los componentes de alto nivel como los de bajo nivel son "dependientes de la abstracción", pero de diferentes maneras.

¿Es esto un buen entendimiento?

Aviv Cohn
fuente
8
Eres bastante acertado. La última pieza del rompecabezas es que la interfaz está definida por el componente de alto nivel , no por el de bajo nivel. En otras palabras, la preocupación de alto nivel (por ejemplo, el modelo de dominio) puede elegir la forma más conveniente de hablar con el código de bajo nivel (como el código de acceso a datos), y es el trabajo del código de bajo nivel cumplir a esa interfaz. Cuando comprende que la interfaz es parte del comportamiento de alto nivel, el término 'inversión de dependencia' tiene mucho más sentido.
Benjamin Hodgson
1
@BenjaminHodgson ya veo. Déjame ver si entiendo. Obviamente un objeto no puede definir una interfaz, ese es el trabajo del programador. Entonces, por "la interfaz está definida por el componente de alto nivel" , supongo que quiere decir "el programador define la interfaz en términos de lo que será una forma conveniente para que los componentes de alto nivel hablen con los de bajo nivel ". ¿Confirmas?
Aviv Cohn el
(ya que los de bajo nivel luego implementarán esta interfaz y se construirán de acuerdo con ella)
Aviv Cohn
Sí, obviamente todo el código está escrito por el programador. Estaba tratando de transmitir la idea de que la interfaz es conceptualmente parte de la preocupación de alto nivel; debe ponerlo en el mismo paquete que su código de alto nivel y debe cambiar de acuerdo con los requisitos comerciales, no en respuesta a cambios en los detalles de implementación.
Benjamin Hodgson
1
Solo agregaría una advertencia de que, aunque es ideal, no siempre se le da el lujo de definir la interfaz de bajo nivel en términos de los requisitos del componente de alto nivel. Por ejemplo, si está integrando una biblioteca existente que proporciona alguna funcionalidad útil en su aplicación, es probable que tenga componentes de alto nivel que representen la función comercial que está tratando de lograr. Usan esa biblioteca de bajo nivel (como quizás iText, por ejemplo) para hacer el trabajo. Probablemente no tendrá el lujo de definir la abstracción sin tener en cuenta lo que iText necesita.
Calphool

Respuestas:

6

Su comprensión del concepto es muy precisa.

Señalar excepciones, casos especiales o minucias filosóficas en este momento lo desviaría de su claridad de concepto actual.

Sin embargo, sugeriría que use símbolos UML:

ingrese la descripción de la imagen aquí

  • Flecha abierta: usos
  • Flecha cerrada: hereda o implementa
  • << nombre entre paréntesis >>: interfaz o clase abstracta
Tulains Córdova
fuente
0

Sí, mucha gente piensa en la construcción de software como en la construcción de edificios. La base de datos es la "base" en la que se encuentra el DAL, la capa empresarial se sienta en la DAL, la interfaz de usuario se sienta en la capa empresarial ...

En cambio, piense en ello como un móvil colgante. Donde las "capas" cuelgan de un ancla común. La interfaz de usuario y la capa empresarial se cuelgan de la interfaz empresarial, la capa empresarial y el DAL se cuelgan de la interfaz DAL, DAL y la base de datos se conectan a través de la interfaz DB.

Michael Brown
fuente