0

Arquitectura de Software con C# 04: Diferencias entre Clean Architecture, Hexagonal y Vertical Slice

Introducción a la clase

Existen diferentes enfoques para estructurar una aplicación de manera escalable y mantenible. Clean Architecture, Hexagonal Architecture y Vertical Slice Architecture son tres de las arquitecturas más utilizadas en la industria.

En esta clase, exploraremos las diferencias clave entre ellas, analizando cómo organizan el código, sus ventajas, desventajas y en qué contextos se recomienda su uso.

¿Qué obtendrás de esta clase?

  • Comprenderás las diferencias fundamentales entre Clean Architecture, Hexagonal Architecture y Vertical Slice Architecture.
  • Aprenderás cómo cada arquitectura organiza el código y cuándo aplicarla.
  • Conocerás ventajas y desventajas de cada enfoque.
  • Entenderás qué arquitectura elegir según el tipo de proyecto.

¿Qué es Clean Architecture?

La Clean Architecture, propuesta por Robert C. Martin (Uncle Bob), se basa en la separación de capas concéntricas, con la lógica de negocio en el centro. Su objetivo principal es hacer que la aplicación sea independiente de frameworks y tecnologías externas.

Estructura de Clean Architecture

Se divide en cuatro capas principales:

  1. Entidad (Dominio): Contiene las reglas de negocio puras (Entidades, Value Objects, Agregados).
  2. Casos de uso (Aplicación): Implementa la lógica de negocio (Servicios y Casos de Uso).
  3. Interfaces (Adaptadores): Define interfaces de repositorios, controladores, etc.
  4. Infraestructura: Implementa la persistencia, frameworks y otras tecnologías externas.

Ejemplo en C# con Clean Architecture

// Capa de Dominio
public class Pedido
{
    public int Id { get; private set; }
    public string Cliente { get; private set; }

    public Pedido(int id, string cliente)
    {
        Id = id;
        Cliente = cliente;
    }
}

// Capa de Aplicación (Casos de Uso)
public interface IPedidoRepository
{
    void Guardar(Pedido pedido);
}

public class CrearPedidoUseCase
{
    private readonly IPedidoRepository _repository;

    public CrearPedidoUseCase(IPedidoRepository repository)
    {
        _repository = repository;
    }

    public void Ejecutar(Pedido pedido)
    {
        _repository.Guardar(pedido);
    }
}

// Capa de Infraestructura (Implementación del repositorio)
public class PedidoRepository : IPedidoRepository
{
    public void Guardar(Pedido pedido)
    {
        Console.WriteLine("Pedido guardado en la base de datos.");
    }
}

Ventajas de Clean Architecture

  • Alta separación de responsabilidades.
  • Código modular y reutilizable.
  • Independiente de frameworks externos.

Desventajas

  • Mayor esfuerzo inicial para implementar.
  • Puede ser demasiado complejo para proyectos pequeños.

¿Qué es la Arquitectura Hexagonal?

La Arquitectura Hexagonal (Ports & Adapters) fue propuesta por Alistair Cockburn y se basa en la idea de que el dominio de negocio debe estar aislado de la infraestructura.

Características clave de la Arquitectura Hexagonal

  • Define «puertos» (interfaces) y «adaptadores» (implementaciones concretas).
  • Desacopla la lógica de negocio de la infraestructura.
  • Permite cambiar la infraestructura sin modificar el negocio.

Ejemplo de Arquitectura Hexagonal en C#

// Puerto (Interface)
public interface IPedidoRepositorio
{
    void Guardar(Pedido pedido);
}

// Adaptador (Implementación del repositorio)
public class PedidoRepositorioSQL : IPedidoRepositorio
{
    public void Guardar(Pedido pedido)
    {
        Console.WriteLine("Guardando pedido en SQL.");
    }
}

// Dominio
public class PedidoService
{
    private readonly IPedidoRepositorio _repositorio;

    public PedidoService(IPedidoRepositorio repositorio)
    {
        _repositorio = repositorio;
    }

    public void ProcesarPedido(Pedido pedido)
    {
        _repositorio.Guardar(pedido);
    }
}

Ventajas de la Arquitectura Hexagonal

  • Código altamente desacoplado.
  • Fácil de cambiar bases de datos y tecnologías externas.
  • Facilita las pruebas unitarias.

Desventajas

  • Mayor cantidad de abstracciones, lo que puede hacer que el código sea más difícil de seguir.
  • Requiere más esfuerzo para diseñar los puertos y adaptadores correctamente.

¿Qué es Vertical Slice Architecture?

La Vertical Slice Architecture organiza el código por características o funcionalidades, en lugar de seguir una estructura en capas. Se usa comúnmente con MediatR y CQRS para gestionar la separación de comandos y consultas.

Características clave de Vertical Slice Architecture

  • Cada funcionalidad tiene su propio conjunto de clases.
  • No hay capas generales, sino divisiones por feature.
  • Facilita la implementación de CQRS y MediatR.

Ejemplo en C# con MediatR

// Query para obtener un pedido
public class ObtenerPedidoQuery : IRequest<Pedido>
{
    public int Id { get; set; }
}

// Handler para manejar la consulta
public class ObtenerPedidoHandler : IRequestHandler<ObtenerPedidoQuery, Pedido>
{
    private readonly IPedidoRepository _repository;

    public ObtenerPedidoHandler(IPedidoRepository repository)
    {
        _repository = repository;
    }

    public Task<Pedido> Handle(ObtenerPedidoQuery request, CancellationToken cancellationToken)
    {
        return Task.FromResult(_repository.ObtenerPorId(request.Id));
    }
}

Ventajas de Vertical Slice Architecture

  • Reduce código innecesario y facilita la organización.
  • Facilita la separación de funcionalidades independientes.
  • Es ideal para sistemas con CQRS y MediatR.

Desventajas

  • No sigue una separación tradicional en capas, lo que puede ser confuso al principio.
  • Puede volverse difícil de mantener si no se gestiona bien la separación de features.

Comparación entre Clean, Hexagonal y Vertical Slice

CaracterísticaClean ArchitectureHexagonal ArchitectureVertical Slice Architecture
EnfoqueCapas concéntricas con dominio en el centroDesacople entre negocio e infraestructuraOrganización por features
ModularidadAltaAltaAlta
EscalabilidadAltaAltaMedia
Facilidad de implementaciónComplejaComplejaMás sencilla
FlexibilidadAltaMuy AltaMedia
Ideal paraAplicaciones con lógica de negocio fuerteAplicaciones con múltiples tecnologíasAplicaciones con pocas dependencias

Cuestionario de Autoevaluación

  1. ¿Cuál es la diferencia clave entre Clean Architecture y Hexagonal Architecture?
  2. ¿Cuándo deberías elegir Vertical Slice Architecture en lugar de Clean Architecture?
  3. ¿Cuál de las tres arquitecturas es más flexible en cuanto a cambios de infraestructura?
  4. ¿Cómo afecta Clean Architecture la modularidad del código?
  5. ¿Por qué Hexagonal Architecture usa «puertos y adaptadores»?

Resumen de la Clase

  • Clean Architecture organiza el código en capas concéntricas con el dominio en el centro.
  • Hexagonal Architecture se basa en puertos y adaptadores para desacoplar el negocio de la infraestructura.
  • Vertical Slice Architecture divide el código por features en lugar de capas.
  • Cada arquitectura tiene ventajas y desventajas, y la elección depende del contexto del proyecto.

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 *