Saltar a contenido

Introducción al Domain-Driven Design

¿Qué es un dominio?

Un "dominio" es un área amplia de conocimiento, actividad o responsabilidad. Representa un campo o esfera de influencia específico que tiene su propio conjunto de funciones, metas y experiencia.

Piense en ello como un departamento o una división importante dentro de una organización más grande. Por ejemplo, en una empresa, el dominio de "Finanzas" se encarga de todos los asuntos relacionados con el dinero, mientras que el dominio de "Marketing" es responsable de promover los productos o servicios de la empresa. Cada dominio tiene un propósito claro y un conjunto de tareas distintas.

El término "dominio" se utiliza a menudo para:

  • Categorizar y Organizar: Ayuda a desglosar un sistema u organización compleja en partes más pequeñas y manejables. Esto facilita la comprensión de cómo funcionan las diferentes áreas y cómo se relacionan entre sí.
  • Definir Responsabilidades: Delimita claramente de qué es responsable un equipo o un individuo. Por ejemplo, en una fábrica de ropa, el dominio de Producción es responsable de fabricar las prendas, mientras que el dominio de Ventas y Marketing es responsable de venderlas.
  • Facilitar la Especialización: Permite que las personas se especialicen y se conviertan en expertas en un área particular. Un profesional de las finanzas no necesita ser un experto en costura, y un diseñador de patrones no necesita ser un experto en contabilidad.
  • Estructurar Sistemas: En campos como el desarrollo de software, un "dominio" se refiere al área de negocio específica para la que se diseñó el software (por ejemplo, el "dominio de comercio electrónico" o el "dominio de la salud"). Esto ayuda a los desarrolladores a modelar el problema del mundo real que están tratando de resolver.

alt text

Patrones Estratégicos y Patrones Tácticos

Los patrones tácticos y estratégicos en el Diseño Guiado por el Dominio (DDD) son componentes esenciales que ayudan a estructurar sistemas complejos de forma eficaz. Los patrones estratégicos proporcionan una visión de alto nivel, ayudando a identificar y organizar diferentes partes del dominio en contextos delimitados, además de definir cómo estas partes interactúan entre sí. Este enfoque facilita la colaboración entre equipos y la gestión de la complejidad del sistema. Por otro lado, los patrones tácticos se centran en los detalles de la implementación dentro de cada contexto delimitado, abordando el modelado de elementos como entidades, objetos de valor, agregados y servicios. Mientras que los patrones estratégicos orientan la organización y la estructura general del sistema, los patrones tácticos garantizan que la lógica de negocio y la arquitectura del código estén alineadas con las necesidades específicas del dominio, permitiendo una construcción más robusta y adaptable.

EstratégicoTácticoContexto DelimitadoModelo de DominioSubdominiosMapa de ContextosCapa AnticorrupciónEntidadObjeto de ValorAgregadoRepositorioServicioFábricaEvento de Dominio

Patrones Estratégicos

  1. Contexto Delimitado (Bounded Context):

    • Un contexto delimitado es una parte específica del dominio donde se aplica un modelo particular. Este patrón ayuda a dividir un sistema complejo en partes manejables, cada una con su propio lenguaje y reglas. La interacción entre diferentes contextos delimitados debe estar claramente definida, evitando confusiones y conflictos de modelo.
  2. Modelo de Dominio (Domain Model):

    • El modelo de dominio representa la estructura y la lógica de negocio del sistema. Captura las reglas y conceptos fundamentales del dominio, permitiendo que los equipos comprendan y trabajen con los aspectos más importantes del negocio. Un modelo de dominio bien diseñado es esencial para la eficacia del DDD.
  3. Mapa de Contextos (Context Mapping):

    • Este patrón se ocupa de la interacción entre diferentes contextos delimitados. El mapeo de contextos ayuda a documentar y entender cómo se comunican los contextos, identificando las relaciones y dependencias entre ellos. Esto es crucial para garantizar que la integración entre las diferentes partes del sistema se realice de manera eficiente y sin problemas.
  4. Capa Anticorrupción (Anti-Corruption Layer):

    • El patrón de capa anticorrupción se utiliza para proteger un contexto delimitado de influencias externas que puedan corromper su modelo. Sirve como una capa intermedia que transforma las comunicaciones y los datos de sistemas externos, garantizando que las reglas y la integridad del modelo de dominio no se vean comprometidas.
  5. Subdominios (Subdomains):

    • Los subdominios son partes del dominio principal que pueden abordarse de forma independiente. Ayudan a identificar áreas específicas de enfoque dentro del sistema, permitiendo que los equipos se concentren en resolver problemas específicos. Los subdominios pueden clasificarse como núcleo (Core Domain), de soporte (Supporting Subdomain) o genérico (Generic Subdomain), dependiendo de su importancia y complejidad dentro del sistema.

    alt text

  6. Diseño del Sistema (System Design):

    • Este patrón implica la definición de la arquitectura y la estructura del sistema, incluyendo la elección de tecnologías, frameworks y patrones de comunicación. Un buen diseño del sistema tiene en cuenta los contextos delimitados y la integración entre ellos, garantizando que el sistema sea escalable, mantenible y alineado con los objetivos del negocio.

alt text

Patrones Tácticos

  1. Entidad (Entity):

    • Las entidades son objetos que poseen una identidad única y representan conceptos del dominio que cambian con el tiempo. Se definen por su identidad, no solo por sus atributos, y son responsables de mantener su propio estado y comportamiento, como un usuario o un producto.
  2. Objeto de Valor (Value Object):

    • Los objetos de valor son objetos que no poseen identidad propia y se definen únicamente por sus atributos. Son inmutables y pueden intercambiarse entre instancias sin afectar la lógica del dominio. Ejemplos incluyen una dirección o una fecha. El uso de objetos de valor ayuda a encapsular conceptos que no necesitan una identidad única.
  3. Agregado (Aggregate):

    • Un agregado es un grupo de entidades y objetos de valor que se tratan como una unidad única para fines de consistencia de datos. Cada agregado tiene una raíz (aggregate root) que controla el acceso a sus miembros internos, garantizando que se sigan las reglas de negocio. Esto ayuda a mantener la integridad de los datos y a simplificar las operaciones.
  4. Repositorio (Repository):

    • Un repositorio es una abstracción que proporciona una interfaz para acceder y manipular agregados y entidades. Oculta los detalles de la persistencia de datos, permitiendo que los desarrolladores se concentren en la lógica de negocio. Los repositorios facilitan operaciones como agregar, buscar y eliminar entidades, proporcionando una forma organizada de interactuar con la capa de datos.
  5. Servicio (Service):

    • Los servicios se utilizan para encapsular la lógica de negocio que no encaja naturalmente en una entidad u objeto de valor. Pueden realizar operaciones complejas que involucran múltiples entidades o agregados, como cálculos o manipulaciones de datos. Los servicios ayudan a mantener la lógica de negocio organizada y aislada, promoviendo la reutilización y la capacidad de prueba.
  6. Fábrica (Factory):

    • Las fábricas son responsables de la creación de entidades y agregados, especialmente cuando la creación implica una lógica compleja o múltiples pasos. Abstraen el proceso de construcción, garantizando que los objetos se creen en un estado válido y consistente. El uso de fábricas ayuda a simplificar la creación de objetos y a centralizar la lógica de construcción.
  7. Evento de Dominio (Domain Event):

    • Los eventos de dominio representan algo que ha ocurrido en el sistema y que puede tener un impacto en otras partes de la aplicación. Se utilizan para comunicar cambios de estado y pueden ser disparados desde entidades o servicios. El uso de eventos de dominio ayuda a mantener un sistema reactivo y a desacoplar componentes, permitiendo que diferentes partes del sistema reaccionen a los cambios de manera eficiente.

alt text