Cita:
Empezado por roman
En cualquier aplicación siempre hay algo recorriendo los controles y verificando cosas
.... si las validaciones son muy complejas (como, por ejemplo, incluir consultas a base de datos) se puede ver afectado el rendimiento de la aplicación
|
Claro que es así. El asunto no es de posibilidades, sino de comodidad

, pero mas importante, de claridad y que el código sea correcto.
El problema de la GUI es que los datos se "mueven" en el tiempo, y esto muta los objetos. Mantener la coordinación requiere moverse entre varios lugares (que cierto que acciones y demás cosas ayudan). La idea aqui es como evitarlo? Como centralizarlo? Como "aplanar" el proceso?
-----
Pensemos por ejemplo, en el caso de la pantalla de login, que ademas chequea en tiempo real si el usuario ya esta tomado, y obtiene el gravatar de ese correo. Debe ademas actualizar la interface de forma correcta, no interrumpir y que ademas cuando le de "Login" cancele cualquier solicitud de red pendiente.
En un estilo tipico, esto seria relativamente engorroso de hacer. Veamos como es al estilo de "Programacion Reactiva". Me perdonan la syntaxis inventada pero me di cuenta que si lo hago en otros lenguajes le puedo meter cosas que tocaria explicar.
Código PHP:
FetchNetwork = Events.
([email], TextChange)
.each(function edit, event
return IsValidEmail(edit.text)
//Ejecutar concurrentemente las llamadas de red, sin esperar la anterio
).nextAsync(function edit
fetchGravatar(edit.text)
).nextAsync(function edit
isEmailTaken(edit.text)
//Cuando obtengo ambas respuestas...
).merge(function img, isTaken
if isTaken
return False
form.imgUser.Load(img)
return True
)
//Password parecen validos, y son iguales
IsValidPass = Events.
([Pass1, Pass2], TextChange)
//Por cada control...
.each (function edit, event
return IsValidPassword(edit.Text)
)
.merge()
.filter(function result1:bool, result2:bool
//Si son iguales
result1==result2
)
//Combino todo
Loop = Events.([IsValidPass, FetchNetwork])
//Cuando login Ok, cancelo el proceso de eventos
Loop.Stop()
La parte importante, es que se puede hacer composicion de eventos, que estos hacen cascada y que solo continuan cuando el anterior tiene exito (o saca error, y se va al manejo de errores), por lo tanto, si esto en
.filter(function result1:bool, result2:bool) ya se con certeza que las claves son validas y solo queda averiguar si son iguales. Se tengo que agregar otros edits no hay problema, y como puede hacer composicion y combinan eventos, puedo generar una libreria de soluciones universales y re-combinar al gusto.
El estilo anterior tiene la contra de que es un monton de callbacks y eso se pone algo pesado a la vista. Es mucho mas limpio si se hace con
Communicating sequential processes, pero lastima no hay mucho de eso en el mundo GUI.
El asunto es que se requiere algo de ayuda del lenguaje para que sea natural de operar.