Saltar al contenido

Cuándo un evento y cuándo un comando

Los dos mecanismos se solapan más de lo que parece y elegir mal produce arquitecturas difíciles de seguir. Tres preguntas que deciden, los dos antipatrones simétricos, y la tabla de casos frecuentes.

Las tres preguntas

Los dos antipatrones

Demasiados eventos. El síntoma es una aplicación donde el estado se actualiza y no se puede seguir por qué. Un componente cambia porque alguien emitió algo en algún sitio, y para averiguar cuál hay que buscar el nombre del evento por todo el proyecto. Con veinte eventos y tres emisores por evento, seguir un flujo se vuelve arqueología.

La causa suele ser usar eventos como sustituto de la comunicación normal: en vez de que un comando devuelva el resultado, emite un evento y quien quiera se entera. Es cómodo de escribir y produce un sistema donde nada tiene un emisor evidente.

Demasiados comandos. El síntoma es el sondeo del nivel 20.1: el frontend pregunta cada segundo si algo cambió, porque el core no tiene forma de avisar. Sesenta cruces por minuto y retraso garantizado.

La causa suele ser no querer añadir un mecanismo nuevo: con comandos ya funciona, así que se estira.

La asimetría entre los dos: el exceso de comandos cuesta rendimiento, que se mide y se arregla; el exceso de eventos cuesta trazabilidad, que no se mide y se paga en cada sesión de depuración. Por eso la regla de dedo cuando dudas es comando: deja rastro, tiene un llamante identificable, y devuelve algo que se puede seguir.

Los casos frecuentes

Y una regla de higiene

Si decides usar eventos, que su emisión esté acotada: un evento se emite desde uno o dos sitios, no desde ocho. La forma práctica de conseguirlo es que los eventos los emita la capa que posee ese dominio y no cualquiera que pase por ahí:

Rust
// mal: cinco sitios emiten proyecto-cambiado// bien: solo el módulo de proyectos lo emite, y lo hace en una funciónpub fn notificar_cambio(app: &AppHandle, p: &Proyecto) -> tauri::Result<()> {    app.emit(eventos::PROYECTO_CAMBIADO, &ProyectoResumen::de(p))}

Con eso, buscar quién emite un evento es buscar una función, y la trazabilidad vuelve.