Clasificar eventos de negocio con pattern matching
Reglas de negocio escritas como una tabla de casos: el compilador avisa si falta alguno.
The problem
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.
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)
Why it is written this way
- 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.
- Cada case desarma el evento y nombra sus partes en el mismo renglón.
- Las condiciones (if m >= 1000) y los valores fijos ("defecto") conviven en la misma tabla.
- El orden importa: gana el primer caso que coincide, por eso lo específico va arriba.
Guardalo como eventos.scala y corré con Scala 3: scala eventos.scala (o scala-cli run eventos.scala).
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.
Adapt it to your case with AI
The button copies this prompt with the code pasted below it. Replace the brackets with your own details and paste it into ChatGPT, Claude, Gemini or Copilot.
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.
Example written and reviewed by hand.
Comments
No comments yet. Yours can be the first.
Did you adapt it to something of yours?
Tell me what you solved with it, or what it was missing.