Evans y Fowler criticaron hace mucho tiempo el modelo de dominio anémico , ya que aparentemente va en contra de los principios orientados a objetos, etc. La comunidad DDD está claramente alineada con estas afirmaciones.
Sin embargo, en los últimos años ha habido voces en desacuerdo que afirman que no es un antipatrón en absoluto y que es un ejemplo de seguir los principios SÓLIDOS.
He estado trabajando durante muchos años usando Spring Framework. Cada proyecto en cada empresa siempre ha tenido una capa de servicio que contiene la lógica empresarial, utilizando repositorios que operan en modelos anémicos (entidades JPA). Además, la mayoría de las muestras, incluso las oficiales de los chicos de Spring, muestran esta forma de trabajar.
Mis preguntas son: ¿todavía se considera que el modelo de dominio anémico es un antipatrón? ¿Todos hemos estado haciendo cosas (con respecto a DDD) mal? ¿No crees que tener modelos Rich Domain viola los principios SOLID?
fuente
Respuestas:
ADM es un buen patrón para una solución de servicios distribuidos como microservicios. Se adapta a muchos de los casos comerciales actuales basados en la web.
Considere si tenemos un objeto Order Domain. Con un enfoque OOP, agregaríamos Order.Purchase () Order.Cancel (), etc. Funcionaría bien en una aplicación de escritorio, donde guardamos pedidos en la memoria y hacemos varias cosas en la misma instancia.
Pero si tenemos un sistema distribuido, con programas que solo tienen una cosa, es decir, acceder a una lista de pedidos y comprar cada uno por turno, u obtener una lista de pedidos y cancelarlos por turno, entonces tener ambos métodos en el mismo objeto no hace sentido. Tendríamos que tener dos dominios o contextos limitados:
y
Lo único que compartirían estos objetos sería la estructura de datos de las propiedades.
A medida que agrega más y más microservicios, termina con docenas de tipos de Orden. Ya no tiene sentido hablar de una Orden como un objeto de Dominio, a pesar de que es el mismo orden conceptual que están procesando todos estos sistemas.
Tiene mucho más sentido tener un modelo anémico, Order, que encapsula solo los datos y cambia el nombre de sus servicios en consecuencia:
Ahora podemos hablar sobre Order nuevamente y podemos agregar cualquier servicio nuevo que pensemos para procesar, sin afectar los otros servicios implementados actualmente.
Fowler y Co provienen de un entorno de sistema monolítico, en su mundo, un enfoque ADM significaría una sola aplicación con todos estos servicios separados instanciados en la memoria y el OrderDTO se pasa y muta. Esto sería mucho peor que poner los métodos en un modelo de Orden rico.
Pero en un sistema distribuido, hay muchos programas, cada uno solo requiere un único método de Pedido y lo ejecuta en múltiples pedidos, carga cada uno, ejecuta el método y luego lo descarta. Solo requiere un único Servicio y una secuencia de objetos de datos.
Rellenar un modelo rico por completo, preocuparse por los requisitos y dependencias de todos los métodos solo para llamar a uno solo y luego descartar el objeto casi de inmediato no tiene sentido.
Además, un cambio a uno solo de los métodos requeriría actualizar todos los componentes distribuidos, ya que todos dependen del Modelo Rico para su lógica.
No tengo espacio en mi (s) base (s) de código para cosas que no necesitan
fuente
SOLID y DDD son ortogonales entre sí, lo que significa que realmente van en direcciones diferentes entre sí. No debe decir que uno está acostumbrado a excluir al otro, ya que pueden y probablemente existan juntos en la misma base de código.
Los modelos de dominio anémico solo se convierten en un antipatrón una vez que su dominio problemático tiene mucho comportamiento y tiene cientos de métodos de servicio con muchas lógicas o dependencias pegadas por copia donde los métodos de capa de servicio tienen que llamar a otros métodos de capa de servicio para hacer algo.
DDD es un excelente paradigma para los microservicios debido al concepto de contexto acotado .
Tenga cuidado con la tentación de ver el código de infraestructura como parte de su dominio. El código de infraestructura es cualquier cosa que no haya escrito usted mismo o cualquier cosa que esté acoplada a un marco o biblioteca que interactúa con un sistema de terceros. Conexiones de bases de datos, correos SMTP, bibliotecas ORM, tiempos de ejecución del servidor de aplicaciones, todo eso es infraestructura y no debe incluirlo ni depender de él en su dominio si puede evitarlo.
Los principios SÓLIDOS son un conjunto de conceptos OOP de propósito general que puede usar para crear un mejor código OOP. Puede escribir una buena base de código DDD con ellos.
fuente
Un dominio rico es bueno cuando se hace bien. Una pesadilla cuando no. Un dominio anémico siempre es malo. Pero es un tipo de mal familiar y cómodo.
Si un dominio anémico es todo lo que siempre desea, elige el idioma equivocado cuando elige un idioma de propósito general. Los lenguajes de cuarta generación se especializan en torno a un uso específico. Si anémico es lo suficientemente bueno, usarlos habría hecho su vida más fácil.
Muchos frameworks se abren paso en el espacio del lenguaje hasta que ya no puede anunciar el trabajo como un trabajo de Java. Es un trabajo de Java / Spring. Lo que están haciendo, además de hacerte depender de ellos, es convertir un lenguaje de propósito general en una forma bastarda de un lenguaje de cuarta generación.
¿Es esa una mejor práctica o un anti patrón? Bueno, su jefe se preocupa principalmente por si puede contratar personas para trabajar en la base del código. Entonces, si tenemos que fingir que estamos usando un lenguaje de propósito general para contratar personas, lo haremos.
Si estás de acuerdo con eso, entonces está bien. Ciertamente no eres el único.
Pero no me digas que así es como tiene que ser. No me digas que está haciendo algo por mí más de lo que es. Sé vivir sin eso. Sé cómo sacarlo, así que solo unas pocas cosas dependen de ello. Si me estás pidiendo que me rinda y deje que se haga cargo de todo solo porque luchar es muy difícil, entonces sí, creo que es malo.
No tengo espacio en mi base de código para cosas que no necesita.
En cuanto a SOLID y los otros principios de diseño, puedo seguirlos en gran medida incluso en un dominio anémico. No seguirlos causa un tipo diferente de problema.
fuente