2009-11-10 38 views
18

En los últimos días, he leído mucho sobre la inyección/inversión de control/inversión de dependencia. Yo creo que eso, ahora mi comprensión del concepto es mucho mejor. Pero todavía no consigo el siguiente de wikipedia:Las abstracciones no deben depender de los detalles. Los detalles deben depender de las abstracciones

A. Los módulos de alto nivel no deberían depender de los módulos de bajo nivel. Ambos deben depender de las abstracciones. B. Las abstracciones no deben depender de los detalles. Los detalles deben depender de abstracciones.

entiendo la parte de módulos de alto nivel no debería depender de módulos de bajo nivel. Pero estoy confundido acerca de abstracciones y detalles. ¿Puede alguien simplificarlos para mí? Gracias.

Respuesta

28

Significa que si los detalles cambian, no deberían afectar la abstracción. La abstracción es la forma en que los clientes ven un objeto. Exactamente lo que sucede dentro del objeto no es importante. Tomemos un automóvil, por ejemplo, los pedales, el volante y la palanca de cambios son abstracciones de lo que sucede dentro del motor. Sin embargo, no dependen de los detalles porque si alguien cambia mi viejo motor por uno nuevo, aún así podría conducir el automóvil sin saber que el motor cambió.

Los detalles, por otro lado, DEBEN ajustarse a lo que dice la abstracción. No me gustaría implementar un motor que de repente haga que los frenos dupliquen la velocidad del automóvil. Puedo volver a implementar los frenos de la manera que quiera, siempre que externamente se comporten de la misma manera.

+2

Me gusta que el OP haya tenido problemas para entender este concepto: excelente respuesta clara y concisa gracias. –

1

Ejemplo de la abstracción y los detalles: una secuencia proporciona una interfaz para leer un token. Esa es una abstracción.

Una implementación de flujo de la secuencia está destinada a implementar la interfaz definida por la abstracción: por eso depende de ella. Si proporciona una interfaz diferente (una para leer 100 caracteres a la vez) no puede pretender implementar la misma abstracción.

1

Piense en el trabajo que necesita invocar y qué tan lejos está de donde está actualmente codificando. Hay un espectro allí; su posición en él representa la cantidad de trabajo que necesita hacer para invocar esa funcionalidad.

Las abstracciones mueven esa posición más cerca del código que está escribiendo. Por ejemplo, si tiene que llamar a un servicio web, puede: 1) escribir el código de llamada directamente donde necesita usarlo, o 2) poner esos detalles detrás de una abstracción (como una interfaz).

En este caso, el # 1 lo acerca más al servicio web en el espectro, mientras que el # 2 lo mantiene más cerca de su trabajo. Se puede decir que la abstracción es una medida de qué tan lejos tienes que estirar tu mente para comprender el trabajo que necesitas hacer.

Lo que esto significa es que cada trabajo se puede abstraer para que esté "más cerca" del código que lo usa. Al hacer que ambos lados de una operación dependan de abstracciones, ambos se vuelven más fáciles de entender, y ninguno de los lados tiene que albergar el conocimiento de la brecha entre ellos: ese es el trabajo de la abstracción.

Wow, eso fue abstracto.

3

Un caso interesante en el que una abstracción depende de los detalles es cuando se define una interfaz que hereda de IDisposable.Echar un vistazo a la siguiente abstracción:

public interface ICustomerRepository : IDisposable 
{ 
    Customer GetById(Guid id); 
    Customer[] GetAll(); 
} 

Nota: IDisposable es una interfaz específica para .NET, pero se puede imaginar fácilmente su interfaz que contiene un método Dispose sí mismo en vez de heredar de dicha interfaz.

Podría parecer conveniente para el ICustomerRepository para implementar IDisposable. De esta forma, cualquier persona que llama puede disponer del repositorio y de esta manera la implementación puede disponer de la conexión o unidad de trabajo que utiliza internamente.

Sin embargo, la interfaz ahora está escrita teniendo en cuenta cierta implementación, ya que no es obvio que todas las implementaciones de ICustomerRepository necesitarían limpiar cualquier recurso. Por lo tanto, la interfaz filtra detalles de implementación y, por lo tanto, infringe el Principio de inversión de dependencias.

Cuestiones relacionadas