Skip to content

Instantly share code, notes, and snippets.

@codewithleader
Last active June 30, 2024 05:11
Show Gist options
  • Save codewithleader/a847f587eb517fe79c2d874f5c365ded to your computer and use it in GitHub Desktop.
Save codewithleader/a847f587eb517fe79c2d874f5c365ded to your computer and use it in GitHub Desktop.
Lenguaje Ubicuo para el Domain-Driven Design (DDD)

Lenguaje Ubicuo

El lenguaje ubicuo es un concepto clave en el desarrollo de software, especialmente en el contexto de la metodología de Domain-Driven Design (DDD), propuesta por Eric Evans en su libro Domain-Driven Design: Tackling Complexity in the Heart of Software.

El lenguaje ubicuo se refiere a un lenguaje común, compartido y entendido tanto por los desarrolladores como por los expertos en el dominio (es decir, las personas que tienen un profundo conocimiento del área de negocio o problema que se está resolviendo con el software). Este lenguaje se utiliza en todas las conversaciones y en la documentación del proyecto, y debe reflejarse directamente en el código del software.

Características del lenguaje ubicuo:

  • Consistencia: El mismo término debe tener el mismo significado en todo el proyecto, tanto en el lenguaje hablado como en el código.

  • Claridad: Debe evitarse el uso de términos ambiguos o jerga técnica que los expertos en el dominio no comprendan.

  • Accesibilidad: Todos los miembros del equipo, incluidos desarrolladores, testers, analistas de negocio y stakeholders, deben entender y utilizar este lenguaje.

  • Reflejo en el Código: Las clases, métodos y módulos en el código deben utilizar nombres que provienen directamente del lenguaje ubicuo. Esto facilita la comprensión y el mantenimiento del código, ya que cualquier miembro del equipo puede entenderlo sin necesidad de traducción o interpretación.

Beneficios del lenguaje ubicuo:

  • Mejora de la comunicación: Al tener un lenguaje común, se reducen las malinterpretaciones y se mejora la comunicación entre el equipo de desarrollo y los expertos en el dominio.

  • Mejora del diseño del software: El lenguaje ubicuo ayuda a crear un modelo de dominio que refleja fielmente la realidad del negocio, lo que lleva a un diseño de software más preciso y robusto.

  • Facilita el mantenimiento y la evolución del software: Un código que utiliza el lenguaje ubicuo es más fácil de entender y mantener, ya que refleja directamente los conceptos del dominio del negocio.

En resumen, el lenguaje ubicuo es una herramienta poderosa para alinear la comprensión del problema y la solución entre todos los involucrados en un proyecto de software, asegurando que el software desarrollado sea realmente útil y relevante para el negocio.

¡Claro! A continuación, te presento un ejemplo de cómo podrías documentar el lenguaje ubicuo para una aplicación de una barbería que permite reservas online y tiene una tienda virtual.

Ejemplo del Lenguaje Ubicuo

Documentación del Lenguaje Ubicuo para la Barbería

Introducción

Este documento establece el lenguaje ubicuo para el proyecto de la aplicación de barbería con funcionalidades de reservas online y tienda virtual. Todos los términos definidos aquí deben ser utilizados consistentemente en las conversaciones, documentación y en el código del software.

Términos del Dominio

  1. Cliente:

    • Definición: Persona que utiliza la aplicación para reservar servicios de barbería o comprar productos.
    • Ejemplo en el Código:
      class Cliente {
        nombre: string;
        email: string;
        telefono: string;
      }
  2. Barbero:

    • Definición: Persona que presta servicios de barbería a los clientes.
    • Ejemplo en el Código:
      class Barbero {
        nombre: string;
        especialidades: string[];
        disponibilidad: Disponibilidad[];
      }
  3. Servicio:

    • Definición: Procedimiento o conjunto de procedimientos ofrecidos por un barbero, como corte de cabello, afeitado, etc.
    • Ejemplo en el Código:
      class Servicio {
        nombre: string;
        duracion: number; // en minutos
        precio: number;
      }
  4. Reserva:

    • Definición: Cita programada por un cliente para recibir un servicio de barbería en una fecha y hora específicas.
    • Ejemplo en el Código:
      class Reserva {
        cliente: Cliente;
        barbero: Barbero;
        servicio: Servicio;
        fecha: Date;
        estado: EstadoReserva;
      }
  5. EstadoReserva:

    • Definición: Estado actual de una reserva. Puede ser "Pendiente", "Confirmada", "Cancelada" o "Completada".
    • Ejemplo en el Código:
      enum EstadoReserva {
        Pendiente = 'Pendiente',
        Confirmada = 'Confirmada',
        Cancelada = 'Cancelada',
        Completada = 'Completada',
      }
  6. Producto:

    • Definición: Artículo disponible para la venta en la tienda virtual, como productos para el cuidado del cabello, accesorios, etc.
    • Ejemplo en el Código:
      class Producto {
        nombre: string;
        descripcion: string;
        precio: number;
        stock: number;
      }
  7. Carrito de Compras:

    • Definición: Conjunto de productos seleccionados por un cliente para su compra.
    • Ejemplo en el Código:
      class CarritoDeCompras {
        productos: Producto[];
        total: number;
      }
  8. Pedido:

    • Definición: Orden de compra generada por un cliente a partir del carrito de compras.
    • Ejemplo en el Código:
      class Pedido {
        cliente: Cliente;
        productos: Producto[];
        total: number;
        fecha: Date;
        estado: EstadoPedido;
      }
  9. EstadoPedido:

    • Definición: Estado actual de un pedido. Puede ser "Procesando", "Enviado", "Entregado" o "Cancelado".
    • Ejemplo en el Código:
      enum EstadoPedido {
        Procesando = 'Procesando',
        Enviado = 'Enviado',
        Entregado = 'Entregado',
        Cancelado = 'Cancelado',
      }
  10. Disponibilidad:

    • Definición: Intervalos de tiempo en los que un barbero está disponible para ofrecer servicios.
    • Ejemplo en el Código:
      class Disponibilidad {
        dia: string;
        horaInicio: string;
        horaFin: string;
      }

Ejemplos de Uso

Escenario 1: Crear una Reserva

  1. Narrativa: Un cliente, Juan Pérez, quiere reservar un corte de cabello con el barbero Mario en la fecha 2024-07-10 a las 10:00 AM.

  2. Lenguaje Ubicuo:

    • Cliente: Juan Pérez
    • Barbero: Mario
    • Servicio: Corte de Cabello
    • Fecha: 2024-07-10, 10:00 AM
    • Estado de la Reserva: Pendiente
  3. Código:

    const cliente = new Cliente('Juan Pérez', '[email protected]', '123456789');
    const barbero = new Barbero('Mario', ['Corte de Cabello']);
    const servicio = new Servicio('Corte de Cabello', 30, 15.0);
    
    const reserva = new Reserva(
      cliente,
      barbero,
      servicio,
      new Date('2024-07-10T10:00:00'),
      EstadoReserva.Pendiente
    );

Escenario 2: Realizar un Pedido en la Tienda Virtual

  1. Narrativa: El cliente Ana Gómez compra un champú y una cera para cabello en la tienda virtual.

  2. Lenguaje Ubicuo:

    • Cliente: Ana Gómez
    • Productos: Champú, Cera para Cabello
    • Total: 20.0
    • Estado del Pedido: Procesando
  3. Código:

    const cliente = new Cliente('Ana Gómez', '[email protected]', '987654321');
    const producto1 = new Producto(
      'Champú',
      'Champú para todo tipo de cabello',
      10.0,
      50
    );
    const producto2 = new Producto(
      'Cera para Cabello',
      'Cera de fijación fuerte',
      10.0,
      30
    );
    
    const carrito = new CarritoDeCompras([producto1, producto2], 20.0);
    
    const pedido = new Pedido(
      cliente,
      carrito.productos,
      carrito.total,
      new Date(),
      EstadoPedido.Procesando
    );

Conclusión

El uso consistente del lenguaje ubicuo facilita la comunicación entre todos los miembros del equipo y asegura que el código sea una representación clara y precisa del dominio del negocio. Este documento debe ser actualizado regularmente para reflejar cualquier cambio en el modelo del dominio o en los términos utilizados.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment