Gracias Cognos.

Es difícil expresarlo.

Hoy fue mi último día de trabajo en Cognos. Estoy agradecido por la toda la confianza depositada en estos 18 meses, una experiencia más, nuevos amigos. Agradecido con todos.

A mis amigos y compañeros de equipo.

Gracias por su paciencia, por todos los momentos que compartimos juntos; recuerdos que estarán presente para siempre, el compañerismos y carisma es difícil olvidar.

Esto no es una despedida, nos estaremos viendo y estaré ahí para cuando necesiten conversar y hablar, ya sea de trabajo o algún tema en particular.

Un abrazo a todos.

Adios.

Aggregate y Aggregate Roots – DDD

Saludos mis amigos.

Uno de los conceptos más utilizados dentro de la arquitectura DDD son los Agregados. He buscado documentación sobre   estos conceptos y encontré un artículo muy bueno que describe de manera sencilla y con ejemplos que son estos elementos.

Domain Driven Design
Domain Driven Design

En el dominio de un sistema hay cosas que inevitablemente deben ir juntas de la mano. Un Aggregate es precisamente ese conjunto de cosas. Un Aggregate Root es una Entidad (de las que ya hemos hablado) que mantiene unido y coherente dicho conjunto.

Un sencillo ejemplo

En un sistema de ventas, un Cliente puede tener una referencia a los Pedidos de ese cliente y un pedido debe tener referencia a las Líneas del Pedido (ítem, cantidad, precio del ítem, etc).

Se puede observar que un Pedido no tiene sentido sin un Cliente que haya realizado ese Pedido, y una Línea de Pedido no tiene sentido sin el Pedido. Son conceptos que van de la mano y por tanto se puede deducir que Cliente y Pedido es un aggregate y que Pedido y LineaDePedido es otro aggregate.

Ahora debemos deducir cual seria el aggregate root. Para esto, solo tenemos que mirar cual es la Entidad principal que actuaría de «punto de entrada», o la entidad desde la cual «tiramos del hilo» para realizar las operaciones.

En este ejemplo está claro que la raíz de uno de los agregados es Cliente y la raíz del otro es Pedido. También se puede observar que, aunque Pedido actúa como root de LineaDePedidos, al ser éste un hijo de Cliente, no se considerará aggregate root principal para los repositorios del dominio.

¿Y todo esto para que?

La característica principal de un aggregate root es que actúa como un ente único que controla el acceso a sus hijos. Gracias a esto se mantiene la coherencia del conjunto. Básicamente provee un patrón para mantener la lógica de dónde pertenece realmente un ítem.

Es la entidad raíz la que expone las acciones a realizar para con sus hijos. Es el Cliente el que expone una acción para realizar un nuevo Pedido (Cliente.RealizarNuevoPedido) o para cancelarlo (Cliente.CancelaPedido). Esto nos permite encapsular las reglas y restricciones del dominio.

Si una restricción nos dice que un Cliente sólo puede tener 3 Pedidos abierto a la vez, es responsabilidad del Cliente (en la acción Cliente.RealizarNuevoPedido) el contar cuántos Pedidos tengo abiertos; si no llego al máximo debo realizar el nuevo pedido, y si no puedo realizar más pedidos debo notificarlo de alguna manera y no realizar el nuevo pedido.

Se aplica un caso parecido con respecto a Pedidos y LineasDePedido.

Otra característica que deben cumplir los aggregate root es que son las únicas entidades que retornan los repositorios. Nunca se debería poder obtener de la capa de persistencia un Pedido directamente. Debo obtener el Cliente y «tirar del hilo» para llegar al Pedido, o seguir «tirando del hilo» para llegar a una Línea de Pedido. Hay que «navegar» a través de las entidades raíces.

No dejéis que os engañe un experto del dominio que diga, por poner un ejemplo chorra, que hay que listar todos los Pedidos abiertos en el sistema independientemente del Cliente para que un operador les de el visto bueno o los marque como erróneos. Dado que es probable que por otro lado se necesite bloquear a un Cliente la capacidad de realizar un nuevo Pedido (debido a problemas con un cobro, una tarjeta de crédito bloqueada o cualquier otra cosa), una forma correcta de enfrentar esto sería recuperar del repositorio todos los Clientes que tengan algún Pedido abierto y mostrar esos Pedidos por pantalla. Cuando el operador los marcase como correctos, deberíamos utilizar una acción expuesta por el Cliente (Cliente.AceptarPedido) que aplicara las reglas y restricciones para con los Pedidos según el estado actual de ese Cliente.

En resumen

Los aggregates proveen un agrupamiento lógico de Entidades y Objetos-Valor. El aggregate root actúa de punto de entrada para ese conjunto, encargándose de las normas y restricciones que deban cumplir las colecciones de hijos.

Fuente: Articulo Original Agregados

Espero sea de utilidad.

Saludos.