Principio de inversión de dependencia: ¿Cómo definir la "política de alto nivel" y el "detalle de bajo nivel" para otras personas?

13

Estoy tratando de explicar el principio de inversión de dependencia a mis colegas (en su mayoría junior). ¿Cómo podemos definir cuál es la "política de alto nivel" y cuál es el "detalle de bajo nivel" en un software? Por ejemplo, si nuestro software automatiza el flujo de trabajo de varias aplicaciones comerciales, ¿por qué decimos que la automatización del flujo de trabajo es la política de alto nivel y las aplicaciones comerciales son los detalles?

Louis Rhys
fuente

Respuestas:

11

Nota: esto ha sido completamente reescrito de mi ejemplo anterior

Piensa en tomas de corriente. En cualquier nación, la política de alto nivel es que los enchufes de energía son siempre los mismos. No importa de dónde obtenga la electricidad (carbón, gas, nuclear), los enchufes en la pared siempre deben emitir la misma cantidad de energía, a través del mismo conjunto de conectores.

Ahora puede enchufar cualquier dispositivo en ese zócalo, porque todos tienen una interfaz común, el "enchufe". La política de alto nivel nunca tiene que dictar ninguna parte de ese detalle de implementación. Simplemente conecte algo y listo.

Ahora, si tiene un dispositivo que no quiere alimentación de CA, tal vez se ejecuta en un circuito de CC de 7 V, aún puede usar esa política de alto nivel, solo necesita algún tipo de adaptador entre la fuente de alimentación y el dispositivo. Y, dado que todos tienen la misma política de alto nivel, el fabricante puede incorporarla a la implementación, sin ningún cambio en la política de alto nivel. La persona que conecta la implementación a la política (usted, conectando su computadora portátil) tampoco necesita entenderlo.

Además, si el fabricante quiere vender el mismo dispositivo en otro país, todo lo que tiene que hacer es desarrollar un adaptador diferente. Entonces, la misma implementación puede funcionar con múltiples políticas, mientras que la misma política puede ejecutar múltiples implementaciones.

Este es un ejemplo perfecto de inversión de dependencia.

Pero aquí está lo interesante: regrese a lo que dije por primera vez. "No importa de dónde obtengas la electricidad". Este también es un detalle de implementación. La política de alto nivel sigue siendo que todos los enchufes tienen la misma forma y emiten el mismo tipo de energía. Los detalles de implementación de bajo nivel son tanto de dónde proviene la electricidad como a qué se dirige.

En términos de programación, eso significa que la política de alto nivel es la interfaz (donde un lenguaje lo admite. Otra forma de DI es el tipeo de pato) que proporciona una API y la aplicación consume, y los detalles de implementación de bajo nivel son ambos la aplicación la consume y la API en sí, ninguna de las cuales necesita entenderse entre sí.

Los adaptadores pueden usarse para ajustar la misma implementación en diferentes políticas.

pdr
fuente
+1 Crikey. No sabía que podía aprender mucho de una simple toma de corriente :)
dreza
7

El enfoque clásico en la reutilización de software es construir componentes que no dependen de nada más (eso es lo que los hace de bajo nivel), y luego construir componentes de nivel superior que dependen de componentes de nivel inferior. "alto nivel" y "bajo nivel" están determinados específicamente por la dirección de la dependencia, que no es inherente a la función del componente, sino que a menudo es solo una decisión arquitectónica.

Por lo tanto, cuando las aplicaciones empresariales individuales se crean sin depender de la automatización del flujo de trabajo, pero su controlador de flujo de trabajo tiene dependencias directas de la aplicación empresarial, entonces debe quedar claro que la automatización del flujo de trabajo es una "política de alto nivel" y la aplicación empresarial es un componente de "bajo nivel". Tenga en cuenta que esta estructura no es obligatoria: si su componente de automatización de flujo de trabajo es un marco general, que tampoco está acoplado a sus aplicaciones comerciales específicas, pero puede configurarse para servir diferentes aplicaciones, entonces ya ha comenzado a aplicar el DIP. En esta situación, la separación de "alto nivel" / "bajo nivel" puede que ya no tenga sentido entre esas dos cosas.

Por lo tanto, el nombre "inversión de dependencia" es algo engañoso, ya que las dependencias no están "invertidas", sino que se eliminan por completo (o para ser más precisos: cambiaron de dependencias de tiempo de compilación a dependencias de tiempo de ejecución).

Doc Brown
fuente
1
No exactamente. La inversión ocurre porque los niveles inferiores dependen de la interfaz. Aplicando el Principio de segregación de interfaz (la I en SÓLIDO), esa interfaz "pertenece" al cliente. Entonces el nivel inferior metafóricamente depende del cliente.
Michael Brown
2
@MikeBrown: ese es un punto de vista posible. Prefiero el punto de vista donde la interfaz no pertenece ni a A ni a B, sino a la infraestructura o el entorno de A y B.
Doc Brown
1

Yo uso una imagen simple para explicar DIP. La vista clásica del desarrollo de software es como un proceso de construcción con cada capa encima de las capas inferiores que lo soportan. Usar el principio de inversión de dependencia es más como construir un móvil.Hanging Mobile

En lugar de las capas superiores ubicadas en las capas inferiores, las capas superiores en la interfaz móvil con las capas inferiores a través de la cadena que las conecta. En cierto modo, las capas inferiores dependen de esa interfaz para soporte (sin la cadena que caerían). Eso es DIP en pocas palabras.

Michael Brown
fuente
+1 para la buena comparación. En esta imagen, puede ver mi punto: todas las capas dependen de las interfaces, pero no las capas inferiores en las superiores o viceversa.
Doc Brown
Veo lo que estás diciendo, la interfaz no pertenece ni al nivel superior ni al inferior.
Michael Brown
1
No preguntó cómo explicar DIP, preguntó cómo explicar qué partes de la aplicación son políticas de alto nivel y cuáles son implementaciones de bajo nivel. Su analogía no tiene que extenderse mucho para hacer eso. Solo necesita poder cambiar las decoraciones sin cambiar la cadena (porque si no puede, la política móvil de alto nivel tiene demasiados detalles sobre la implementación de la decoración).
pdr
1
(y, de hecho, puede construir un móvil completamente nuevo a partir de diferentes materiales y colgar las mismas decoraciones, que es el punto de Doc Brown)
pdr