Introducción a la clase
Ahora que entendemos qué es Domain-Driven Design (DDD) y su enfoque estratégico, es momento de profundizar en sus tácticas y patrones clave.
En esta clase aprenderemos sobre:
- Entidades, Agregados y Value Objects, elementos fundamentales de DDD.
- Cómo estos patrones ayudan a estructurar el dominio de una aplicación.
- Implementaciones en C# con ejemplos prácticos.
Al finalizar esta lección, tendrás el conocimiento necesario para modelar dominios ricos y bien organizados en arquitecturas como Clean Architecture, Hexagonal y Vertical Slice.
¿Qué obtendrás de esta clase?
- Comprenderás qué son las Entidades, Agregados y Value Objects.
- Aprenderás cómo modelar correctamente un dominio en C# usando estos patrones.
- Verás ejemplos prácticos aplicados a un sistema de pedidos de e-commerce.
- Entenderás cómo estos conceptos mejoran la modularidad y mantenibilidad del código.
¿Qué son las Entidades en DDD?
Las Entidades son objetos que tienen una identidad única dentro del dominio y persisten en el tiempo.
Características de una Entidad
- Tiene un identificador único (ID).
- Puede tener propiedades y comportamientos.
- Se modifica a lo largo de su ciclo de vida.
Ejemplo en C#: Creando una Entidad «Pedido»
public class Pedido
{
public int Id { get; private set; }
public string Cliente { get; private set; }
public decimal Total { get; private set; }
public Pedido(int id, string cliente, decimal total)
{
Id = id;
Cliente = cliente;
Total = total;
}
public void AplicarDescuento(decimal porcentaje)
{
Total -= Total * (porcentaje / 100);
}
}
Errores comunes al modelar Entidades
- No proteger la identidad → Debe ser inmutable y única.
- Tener lógica ajena al dominio → La entidad debe enfocarse en reglas de negocio, no en persistencia o UI.
¿Qué son los Value Objects en DDD?
Los Value Objects son objetos sin identidad, cuyo propósito es representar un concepto en el dominio.
Características de un Value Object
- No tiene un identificador único.
- Su comparación se basa en sus valores, no en su referencia en memoria.
- Son inmutables (una vez creados, no cambian).
Ejemplo en C#: Creando un Value Object «Dirección»
public class Direccion
{
public string Calle { get; }
public string Ciudad { get; }
public string CodigoPostal { get; }
public Direccion(string calle, string ciudad, string codigoPostal)
{
Calle = calle;
Ciudad = ciudad;
CodigoPostal = codigoPostal;
}
public override bool Equals(object obj)
{
if (obj is Direccion other)
{
return Calle == other.Calle && Ciudad == other.Ciudad && CodigoPostal == other.CodigoPostal;
}
return false;
}
public override int GetHashCode()
{
return HashCode.Combine(Calle, Ciudad, CodigoPostal);
}
}
Cuándo usar Value Objects en lugar de Entidades
- Cuando el objeto no necesita un ID único.
- Cuando representa un concepto inmutable (ej. dinero, coordenadas, colores, direcciones).
- Cuando se pueden comparar por sus valores en lugar de por identidad.
¿Qué son los Agregados en DDD?
Un Agregado es un conjunto de Entidades y Value Objects que forman una unidad lógica y coherente dentro del dominio.
Características de un Agregado
- Tiene una Entidad Raíz que gestiona el estado del agregado.
- Protege la consistencia de los datos dentro del agregado.
- Expone métodos para interactuar con sus elementos internos.
Ejemplo en C#: Creando un Agregado «Pedido» con Productos
public class Pedido
{
private readonly List<Producto> _productos = new List<Producto>();
public int Id { get; private set; }
public string Cliente { get; private set; }
public decimal Total => _productos.Sum(p => p.Precio);
public IReadOnlyCollection<Producto> Productos => _productos.AsReadOnly();
public Pedido(int id, string cliente)
{
Id = id;
Cliente = cliente;
}
public void AgregarProducto(Producto producto)
{
_productos.Add(producto);
}
}
public class Producto
{
public int Id { get; private set; }
public string Nombre { get; private set; }
public decimal Precio { get; private set; }
public Producto(int id, string nombre, decimal precio)
{
Id = id;
Nombre = nombre;
Precio = precio;
}
}
Errores comunes al trabajar con Agregados
- Exponer referencias directas a las entidades internas.
- Solución: Usar métodos en la entidad raíz para modificar el agregado.
- Hacer agregados demasiado grandes.
- Solución: Un agregado solo debe contener elementos estrechamente relacionados.
Comparación entre Entidades, Value Objects y Agregados
Concepto | Características principales |
---|---|
Entidad | Tiene un identificador único. Puede cambiar en el tiempo. |
Value Object | No tiene ID, se identifica por su valor. Es inmutable. |
Agregado | Grupo de Entidades y Value Objects que forman una unidad lógica. |
Cuestionario de Autoevaluación
- ¿Cuál es la diferencia principal entre una Entidad y un Value Object?
- ¿Por qué los Value Objects deben ser inmutables?
- ¿Qué es un Agregado y cuál es su propósito?
- ¿Cuáles son los errores más comunes al trabajar con Agregados?
- ¿Cómo protege un Agregado la consistencia de los datos en el dominio?
Resumen de la Clase
- Las Entidades tienen un identificador único y persisten en el tiempo.
- Los Value Objects no tienen ID, son inmutables y se identifican por su valor.
- Los Agregados agrupan Entidades y Value Objects bajo una Entidad Raíz.
- DDD nos ayuda a estructurar el dominio de manera clara y expresiva.
Próximo paso
En la siguiente clase, analizaremos cuándo usar cada arquitectura y sus beneficios en proyectos reales.