Cómo definir claramente los límites de un contexto acotado

9

Después de un mes de leer e investigar DDD, decidí comenzar mi propio proyecto y creé DDD con estos contextos limitados>

  • Clientela
  • Productos
  • Pedidos
  • Facturación

Cada contexto acotado tiene API de descanso como capa de presentación, capa de dominio, capa persistente.

Hasta ahora todo bien, el código funciona sin problemas, pero como vengo de un mundo monolítico, todavía estoy tratando de resolver lo siguiente:

  • cuando quiero crear un nuevo cliente, emitir una nueva factura, crear un nuevo pedido, por ejemplo, quiero acceder a la lista de países. ¿Yo:

a) crear una lista de países en cada BC

b) cree un países BC -> API y úselo para obtener una lista de países disponibles

c) utilice una API de terceros y extraiga datos a través de la capa anticorrupción en cada BC

  • al integrarme con API de terceros usando una capa anticorrupción o una capa adaptadora, ¿qué datos se deben incluir en mi modelo de dominio? Por ejemplo, si quiero integrar una API de zendesk con un cliente BC. ¿Necesito solo un ticketID en mi dominio, o tengo que extraer todos los datos de Zendesk a los que quiero acceder y usar en un Client BC?

Si mi aplicación MVC realmente está obteniendo datos de las API (capas de presentación de mis contextos limitados), me resulta muy difícil definir claramente los límites de cada BC. ¿Significa que un BC correctamente diseñado serviría a un solo controlador MVC sin la necesidad de consumir API adicionales?

Dario Granich
fuente
2
Tenga en cuenta que la duplicación de datos no es una preocupación principal en DDD ...
John

Respuestas:

7

Si sus diferentes contextos limitados entienden el significado / propósito de un país de manera diferente, entonces necesita modelarlo apropiadamente diferente en cada uno. Sin embargo, si estamos hablando simplemente de datos de referencia de códigos y nombres ISO, entonces creo que es bastante justo y estándar guardarlo donde sea conveniente y hacerlo accesible a todas las partes interesadas. Por ejemplo: una base de datos, un archivo de configuración, un servicio web, etc.

También quería mirar tu modelo un poco. Las piezas que ha enumerado podrían ser "entidades" en un "contexto limitado", dependiendo de la estructura de la empresa. Los BC a menudo terminan siendo definidos alrededor de diferentes áreas / departamentos / equipos, ya que ese es con frecuencia el límite natural entre el "lenguaje ubicuo". Entonces, por ejemplo, en lugar de Ventas / Productos / Pedidos, esperaría que los BC estén en la línea de Ventas / Fabricación / Almacenamiento.

Dentro de esos BC, no te enfocas en los sustantivos. Se enfoca en los casos de uso y crea modelos de los sustantivos que pueden cumplir con los casos de uso. Los métodos en una "raíz agregada" ejecutan casos de uso y realizan los cambios apropiados en los modelos relacionados.

... todos los modelos están equivocados, pero algunos son útiles.

También tenga en cuenta que cada BC puede usar un sistema o arquitectura completamente diferente. Un BC dado puede no merecer el uso de "componentes de software DDD" en absoluto, y la mayoría de ellos probablemente no. DDD tiene menos que ver con componentes de software prescriptivos y más con el proceso de diseño de software. El punto es enfocarse en comprender los contextos limitados de la compañía, mapear los lenguajes ubicuos de cada contexto y modelar el código para ese contexto usando su lenguaje ubicuo. De esa manera, cuando interactúa con los interesados ​​y hace referencia al código, les parece que está hablando en términos comerciales que ellos entienden. Y reconociendo que la misma palabra tiene diferentes significados en diferentes AC.

Hay patrones específicos generados por DDD (por ejemplo, repositorio, capas específicas, etc.) que son medios para un fin. Pero no se garantiza que estos patrones sean los mejores patrones para cada caso, incluso dentro de DDD. Al igual que DDD no es "la" respuesta para cada proyecto. Solo tiene que hacer lo que su análisis sugiere que es lo más práctico.

Kasey Speakman
fuente
3

A partir de sus preguntas, creo que entiende mal el contexto limitado. Es posible que desee volver a leer el Capítulo 14 del libro azul .

Intentando responder en general: debe tener cuidado al compartir conceptos entre dos contextos limitados diferentes. Después de todo, parte de la razón por la que existe el límite es que el lenguaje omnipresente cambia. Asumir que los mismos datos (y la misma representación) de una entidad pueden usarse en ambos contextos es ingenuo: puede ser correcto, puede ser incorrecto, pero no hay una buena manera para aquellos de nosotros en el exterior, sin acceso a sus expertos de dominio, para juzgar.

Por ejemplo, en el dominio del cliente, "país" podría estar relacionado con la residencia o la ciudadanía. En la facturación, puede estar relacionado con los tipos de cambio de divisas. En algunos de esos dominios, es posible que deba preocuparse por las tarifas y similares.

Una segunda pregunta que debe plantear es cuál de sus modelos es el libro de registro de los datos "compartidos". En el caso de "país", ¡la respuesta correcta es probablemente que ninguno de ellos lo es! La topología geopolítica no está controlada por su modelo.

¿Qué se supone que debe suceder en sus modelos de dominio cuando un país está ocupado por una potencia extranjera?

Tenga en cuenta; muchos de nosotros estamos acostumbrados a pensar en la estructura de datos; ¿Cuál es la relación entre un dato y otro? Y eso es excelente cuando considera los informes y trata de asegurarse de que todos los datos que necesita hayan sido recopilados por su solución. Pero los modelos de dominio no son solo sobre estructura, sino sobre cambio. También debe prestar atención a esa parte y asegurarse de que comprende bien cómo los datos restringen los cambios (y cómo esas restricciones varían de un contexto acotado a otro).

VoiceOfUnreason
fuente
0

Los conceptos que menciona (Clientes, Productos, Pedidos, Facturación) generalmente se representan en un solo Modelo de dominio y, por lo tanto, en Contexto acotado. Le sugiero que esté entendiendo estos conceptos incorrectamente.

aryeh
fuente
Realmente no estoy de acuerdo con usted. por ejemplo, si tiene clientes de 1 millón que generan facturas de 5 millones, desearía dividir la facturación de la administración de clientes en diferentes BC. Desea poder escalar segmentos de su dominio en consecuencia. Además de eso, los Clientes y la Facturación no deben estar estrechamente vinculados, ya que no hay una razón real para hacerlo. A pesar del hecho de que Kasey propone Ventas / Fabricación / Almacenamiento como BC, tal vez cada uno de esos BC tenga modelos de dominio tan complejos que necesite redefinir los BC.
Dario Granich
1 millón de clientes que generan 5 millones de facturas no es típico. Las PYME pequeñas y medianas suelen tener sistemas ERP integrados. Pymes y empresas medianas a grandes y aplicaciones integradas o independientes (típicamente basadas en suites) Si sus circunstancias respaldan el desarrollo de una solución basada en 4 modelos de dominio complejos y puede manejarlo, felicitaciones.
aryeh
0

Mi opinión sobre este tema es definir el contexto acotado utilizando un mapeo de capacidad empresarial u otras técnicas similares como el análisis de la cadena de valor. Se reduce a los siguientes pasos:

  1. Defina las responsabilidades de nivel superior de su sistema o las capacidades comerciales. Creo que la mejor manera de hacerlo es conjurar los pasos que sigue su empresa para obtener un valor comercial. Los límites lógicos que se le presentan son sus servicios empresariales o, si lo desea, contextos limitados.
  2. Profundizar en cada servicio.
  3. Identifique las comunicaciones entre sus servicios junto con los dos primeros puntos.

Entonces, el enfoque inicial está en cómo opera su negocio.

Par de consejos prácticos:

  1. Si uno de sus contextos / servicios / etc. necesita algunos datos de otro contexto, lo más probable es que sus límites sean incorrectos.
  2. La forma altamente deseable de comunicación contextual está basada en eventos. Esta es una clave para la escalabilidad y la confiabilidad. Si necesita comunicación sincrónica, lo más probable es que los límites estén equivocados, nuevamente. Además de eso, la comunicación sincrónica matará su sistema.
  3. Su dominio es más consistente de lo que cree. Al igual que todos los demás. No intentes hacer que todo sea 100% consistente. No hay sentido práctico en eso.
  4. Los contextos no necesitan ser orquestados. Son independientes. Como los humanos

Con este enfoque, terminará con servicios altamente autónomos, mantenibles y confiables. Es posible que desee consultar un ejemplo de definición de límites de contexto.

Vadim Samokhin
fuente