0

Arquitectura de Software con C# 03: Introducción a Domain-Driven Design (DDD) (Conceptos clave)

Introducción a la clase

Domain-Driven Design (DDD) es un enfoque de diseño de software que pone el foco en el dominio del negocio y en la modelación de sus conceptos de manera clara y estructurada. En esta clase, exploraremos qué es DDD, por qué es importante y cómo puede mejorar la organización del código en arquitecturas como Clean Architecture, Hexagonal y Vertical Slice.

Al finalizar esta clase, tendrás una comprensión clara de cómo DDD estructura un proyecto basado en el dominio y sus reglas de negocio.

¿Qué obtendrás de esta clase?

  • Entenderás qué es Domain-Driven Design (DDD) y su propósito.
  • Aprenderás los conceptos clave de DDD y su aplicación en C#.
  • Identificarás las ventajas de usar DDD en arquitecturas modernas.
  • Conocerás la diferencia entre DDD Estratégico y Táctico.

¿Qué es Domain-Driven Design (DDD)?

Domain-Driven Design (DDD) es un enfoque de diseño de software propuesto por Eric Evans en su libro Domain-Driven Design: Tackling Complexity in the Heart of Software (2003).

DDD se centra en modelar el dominio de negocio de manera que el código refleje fielmente la realidad del negocio. Para lograr esto, DDD establece principios y patrones que permiten estructurar mejor el código y facilitar su mantenimiento.

Principales características de DDD

  • Enfoque en el dominio: Se modela el negocio de manera clara y expresiva.
  • Lenguaje Ubicuo: Permite que desarrolladores, analistas y expertos del negocio hablen el mismo idioma.
  • Modularidad: Facilita la separación de componentes del sistema.
  • Desacoplamiento: Reduce dependencias innecesarias entre diferentes partes del código.

DDD Estratégico vs. DDD Táctico

DDD se divide en dos enfoques principales:

DDD Estratégico (visión global del dominio)

Define cómo dividir el dominio en subdominios y cómo interactúan entre ellos.

  • Bounded Contexts: Separación de distintos contextos del negocio.
  • Context Maps: Define cómo se comunican los Bounded Contexts.
  • Ubiquitous Language: Un lenguaje común entre desarrolladores y expertos de negocio.

DDD Táctico (implementación del dominio en código)

Se enfoca en la aplicación de patrones dentro de cada Bounded Context.

  • Entidades (Entities)
  • Objetos de Valor (Value Objects)
  • Agregados (Aggregates)
  • Repositorios (Repositories)
  • Servicios de Dominio (Domain Services)
  • Eventos de Dominio (Domain Events)

Ejemplo práctico: Modelando un dominio en C# con DDD

Supongamos que estamos construyendo un sistema de pedidos para un e-commerce.

Definiendo una Entidad (Pedido) en DDD

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);
    }
}

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;
    }
}

Definiendo un Agregado (Pedido con una lista de 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);
    }
}

Implementando un Repositorio en DDD

public interface IPedidoRepository
{
    void Guardar(Pedido pedido);
    Pedido ObtenerPorId(int id);
}

Beneficios de aplicar DDD en C#

  • Código más organizado y expresivo.
  • Menor dependencia de frameworks externos.
  • Facilita la comunicación entre desarrolladores y el negocio.
  • Permite estructurar proyectos grandes y complejos de manera eficiente.

Cuestionario de Autoevaluación

  1. ¿Qué es Domain-Driven Design (DDD) y cuál es su propósito principal?
  2. ¿Cuál es la diferencia entre DDD Estratégico y DDD Táctico?
  3. ¿Por qué el Bounded Context es importante en DDD?
  4. ¿Cómo se diferencia una Entidad de un Value Object en DDD?
  5. ¿Por qué los Repositorios son esenciales en una arquitectura basada en DDD?

Resumen de la Clase

  • DDD se enfoca en modelar el dominio del negocio de forma clara y expresiva.
  • DDD Estratégico define la visión global del dominio (Bounded Contexts, Context Maps).
  • DDD Táctico define patrones específicos en el código (Entidades, Value Objects, Agregados).
  • DDD mejora la modularidad, mantenibilidad y expresividad del software.
  • Se recomienda usar DDD cuando se trabaja con dominios de negocio complejos y equipos grandes.

Próximo paso

En la siguiente clase, exploraremos las tácticas y patrones de DDD en más detalle, incluyendo Entidades, Agregados y Value Objects con implementaciones en C#.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *