Laboratorio: Inversión de dependencias

La inversión de dependencias permite que la lógica de negocio pueda acceder a fuentes externas de datos, pero sin depender de ellas. Esto es desacoplamiento, lo que nos da la facilidad de reutilización del mismo algoritmo cuando cambien las tecnologías de las fuentes de datos.

dependency-inversion-oo

¿Cómo lo logramos? La clave es que contamos con un parameter object inteligente y que hemos creado con una herencia adecuada para que los parámetros fluyan a través de todos los objetos del algoritmo.

Instrucciones

Siga los pasos siguientes sobre el algoritmo “ValoracionesEnColones” en este repositorio: https://github.com/oscarcenteno/laboratorio.inversion-de-dependencias

Pasos

Sigamos estos pasos para aplicar la inversión de dependencias:

  1. Determine propiedades que provienen de fuentes externas.
  2. Haga que la clase y dichas propiedades sean abstractas.
  3. Ajuste las pruebas unitarias para que utilicen un parameter object sustituto.
  4. Implemente el parameter object abstracto.

1. Determine las propiedades que provienen de fuentes externas.

Determine cuáles propiedades del parameter object deben provenir de fuentes externas. Por ejemplo, busque si se requiere la fecha actual, si se necesita algún dato aleatorio, datos que provienen de una base de datos u datos que provengan de otros sistemas. Cada uno de ellos es una propiedad de lectura-escritura en el parameter object.

Este es el parameter object del algoritmo:

dip-parameter-object-original

Para este ejemplo, vamos a determinar que FechaActual es la propiedad que proviene de una fuente externa.

2. Haga que la clase y dichas propiedades sean abstractas.

Entonces, FechaActual ahora es una propiedad abstracta de solo lectura; no se puede asignar directamente:

3. Ajuste las pruebas unitarias para que utilicen un parameter object sustituto.

Para esto, utilizaremos una librería llamada NSubstitute. Esta librería nos permitirá simular una instancia del Parameter Object abstracto. Haremos referencia a dicha librería por medio de NuGet. NuGet es un repositorio de paquetes de librerías de Microsoft .NET. Cada paquete tiene una versión y la instalamos de la siguiente manera:

  1. Haciendo clic derecho en “References” del proyecto “Laboratorio.Dip.Negocio.UnitTests”, seleccione “Manage NuGet Packages”.add-nuget-1
  2. Seleccione el tab “Browse”. Para buscar paquetes en NuGet necesitamos una conexión a internet pues descargaremos las librerías de http://www.nuget.org.
  3. En el campo de texto, busquemos “NSubstitute”. add-nuget-2
  4. Seleccione la librería y presione el botón “Install”. Note que cada librería NuGet tiene múltiples versiones. Estos números de versión son indicadas por el desarrollador de la librería y este debe seguir las reglas del Semantic Versioning.

nuget-nsubstitute

Luego, usamos su namespace “NSubstitute” en las pruebas unitarias que no compilan actualmente. Observe la línea 3 “using NSubstitute” en la siguiente imagen.

Procedamos a sustituir la creación del parameter object por un llamado a dicha librería, de la manera como se observa en la siguiente imagen. Note que al ser una propiedad de solo lectura, la asignación de la fecha actual se realiza de manera especial:

Así, podemos indicar el valor de la propiedad que necesitamos, y las pruebas pueden ejecutarse con éxito.

pruebas-exitosas

4. Implemente el parameter object abstracto

Para acceder a las fuentes de datos reales, implemente el parameter object abstracto en otro componente que sí depende de tecnologías y herramientas, por ejemplo un componente DS (Data Services).

parameter-object-con-dependencias

¡Nuestro algoritmo ya puede utilizar fuentes externas de datos sin depender de ellas!

El código fuente final lo puede descargar de esta ruta en el mismo repositorio:  https://github.com/oscarcenteno/laboratorio.inversion-de-dependencias/blob/master/laboratorio.inversion-de-dependencias-finalizado.zip

Dependencias invertidas

En los programas procedimentales, nuestros algoritmos de lógica de negocio dependen de las fuentes externas, lo que dificulta las pruebas y los cambios a nuevas tecnologías.

Al aplicar esta técnica, podemos lograr que la dependencia de compilación tenga una dirección inversa a la ejecución. Por esto es que la técnica se llama “Inversión de dependencias”: la lógica de negocio no conoce de las fuentes externas en su compilación pero las utiliza al ejecutarse. Esto nos da la posibilidad de reutilizar la misma lógica de negocio al migrar tecnologías, lo cual será un ahorro grande en los costos y reduce los riesgos de la ocurrencia de defectos en dicha migración.

Con la inversión de dependencias, realizamos la visión del diseño orientado a objetos, donde logramos una máxima cobertura de pruebas unitarias de un código que accede a fuentes externas de datos, herramientas y tecnologías.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s