Skip to content

MaxiCorrea/java-bounded-context

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Bounded Context | DDD Strategic Pattern Example

Pattern

Que es un Bounded Context

Un Bounded Context es un limite explicito dentro del cual un modelo de dominio tiene significado consistente. Fuera de ese limite, los mismos terminos pueden representar conceptos distintos con reglas distintas. El Bounded Context es el patron estrategico central de Domain-Driven Design: define donde un modelo aplica y donde no.

La motivacion no es organizacional ni tecnica en primera instancia. Es semantica. Cuando un equipo intenta mantener un unico modelo unificado para todo el negocio, los terminos empiezan a acumular significados ambiguos, las reglas de negocio se contaminan entre areas, y el modelo se convierte en un compromiso que no representa bien ninguna parte del dominio. El Bounded Context resuelve esto estableciendo fronteras donde cada modelo puede ser preciso y autonomo.

Por que importa a nivel de arquitectura

En sistemas no triviales, la ausencia de Bounded Contexts produce lo que Eric Evans denomina un Big Ball of Mud: un modelo monolitico donde los cambios en un area producen efectos cascada impredecibles en otras. El costo de cambio crece de forma no lineal con el tamano del modelo.

Establecer Bounded Contexts correctamente permite:

  • Autonomia de equipos: cada contexto puede evolucionar independientemente con su propio ritmo de deployment.
  • Precision del modelo: los conceptos se definen sin ambiguedad dentro de su contexto, lo que reduce bugs semanticos.
  • Bajo acoplamiento estructural: los contextos se comunican a traves de contratos explicitos, no mediante dependencias internas compartidas.

La decision de donde trazar los limites es una de las decisiones de diseno mas impactantes en un sistema. No se deriva del codigo: se deriva de la comprension del dominio, del Ubiquitous Language, y de donde ese lenguaje cambia de significado.

Este ejemplo: autorizaciones medicas

Este repositorio ilustra el patron con un dominio de autorizaciones medicas donde el concepto de "autorizacion" existe en dos contextos con significados fundamentalmente distintos.

Clinical Context

Modela la autorizacion desde la perspectiva clinica. Aqui una autorizacion (ClinicalAuthorization) se evalua contra un protocolo medico para determinar si un procedimiento esta clinicamente justificado dado un diagnostico.

clinicalcontext/
  domain/
    model/
      ClinicalAuthorization.java   -- Aggregate Root
      AuthorizationId.java         -- Value Object (identidad)
      ClinicalStatus.java          -- Value Object (PENDING, APPROVED, REJECTED)
      DiagnosisCode.java           -- Value Object
      MedicalProcedure.java        -- Value Object
    service/
      ClinicalProtocol.java        -- Domain Service (interfaz)

El lenguaje de este contexto habla de diagnosticos, procedimientos, protocolos clinicos y estados clinicos. No sabe nada de planes, montos ni cobertura.

Coverage Context

Modela la autorizacion desde la perspectiva de cobertura del seguro. Aqui una autorizacion (CoverageAuthorization) determina si el plan del miembro cubre el monto solicitado y calcula cuanto se autoriza financieramente.

coveragecontext/
  domain/
    model/
      CoverageAuthorization.java      -- Aggregate Root
      CoverageAuthorizationId.java    -- Value Object (identidad)
      MemberId.java                   -- Value Object
      Plan.java                       -- Value Object

El lenguaje de este contexto habla de miembros, planes, limites anuales y montos autorizados. No sabe nada de diagnosticos ni protocolos clinicos.

Lo que hay que observar

El termino "autorizacion" aparece en ambos contextos, pero no es el mismo concepto:

Aspecto Clinical Context Coverage Context
Pregunta que responde Es clinicamente apropiado? Esta cubierto por el plan?
Datos centrales Diagnostico, procedimiento Miembro, plan, monto
Criterio de evaluacion Protocolo clinico Limite financiero del plan
Resultado APPROVED / REJECTED Monto autorizado (puede ser $0)

Si se modelaran en una unica clase, esta clase tendria dos razones para cambiar, dos lenguajes mezclados, y reglas de negocio que no tienen relacion entre si acopladas artificialmente. El Bounded Context evita esto por diseno.

Coordinacion entre contextos

El AuthorizationOrchestrator en la capa de aplicacion coordina ambos contextos sin mezclar sus modelos. Primero evalua la autorizacion clinica; si pasa, evalua la cobertura. Cada contexto opera con sus propias reglas, su propio Aggregate Root, y su propio lenguaje.

clinicalAuthorization.evaluate(protocol);       // Clinical Context
coverageAuthorization.evaluateCoverage();        // Coverage Context

El orquestador no interpreta ni transforma los modelos internos de cada contexto. Solo invoca comportamiento y consulta resultados a traves de la interfaz publica de cada Aggregate Root. Esta es la forma correcta de integrar Bounded Contexts a nivel de aplicacion: coordinacion sin acoplamiento semantico.

Relacion con otros patrones estrategicos

El Bounded Context no opera de forma aislada en DDD. Trabaja en conjunto con:

  • Context Map: documenta las relaciones entre Bounded Contexts (Customer-Supplier, Conformist, Anti-Corruption Layer, etc.).
  • Ubiquitous Language: cada Bounded Context tiene su propio lenguaje ubicuo. El limite del contexto es el limite del lenguaje.
  • Anti-Corruption Layer: cuando dos contextos necesitan comunicarse pero sus modelos son incompatibles, un ACL traduce entre ellos protegiendo la integridad de cada modelo.

Referencias

  • Evans, E. (2003). Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley.
  • Vernon, V. (2013). Implementing Domain-Driven Design. Addison-Wesley.

Releases

No releases published

Packages

 
 
 

Contributors

Languages