DDD Objetos de valor como atributos de clase.

En un poco de contexto, Domain Driven Design (DDD) es una forma de desarrollar software en capas, dando prioridad a la lo lógica del negocio (o dominio), unificando el lenguaje de expertise de negocio con el lenguaje técnico en algo conocido como Ubiquitous Language y utilizando los principios SOLID como el medio para lograr el producto final.


Dentro de la metodología de DDD los términos relacionados con los objetos más básicos del sistema son las entidades y los objetos de valor. Ambos conceptos hacen referencia a una clase representativa de nuestro proyecto, regularmente un sustantivo en un caso de uso, por ejemplo, un usuario, una orden de compra, un artículo de inventario, etc.


La diferencia entre las entidades y los objetos de valor es que estos últimos tienden a ser inmutables y mientras que una entidad es un recurso que puede cambiar de estado, ser persistido y/o posteriormente eliminado.


Mientras estudiaba DDD me encontré con una implementación en la que los atributos de las clases pasaban de ser un tipo primitivo (por ejemplo, string o int) a un objeto de valor.


Para ejemplificarlo en detalle, supongamos que tenemos una clase Usuario que tiene los atributos nombre y edad:




Clase con objetos de valor como atributos


Primero que nada, se tenía una clase para representar el tipo de dato string:




Posteriormente se tenía una clase para representar el atributo name del objeto Usuario:




Lo mismo sucedía para la edad, inicialmente una clase para representar el tipo de dato int:




Después de una representación del tipo int, continúa una clase para representar el atributo edad del Usuario:




Finalmente se tenía la clase Usuario queda de la siguiente manera:




Mi primera reacción fue un notable WFT?

via GIPHY

Después de detenerme a analizar el porqué de todo esto, entendí lo siguiente:


Delegar reglas de dominio a los objetos de valor


Primero que nada, al crear una clase para cada atributo, podemos delegar la validación a éstas clases, por ejemplo, en el caso del nombre, nunca aceptaríamos un string vacío, por lo que extenderíamos esa funcionalidad de la siguiente manera:




En dónde, si el valor no es vacío en3 0 199 0 0 0

 

12 Sistema de caché para optimizar web PHP 2020-09-03 19:27:26 2020-09-03 19:29:50 Posted 0 0 automático arroja una excepción, lo mismo aplica para las validaciones de la clase EdadUsuario, en dónde la edad no puede ser menor a 0, quedando: