¿Debo poner la lógica de cálculo en una entidad o en la capa empresarial?

15

Recientemente me enfrenté a una pregunta acerca de si un cálculo simple debería colocarse en la capa Entidad, o si la Entidad debería ser pura solo por almacenar los datos sin procesar y dejar las lógicas de cálculo en la capa empresarial.

Entonces, mi pregunta es si es razonable encapsular cálculos simples en las propiedades de una clase de entidad.

Kata
fuente

Respuestas:

21

Depende del tipo de arquitectura que desee.

  • En Diseño controlado por dominio, crearía un Modelo de dominio que tendría tanto datos como funcionalidad.

Esto significaría que un Ordertiene una propiedad (o método) que devolvería el precio total del pedido en función del OrderLines. El Ordertendría también un método AddOrderItem(Product product, int amount)y Ordercomprobaría si ya existen es OrderLinepara ese producto específico.

En dicho modelo, también tendría objetos que no son entidades reales, como a Repositorypara acceder a datos o Factorypara crear entidades. Estos se llaman servicios de dominio. Una capa de aplicación es responsable de llamar a los servicios de dominio (por ejemplo, para recuperar una entidad de la base de datos) y luego ejecutará la funcionalidad en la entidad. El Application Layerdebe ser lo más delgado posible.

Este es un buen artículo sobre DDD que explica estos conceptos con más detalle.

  • También puede usar un modelo de dominio anémico . Eso significa que sus entidades consisten en propiedades get / set y no contienen comportamiento. En dicho diseño, su Business Layer contendrá el comportamiento, como calcular el Orderprecio y verificar si hay duplicados OrderLines.

Hay diferentes opiniones sobre si un modelo de dominio anémico es algo malo. Personalmente prefiero un modelo de dominio real.

Este artículo describe las diferencias entre un modelo de dominio anémico y no anémico.

Wouter de Kort
fuente
Hola Wouter, gracias por la respuesta y los enlaces. Me parece enfrentar una mentalidad equivocada de que cuando se usa el modelo de dominio Anemic, todas las lógicas comerciales (incluso las muy simples) deben colocarse en la capa empresarial. Esto parece no tener sentido en algunos casos en los que las lógicas comerciales dependen realmente del modelo en sí. Por ejemplo, una propiedad se calcula a partir de las propiedades existentes en el modelo. No pude encontrar una razón sensata para poner las lógicas empresariales que todo depende del modelo en sí mismo en la capa empresarial.
En un modelo de dominio anémico, ya que tenemos clases de negocios y clases de entidades, ¿cómo nombrar las clases correctamente para evitar ser confundidos entre ellas? ¿Sugieres usar sufijos? En caso afirmativo, ¿podría dar un ejemplo?
Kwadz
Para DDD, ¿qué pasa si la lógica de cálculo de precios es complicada? Por ejemplo, el precio se basa en la ubicación (impuestos), información del usuario (descuento de fecha de nacimiento, descuento de membresía), cupón, tarjeta de crédito (descuento especial de tarjeta de crédito), etc. ¿Cómo podemos poner esa lógica dentro de la Orderclase?
Sher10ck
1
El agregado de su pedido debe contener toda esta información necesaria para realizar el cálculo. Debido a que según su descripción, esto debería ser parte del agregado. Pero si la lógica se vuelve realmente compleja y es posible que deba cambiarla, entonces pasaría la calculadora como un objeto al constructor de la entidad y dejaría que la entidad use la calculadora internamente para establecer el precio.
burzum
Anémico ... el dominio pobre suena como si sufriera algún tipo de enfermedad. ¿No preferirías ser conducido? ¡Si!
Matt Jenkins el
1

Bueno, Entity y Business Objects son casi iguales, la mayoría de las veces. Por ejemplo, si tiene una clase de producto y desea exponer una propiedad que toma alguna propiedad existente en la clase de producto y hace algunos cálculos y luego la expone. Está bien en el término que, la lógica de crear esa propiedad permanece con la clase.

Ahora, puede surgir la pregunta, dónde encajar su clase de capa empresarial. Prefiero usar la clase de capa empresarial que tiene cierta lógica para lidiar con los problemas empresariales. Por ejemplo, en el ejemplo de su Producto, un problema comercial podría ser cobrar dinero utilizando un proveedor externo como PayPal.

Una cosa clave para recordar es que una entidad siempre tendrá una identidad, pero un objeto comercial es una entidad sin identificación. Por ejemplo, el producto es una entidad, pero el dinero no tendría una identidad. 1000 instancias diferentes de dinero serían lo mismo.


fuente
Si. Si la lógica de negocios de la propiedad depende de las propiedades existentes en el mismo modelo, sería mejor simplemente agregar la propiedad en el modelo. Esto ayudaría a perder la pareja innecesaria con la capa empresarial para las propiedades calculadas.