Hola gente,
Estuve algunos d�as ocupado con otras cosas, y el SWT/ST2JS/etc no
avanzaron mucho. Ahora estoy por volver a la actividad, y como el
movimiento se demuestra andando les comento en que estado estamos.
Sigo detenido en el punto MVC-Distribuido. Si bajan las �ltimas
versiones, ver�n que est� funcionando relativamente bien.
La versi�n actual prueba (creo, decidan ustedes mismos) que es posible
hacer una aplicaci�n MVC donde el M(odel) est� en el server (Smalltalk)
y el V(iew)/C(ontroller) est� en el cliente (Browser de Internet). Para
lograr tiempos de respuesta adecuados, algunas optimizaciones ya fueron
hechas y funcionan bastante bien.
Para acelerar los tiempos de respuesta, b�sicamente hay que reducir la
cantidad de requests desde los clientes.
Mensajes Asincr�nicos/Cola de mensajes asincr�nicos:
----------------------------------------------------
En una aplicaci�n t�pica MVC, el View se conecta a MUCHOS eventos del
modelo. Cada suscripci�n implica un env�o de mensaje. Si el Modelo
est� remoto, eso implica 1 request por internet. Imaginemos un simple
objeto de clase Cliente, con algunos aspectos como #nombre, #apellido,
#fechaDeNacimiento y #dni. Para crear una Vista con esos aspectos, el
View/Controller deber� suscribirse a los eventos de nombre #nombre,
#apellido, #fechaDeNacimiento y #dni... es decir: 4 requests.
Si a eso le sumamos que, antes de suscribirse hay que hacer un request
para pedir una referencia remota, tendremos que hacer N+1 requests para
crear una vista sobre un objeto con N aspectos.
El caso empeora cuando cargamos un objeto en la vista y descargamos
otros. En ese caso necesitamos N+1 requests para el objeto nuevo
(siendo N la cantidad de aspectos del objeto nuevo) y M requests para
desuscribirse de los eventos del objeto viejo (siendo M la cantidad de
aspectos del objeto viejo).
Por supuesto eso matar�a la velocidad del cliente.
Sin embargo encontr� una forma de optimizaci�n que funciona muy bien, y
logra resolver el caso dado (con o sin objeto viejo) haciendo SIEMPRE 2
requests: 1 para obtener la referencia remota al objeto nuevo, y 1 para
hacer (en batch) TODAS las desuscripciones y suscripciones.
El truco consiste en lo siguiente:
- Cuando hacemos un env�o de mensaje al #serverSide, y no
necesitamos un valor de respuesta, podemos hacer el env�o
asincr�nico. Para poder tomar ventaja de esto, el proxy
generado del ServerApplication incluye 2 m�todos por cada m�todo
del ServerApplication, uno para invocarlo sincr�nicamente y otro
para hacer as�ncrono.
- El framework permite encolar muchos env�os de mensajes
asincr�nicos en 1 s�lo pedido, simplemente haciendo algo como:
aRemoteModel. "Referencia remote obtenid"
self isolatedAsynchronousRPCMethods: [
mainPanel clearWidgets. "Limpia los widgets viejos, causando que el
browser se desconecte de los eventos al modelo anterior."
mainPanel addWidget: aRemoteModel defaultView. "Crea la nueva vista al
nuevo modelo, causando la conexi�n a los eventos del modelo nuevo."
].
(Ver senders/implementors de #isolatedAsynchronousRPCMethods:)
Eventos extendidos:
-------------------
Otro patr�n t�pico de las aplicaciones MVC es que el View env�e un
mensaje (por ejemplo el mensaje #nombre) cuando se entera que el modelo
cambi� (por estar suscripto al evento de nombre #nombre). Si tenemos en
cuenta que el Modelo est� en el servidor, y que las Vistas/Controladores
est�n en los browsers, veremos que cuando el modelo cambia (y el evento
se propaga a los browsers, usando la conexi�n Comet) todas las vistas
enviar�n un mensaje al Server para obtener el nuevo valor del modelo.
Para optimizar ese caso, expand� (levemente) el mecanismo de eventos.
As� se suscribe un Aspecto (SWTAspect) al modelo.
self model
when: self eventName
send: #modelChanged:
to: self
withResultsOfSelectors: {self getter}
La clave est� en la �ltima parte del mensaje: "withResultsOfSelectors:
{self getter}". Cuando ocurre un evento de nombre "self eventName", el
modelo enviar� el mensaje "#modelChanged:" a "self", INCLUYENDO en el
env�o el resultado de enviar el mensaje "self getter" al modelo.
Con ese "truco", el evento se propaga con la informaci�n extra necesaria
evitando que los clientes (browsers) tengan que hacer un pedido.
�C�mo sigue el trabajo? --> Hay que lograr que un usuario del framework
no tenga que manejar a mano la complejidad inherente a tener un MVC
distribuido. Para eso el framework debe auto-optimizarse (usando estos
trucos, y otros que se nos ocurran) desde el uso normal. Este objetivo
est�, en parte, tambi�n resuelto: Si uno se limita a usar los Aspects
entregados por SWTModel para crear las vistas, tendremos todas estar
optimizaciones ya hechas.
Entonces ahora toca encontrar una forma de describir los modelos, que
sea Smalltalk-way, pero que tenga el nivel de abstracci�n correcto para
poder meter optimizaciones por debajo. En la versi�n actual la
sobre-cargada-de-responsabilidades clase SWTAspect, y la clase
SWTRemoteModel logran esconder la complejidad... pero, como les dije,
SWTAspect es casi un engendro de mezclas de responsabilidades.
Despu�s de esta s�bana de email, les dejo estas preguntas:
- �Qu� framework de hacer UIs (de Smalltalk u otro lenguaje) les
parece m�s poderoso?
- �Qu� tipo de framework permitir�a crear vistas autom�ticas?
-- �Cuanto de dif�cil es tunear a mano esas vistas autom�ticas?
- �Vieron el NakedObjects (http://nakedobjects.org/)? �Qu� les
parece?
Saludos,
-- Diego
--
==========================================
Diego Gomez Deck
------------------------------------------
http://diegogomezdeck.blogspot.com/
http://smalltalk.consultar.com/
==========================================
--~--~---------~--~----~------------~-------~--~----~
Ha recibido este mensaje porque est� suscrito a Grupo "clubSmalltalk" de
Grupos de Google.
Si quieres publicar en este grupo, env�a un mensaje de correo
electr�nico a [email protected]
Para anular la suscripci�n a este grupo, env�e un mensaje a [EMAIL PROTECTED]
Para obtener m�s opciones, visita este grupo en
http://groups-beta.google.com/group/clubSmalltalk?hl=es.
-~----------~----~----~----~------~----~------~--~---