Evans presenta en su libro "Diseño controlado por dominio" en el Capítulo 6 "Agregados" el concepto de Agregados. Además define las reglas para traducir ese concepto en una implementación (Evans 2009, pp. 128-129):
La ENTIDAD raíz puede entregar referencias a las ENTIDADES internas a otros objetos, pero esos objetos pueden usarlas solo de manera transitoria y es posible que no se aferren a la referencia.
Después de elaborar otras reglas, las resume en este párrafo:
Agrupe las entidades y los objetos de valor en agregados y defina límites alrededor de cada uno. Elija una entidad para que sea la raíz de cada agregado y controle todo el acceso a los objetos dentro del límite a través de la raíz. Permita que los objetos externos contengan referencias solo a la raíz. Las referencias transitorias a miembros internos pueden pasarse para su uso dentro de una sola operación solamente. Debido a que la raíz controla el acceso, los cambios en las partes internas no pueden dejarlo ciego. Esta disposición hace que sea práctico hacer cumplir todos los invariantes para los objetos en el Agregado y para el Agregado en su conjunto en cualquier cambio de estado.
Entonces, ¿qué significa exactamente el uso transitorio?
Mi colega entiende que solo la raíz agregada expone una interfaz pública para los clientes. Los clientes no tendrán la oportunidad de llamar a ninguna operación en una entidad que no sea la raíz agregada.
Mi comprensión de las oraciones citadas es diferente. Entiendo que, de hecho, permite explícitamente a los clientes llamar a operaciones en entidades internas. Sin embargo, solo después de obtenerlos desde la raíz.
Entonces, tengamos un ejemplo concreto:
Digamos que un Cartconsiste en muchos Items. Cada uno Itemtiene un Quantity. El modelo debe admitir el caso de uso "Aumentar la cantidad de un artículo específico". No se pueden violar invariantes que afecten cualquier cosa fuera del artículo.
¿Está violando un modelo las reglas citadas anteriormente, cuando un cliente puede hacer esto llamando cart.item(itemId).increaseQuantity()o si un cliente solo puede llamar cart.increaseItemQuantity(itemId)? ¿Cuál sería el beneficio de este último?
cart.increaseItemQuantity(itemId), si no por otra razón, es una violación menor de la Ley de Demeter. Llamar le cart.increaseItemQuantity(itemId)permite hacer cosas como actualizar las cantidades totales del carrito.