Introducción a la clase
En esta clase exploraremos cómo aplicar estructuras de datos y algoritmos en el patrón Vertical Slice Architecture, un enfoque que divide una aplicación en funcionalidades aisladas y autosuficientes en lugar de capas tradicionales.
Este patrón facilita la escalabilidad y permite mantener el código más organizado y enfocado en casos de uso específicos, integrando algoritmos y estructuras de datos dentro de cada «slice».
¿Qué obtendrás de esta clase?
- Comprender los principios de Vertical Slice Architecture.
- Aprender a estructurar el código basado en casos de uso aislados.
- Implementar algoritmos y estructuras de datos dentro de slices independientes.
- Aplicar este patrón en un caso real con C#.
Vertical Slice Architecture: Resumen rápido
A diferencia de Clean Architecture, donde el código se organiza en capas horizontales (Dominio, Aplicación, Infraestructura), en Vertical Slice Architecture cada funcionalidad se organiza de forma independiente y encapsulada.
Estructura básica de Vertical Slice Architecture
/Pedidos
/CrearPedido
CrearPedidoCommand.cs
CrearPedidoHandler.cs
PedidoRepositorio.cs
/ObtenerPedidos
ObtenerPedidosQuery.cs
ObtenerPedidosHandler.cs
Cada slice contiene sus propias entidades, reglas de negocio y lógica de persistencia, evitando dependencias innecesarias.
Ejemplo práctico: Sistema de Gestión de Pedidos con Vertical Slice Architecture
Supongamos que desarrollamos un sistema de pedidos, donde cada slice maneja una funcionalidad diferente.
Creación del Pedido (Slice Independiente con Lista en Memoria)
Este slice maneja la creación de pedidos, utilizando una lista como base de datos temporal.
CrearPedidoCommand.cs (Definición del comando)
public class CrearPedidoCommand
{
public string Cliente { get; }
public decimal Total { get; }
public CrearPedidoCommand(string cliente, decimal total)
{
Cliente = cliente;
Total = total;
}
}
Aquí definimos un comando que representa la acción de crear un pedido.
CrearPedidoHandler.cs (Lógica de negocio y almacenamiento en lista)
using System;
using System.Collections.Generic;
public class CrearPedidoHandler
{
private static List<Pedido> _pedidos = new List<Pedido>();
public int Handle(CrearPedidoCommand command)
{
int id = _pedidos.Count + 1;
Pedido nuevoPedido = new Pedido(id, command.Cliente, command.Total);
_pedidos.Add(nuevoPedido);
return id;
}
public List<Pedido> ObtenerPedidos() => _pedidos;
}
Aquí usamos una lista para almacenar los pedidos, evitando acoplar la funcionalidad a una base de datos.
Consultar Pedidos (Slice Independiente con Diccionario para Acceso Rápido)
Este slice maneja la recuperación de pedidos, utilizando un diccionario para acceso rápido.
ObtenerPedidosQuery.cs (Consulta de pedidos)
public class ObtenerPedidosQuery { }
Este query representa la solicitud de obtener la lista de pedidos.
ObtenerPedidosHandler.cs (Lógica para buscar pedidos por ID en un Diccionario)
using System.Collections.Generic;
public class ObtenerPedidosHandler
{
private readonly Dictionary<int, Pedido> _pedidos;
public ObtenerPedidosHandler(List<Pedido> pedidos)
{
_pedidos = new Dictionary<int, Pedido>();
foreach (var pedido in pedidos)
_pedidos[pedido.Id] = pedido;
}
public Pedido Handle(int id)
{
return _pedidos.ContainsKey(id) ? _pedidos[id] : null;
}
}
Aquí usamos un diccionario (O(1)) para acceder rápidamente a los pedidos por ID.
Implementando el Punto de Entrada (Interfaz de Usuario)
Este código permite al usuario crear y consultar pedidos en un CLI.
using System;
class Program
{
static void Main()
{
var handlerCrear = new CrearPedidoHandler();
var handlerObtener = new ObtenerPedidosHandler(handlerCrear.ObtenerPedidos());
Console.WriteLine("Ingrese el nombre del cliente:");
string cliente = Console.ReadLine();
Console.WriteLine("Ingrese el total del pedido:");
decimal total = Convert.ToDecimal(Console.ReadLine());
int idPedido = handlerCrear.Handle(new CrearPedidoCommand(cliente, total));
Console.WriteLine($"Pedido creado con ID: {idPedido}");
Console.WriteLine("Ingrese el ID del pedido a consultar:");
int idConsulta = Convert.ToInt32(Console.ReadLine());
Pedido pedido = handlerObtener.Handle(idConsulta);
if (pedido != null)
Console.WriteLine($"Pedido {pedido.Id}: Cliente {pedido.Cliente}, Total {pedido.Total}, Estado {pedido.Estado}");
else
Console.WriteLine("Pedido no encontrado.");
}
}
Este código demuestra cómo cada slice maneja su propia funcionalidad de manera aislada, facilitando la escalabilidad.
Caso de uso real
Una aplicación de comercio electrónico puede utilizar Vertical Slice Architecture para manejar funcionalidades como:
- Gestión de Productos
- Gestión de Pedidos
- Procesamiento de Pagos
Cada slice es independiente, facilitando la integración con diferentes tecnologías y bases de datos.
Beneficios de Vertical Slice Architecture
Beneficio | Explicación |
---|---|
Modularidad | Cada funcionalidad es independiente y fácil de modificar. |
Menos acoplamiento | No depende de capas horizontales innecesarias. |
Escalabilidad | Se pueden agregar nuevas funcionalidades sin afectar las existentes. |
Optimización con estructuras de datos | Se elige la mejor estructura de datos para cada slice (listas, diccionarios, colas). |
Desafío práctico Ejercicio:
- Implementa un sistema de gestión de tareas, donde cada tarea se almacene en una lista ordenada por prioridad dentro de un slice independiente.
- Crea un slice para procesamiento de notificaciones, donde los mensajes se almacenen en una cola FIFO y se procesen en orden.
Resumen de la clase
- Vertical Slice Architecture organiza el código en slices independientes en lugar de capas horizontales.
- Diccionarios, listas y colas permiten optimizar el acceso y manipulación de datos.
- Caso de uso real aplicado a e-commerce para gestión de pedidos y productos.
Próxima clase: Optimización y rendimiento en algoritmos en C#
En la siguiente clase aprenderemos estrategias para optimizar algoritmos en C#, incluyendo profiling, paralelización y estructuras de datos eficientes para mejorar el rendimiento.