Back to code Scala

Clasificar eventos de negocio con pattern matching

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

This post is not in your language yet; you are seeing it in Spanish. The code is the same.

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.

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)

Why it is written this way

  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.
How to try it

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

Watch out

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.

The 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.

Example written and reviewed by hand.

Share

Comments

No comments yet. Yours can be the first.

Plain text only, no links. No email is requested. Comments are reviewed before they are published.

Did you adapt it to something of yours?

Tell me what you solved with it, or what it was missing.

Keep trying

More code

See all
Darinel Ortega Online · I reply during the day
Today
Hello. I'm not selling anything here: this is for exchanging knowledge about technology.
Write whatever you like — you can send text, images or documents. Messages reach my console and I reply from there.
You are writing outside working hours. I will read you as soon as the day starts.

An open conversation to share knowledge. Messages reach my console and I reply from there.

Let us book a conversation

Pick the day and time that work for you. Thirty minutes, no sales pitch.

Video call

For a video call, just ask for one here and I'll send you the session link.