Volver al código Scala

Clasificar eventos de negocio con pattern matching

Reglas de negocio escritas como una tabla de casos: el compilador avisa si falta alguno.

El problema

Llegan eventos distintos —compras, devoluciones, reclamos— y cada uno se trata según sus datos. Con if y else anidados las reglas se vuelven ilegibles y nadie nota la que falta.

Scala
sealed trait Evento
case class Compra(cliente: String, monto: BigDecimal) extends Evento
case class Devolucion(cliente: String, monto: BigDecimal, motivo: String) extends Evento
case class Reclamo(cliente: String, texto: String) extends Evento

def clasificar(e: Evento): String = e match {
  case Compra(c, m) if m >= 1000        => s"VIP: $c compró $m"
  case Compra(c, m)                     => s"Normal: $c compró $m"
  case Devolucion(c, m, "defecto")      => s"Calidad: revisar lote, $c devolvió $m"
  case Devolucion(c, m, motivo)         => s"Devolución de $c ($motivo): $m"
  case Reclamo(c, t) if t.contains("legal") => s"URGENTE: $c menciona acción legal"
  case Reclamo(c, _)                    => s"Atención al cliente: $c"
}

@main def demo(): Unit =
  List(Compra("Ana", 1500), Devolucion("Luis", 80, "defecto"), Reclamo("Eva", "voy a lo legal"))
    .map(clasificar).foreach(println)

Por qué está escrito así

  1. sealed trait le dice al compilador que esos tres son todos los eventos posibles: si agregás un cuarto y no lo tratás, avisa.
  2. Cada case desarma el evento y nombra sus partes en el mismo renglón.
  3. Las condiciones (if m >= 1000) y los valores fijos ("defecto") conviven en la misma tabla.
  4. El orden importa: gana el primer caso que coincide, por eso lo específico va arriba.
Cómo probarlo

Guardalo como eventos.scala y corré con Scala 3: scala eventos.scala (o scala-cli run eventos.scala).

Ojo con esto

Buscar la palabra "legal" en un texto libre es una regla frágil: se le escapa "abogado" y salta con "ilegalmente". Sirve como primer filtro, no como decisión.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo esta clasificación de eventos con pattern matching en Scala 3. Mis eventos reales son: [EVENTOS Y SUS CAMPOS] y las reglas de negocio son: [REGLAS EN LENGUAJE LLANO]. Reescribila con esos datos, devolviendo un tipo propio (prioridad, área responsable, acción) en vez de texto, y agregá pruebas que cubran cada regla y el caso por defecto.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.