DDD: Diferencias entre Sub-domain y Bounded Context

Recientemente me toco explicar DDD a mis compañeros y tuve una pequeña laguna mental acerca de las diferencias entre un Bounded Context y un Sub-Domain, para tener frescas estas definiciones haré un post explicativo que me permita recordar las diferencias de estos conceptos de DDD. Mi punto de entrada a DDD es el curso en Pluralsight de Steve Smith y Julie Lerman, si lo has tomado encontraras definiciones calcadas de este, son muy buenas, recomiendo encarecidamente que lo tomes si quieres ahondar mas en el tema.

¿Que es un subdominio (Subdomain)?

Un subdominio no es mas que la división de un dominio de problema en unidades de trabajo mas pequeñas, atomicas e independientes  para un fácil manejo. La preocupación de un subdominio es abarcar todo el espacio conceptual del problema.

¿Que es un contexto acotado (Bounded Context)?

Un contexto acotado es el espacio que ocupa la implementación de la solución dentro del subdominio, esta es una definición ambigua porque tanto el contexto acotado como el subdominio pueden coincidir a la perfección. Por ejemplo, cuando diseñas un sistema desde cero, es obvio que el subdominio y los limites coincidirán porque ambos fueron hechos para encajar. En cambio, cuando defines un subdominio con elementos pre existentes seguramente el contexto no encajara a la perfección con la definición del modelo.

Por ejemplo:

El equipo de desarrollo debe de realizar el modulo de ventas a publico general de la empresa. Cada venta deberá consultar con el viejo sistemas de inventarios, en caso de existir disponibilidad se registrara una orden y emitirá una factura correspondiente.

En el ejemplo anterior la principal tarea a resolver es la colocación de ordenes, en una interfaz para los clientes (que no se especifica). Se deja claro que existen elementos que no podrás controlar, modificar o adaptar para que sean fieles al modelo, seguramente se tendrá que hacer uso de algunas capas de abstracción. El espacio conceptual que va a ocupar la solución no encajara del todo bien en el problema de dominio, y esta bien, no tiene porque hacerlo.

Eric Evans define esta diferencia como:

Subdomain is a problem space concept. Bounded context is a solution espace concept.

El subdominio es un problema del espacio del concepto. El contexto acotado es una solución del espacio del concepto.

Una analogía de la vida real.

La analogía que se hace para dejar claras estas diferencias  es:

Una habitación (subdominio)  obviamente tiene limites y restricciones claras y definidas, el espacio que abarca es finito y conocido. Los mecanismos de comunicación (puertas y ventanas) también son explícitos. Supongamos  que deseamos almfombrarla, en el mejor de los casos conseguiremos una alfombra que abarque en su totalidad y encaje a la perfección con la habitación. Pero, ¿que pasaría si no se posee los materiales necesarios para alfombrar?. Entonces habría que buscar soluciones alternas, se pueden reciclar pedazos de sobrantes de otros proyectos, recortar las secciones dañadas de la alfombra anterior y reemplazarlos por nuevos, también se podrían poner muebles en esos lugares donde hay huecos. Esta implementación de la alfombra es el contexto acotado.

 

Autor imagen: Andrew Kuchling