El Diseño impulsado por el dominio lo alienta a utilizar un modelo de dominio enriquecido. Esto significa que toda la lógica de dominio se ubica en el modelo de dominio y que el modelo de dominio es supremo. La persistencia se convierte en una preocupación externa, ya que el modelo de dominio idealmente no sabe nada de persistencia (por ejemplo, la base de datos).Escala de un modelo de dominio enriquecido
He estado usando esto en la práctica en un proyecto de tamaño mediano (> 100k líneas de Java) y estoy descubriendo muchas ventajas, principalmente la flexibilidad y la refactoribilidad que esto ofrece sobre un enfoque orientado a bases de datos . Puedo agregar y eliminar clases de dominio, presionar algunos botones y se implementa un nuevo esquema de base de datos completo y capa SQL.
Sin embargo, a menudo me enfrento a problemas que me resulta difícil conciliar la rica lógica de dominio con el hecho de que hay una base de datos SQL que respalda la aplicación. En general, esto da como resultado el típico "problema de consultas 1 + N", donde se obtienen N objetos y luego se ejecuta un método no trivial en cada objeto que de nuevo activa consultas. Optimizar esto a mano le permite hacer el proceso en un número constante de consultas SQL.
En mi diseño, permito que un sistema conecte estas versiones optimizadas. Hago esto moviendo el código a un "módulo de consulta" que contiene docenas de consultas específicas de dominio (por ejemplo, getActiveUsers), de las cuales tengo ambas implementaciones en memoria (ingenua y no escalable) y basada en SQL (para uso de implementación). Esto me permite optimizar los puntos de acceso, pero hay dos inconvenientes principales:
- estoy moviendo con eficacia algo de mi lógica de dominio a lugares donde no pertenece realmente, y de hecho incluso presionándolo en sentencias SQL .
- El proceso requiere que examine detenidamente los registros de consulta para saber dónde están los puntos de acceso, después de lo cual tengo que refactorizar el código, reduciendo su abstracción de nivel al reducirlo a consultas.
¿Existe una manera mejor y más clara de conciliar Domain-Driven-Design y su Rich Domain Model con el hecho de que no puede tener todas sus entidades en memoria y por lo tanto están confinadas a un back-end de base de datos?
Supongo que un enfoque real de mejora fundamental requeriría un paradigma de lenguaje diferente, donde se describen partes de su lógica declarativamente para que pueda compilarse automáticamente en consultas ... pero este tipo de historia tiene su propia cuota de problemas: -) –