De Bueno a Excelente en DDD: Entendiendo los Entities y Value Objects en Domain-Driven Design - 2/10

Un Análisis Profundo de Conceptos Esenciales de DDD para Crear Modelos de Dominio Claros y Robustos Usando Entities y Value Objects

¿Por qué son importantes los Entities y Value Objects?

Consideremos una historia: una empresa de redes sociales en crecimiento, InstaKran, decide crear una aplicación similar a Instagram, enfocada en publicaciones e interacciones de usuarios. Desean que los usuarios compartan fotos, interactúen con publicaciones y se sigan entre sí, brindando una experiencia limpia e intuitiva. Los desarrolladores de InstaKran enfrentan una pregunta crítica: ¿Cómo deberían modelar las funciones principales de la aplicación, como publicaciones y perfiles de usuario, para construir un sistema que sea a la vez robusto y flexible?

Antes de codificar, deben identificar qué elementos de datos requieren una identidad única, como los perfiles de usuario, y cuáles no, como el contenido de una publicación o los atributos de una ubicación. Por ejemplo, cada ‘User’ debe seguir siendo identificable de forma única en el sistema, incluso si cambia su nombre de usuario, lo que lo convierte en un candidato claro para ser una Entity. En cambio, un objeto de ‘Location’ en una publicación puede ser intercambiable, definido por atributos como latitud y longitud, por lo que es más adecuado como un Value Object, ya que no requiere una identidad única.

Definiendo entities y value objects, los desarrolladores de InstaKran pueden mapear su dominio de manera efectiva, facilitando la comprensión, el mantenimiento y la evolución de la funcionalidad de la aplicación. Estos bloques de construcción ayudan a organizar los modelos de dominio y aseguran la calidad del código, proporcionando una base donde el papel de cada modelo es claro y mantenible.

¿Qué es una Entity?

Los Entities son objetos definidos por sus identidades únicas en lugar de por sus atributos. En la aplicación de InstaKran, cada ‘User’ y ‘Post’ sería una entity, ya que representan instancias únicas con características específicas que pueden cambiar a lo largo del tiempo.

Características de las Entities

Las entities mantienen continuidad en el tiempo; el perfil de un usuario podría actualizarse, pero el perfil en sí mismo sigue siendo identificable de manera única por su ID. Esta continuidad es crucial para los datos de usuario que abarcan múltiples interacciones. Las entities también tienen ciclos de vida distintos, a menudo ligados a reglas de negocio y flujos de trabajo, lo que permite a los desarrolladores rastrear el estado de una entity particular a medida que cambia con el tiempo.

Ejemplo de Entities

En InstaKran:

  • User: El entity ‘User’ es identificable por un ID único, que distingue el perfil y las actividades de cada usuario sin importar los cambios en la información del perfil. Es un buen candidato para entity, ya que cada usuario tiene una identidad única, permitiendo interacciones como “seguir” asociadas a perfiles específicos.
  • Post: Cada ‘Post’ entity se define por su ID único, representando contribuciones individuales que los usuarios pueden interactuar, como comentar y dar “me gusta”. El contenido de una publicación puede evolucionar con ediciones, pero su identidad permanece intacta, de modo que las interacciones previas con esa publicación aún se pueden rastrear.

Entities como ‘User’ y ‘Post’ aseguran que cada elemento distinto sea consistentemente identificable en toda la aplicación.

¿Qué es un Value Object?

A diferencia de las entities, los Value Objects se definen únicamente por sus atributos y no tienen una identidad única. Los value objects se usan a menudo para elementos donde solo importa el contenido de los datos, no su instancia específica. También suelen ser inmutables, es decir, una vez creados, sus atributos no pueden cambiarse.

Características de los Value Objects

Los value objects son útiles para simplificar la lógica del dominio, ya que se pueden reutilizar o descartar según sea necesario. Su igualdad se basa en los atributos; dos value objects con los mismos valores de atributos se consideran idénticos. Esta inmutabilidad agrega consistencia al modelo de dominio, haciendo que el código sea más confiable y menos propenso a errores.

Ejemplo de Value Objects

En InstaKran:

  • Location: Cada ubicación (par de latitud y longitud) puede representarse como un value object dentro de las publicaciones. Dado que no es necesario identificar la ubicación en sí, las ubicaciones con coordenadas idénticas se consideran equivalentes.
  • Profile Picture: Si InstaKran permite a los usuarios actualizar sus fotos de perfil, cada imagen puede representarse como un value object. Los datos de la imagen o la URL son lo significativo, ya que solo son relevantes cuando están asociados con un usuario.

Al usar value objects para atributos como ‘Location’ y ‘Profile Picture’, InstaKran puede simplificar el modelo y eliminar la gestión de identidad innecesaria.

Diferencias Clave entre Entities y Value Objects

Identidad vs. Igualdad basada en Atributos

Las entities y value objects cumplen diferentes funciones según cómo se identifican. Las entities tienen identidades únicas que permiten ser rastreadas y referenciadas como instancias específicas dentro del sistema, haciéndolas ideales para elementos centrales como usuarios y publicaciones. En cambio, los value objects son intercambiables si sus atributos coinciden, lo que significa que pueden compararse y reemplazarse basándose puramente en la igualdad de datos.

Mutabilidad vs. Inmutabilidad

Las entities suelen ser mutables porque sus atributos pueden cambiar con el tiempo sin afectar su identidad única. Un usuario puede actualizar los detalles de su perfil, pero sigue siendo la misma entity. Por otro lado, los value objects suelen ser inmutables para mantener la consistencia. Por ejemplo, una vez que se crea una ubicación, sus coordenadas permanecen iguales.

Gestión del Ciclo de Vida

Las entities generalmente tienen ciclos de vida distintos vinculados a procesos específicos del dominio. Por ejemplo, un usuario puede registrarse, interactuar con publicaciones y eventualmente eliminar su cuenta, mientras que el ciclo de vida de la entity ‘User’ refleja estas acciones. Los value objects se crean, usan y descartan según sea necesario, sin rastrear un ciclo de vida inherente, lo cual mantiene el modelo de dominio ligero y enfocado en identidades esenciales.

Beneficios de un Uso Apropiado de Entities y Value Objects

Mejora de la Calidad y Mantenibilidad del Código

Cuando se usan adecuadamente entities y value objects, el código se vuelve más limpio y fácil de mantener. Al diferenciar entre elementos que requieren identidad única y los que no, los desarrolladores pueden evitar complejidades innecesarias, reducir la probabilidad de errores y mejorar la previsibilidad del modelo de dominio.

Mayor Claridad en el Dominio

La diferenciación clara entre entities y value objects proporciona un modelo más nítido que refleja con precisión los procesos empresariales. Esta claridad permite a los desarrolladores comunicarse efectivamente con las partes interesadas del negocio, ya que ambas partes pueden comprender y navegar el modelo con facilidad. Usar entities para conceptos centrales como ‘User’ y ‘Post’ mientras se reservan los value objects para atributos intercambiables fomenta esta comprensión compartida.

Reducción de la Complejidad en la Lógica de Dominio

Los value objects simplifican la lógica de dominio al eliminar la gestión de identidad para elementos que no la requieren. Por ejemplo, InstaKran puede manejar ubicaciones como atributos simples sin asignar IDs o rastrear cambios, enfocándose en la gestión de identidad en usuarios y publicaciones. Este enfoque aligera el modelo de dominio y hace que el código sea más sencillo y escalable.

Conclusión

Dominar entities y value objects es crucial en Domain-Driven Design para crear modelos de dominio claros y mantenibles. Las entities capturan los elementos centrales y únicos del dominio que evolucionan, mientras que los value objects añaden simplicidad al representar atributos intercambiables sin identidad. Juntos, aportan claridad, alineando el código con las necesidades empresariales y haciéndolo resiliente al cambio. Al adoptar estos bloques de construcción, los desarrolladores pueden crear software que refleja eficazmente la complejidad del negocio y respalda soluciones escalables y de alta calidad.

Estos son los siguientes temas que discutiremos en esta serie De bueno a excelente en DDD. Espero que naveguemos juntos por esta importante arquitectura:

  • Eleva la calidad del código con Domain-Driven Design - 1 / 10
  • Comprender los Entities y los Value Objects en Domain-Driven Design - 2 / 10
  • Comprender los Aggregates y Aggregates Roots en Domain-Driven Design - 3 / 10
  • Comprender los patrones de repositorios en Domain-Driven Design - 4 / 10
  • Comprender los patrones de Domain-Services en Domain-Driven Design - 5 / 10
  • Comprensión de los patrones de Application-Services en Domain-Driven Design - 6 / 10
  • Comprender el patrón de arquitectura sugerida en Domain-Driven Design - 7 / 10
  • Comprender Bounded Contexts en Domain-Driven Design - 8 / 10
  • Event-Storming la estrategia de modelado para crear Domain-Driven Design - 9 / 10
  • Errores comunes y antipatrones en Domain-Driven Design - 10 / 10

Calebe Santos

November 29, 2024