7 de noviembre de 2007

Modelo-Vista-Controlador simplificado

Haskell es mi lenguaje preferido. Puede parecer una afirmación rotunda, pero al ser algo totalmente subjetivo, lo puedo decir sin equivocarme. Lo que no es tan subjetivo es la experiencia que tengo en Haskell. Casi nula, apenas nada. Por eso he decidido empezar un pequeño proyecto para adquirir soltura.

Haskell Stack Calculator. El proyecto en cuestión consiste en una calculadora de pila. Es decir, que primero se introducen los operandos para a continuación introducir el operador. Como primer paso, hago un esquema simple de lo que va a ser el diseño de la aplicación. Y me decido por usar el patrón Modelo-Vista-Controlador, MVC.

El patrón Modelo-Vista-Controlador más común es el del siguiente diagrama. En este diagrama se ven que las tres partes del patrón tienen relación entre si. La Vista avisa al Controlador de los eventos del usuario. El Controlador actualiza los datos del Modelo. Y el Modelo con los nuevos datos actualiza la Vista.


Lo primero que me doy cuenta es que con Haskell, el modelo va a ser un conjunto de funciones que vayan transformando los datos. En concreto, tendré funciones que cojan la pila actual y devuelva una nueva pila después de aplicar el operador correspondiente. Teniendo esto en cuenta, tenemos que la relación entre Modelo y Vista es innecesaria. Podemos hacer uso de un MVC simplificado, que es el que tenemos en el siguiente gráfico.


Teniendo en mente este gráfico reducido de MVC, podemos ver que la mayor parte de la lógica va a ir en el Controlador. La parte de Vista se actualizará utilizando el GUI adecuado (gtk2hs en nuestro caso). De este diseño preliminar podemos sacar una plantilla de las diferentes funciones del controlador:

pulsaBoton modelo vista = do
valor <- getValor modelo

-- usa el valor
-- .....
-- let nuevoValor = .....
setValor modelo nuevoValor
actualizaVista vista nuevoValor

De esta manera, a la hora de programar la calculadora, vamos usando la plantilla anterior para cada uno de los botones. Añadiendo parametros extra incluso podemos reusar la misma funcion para multiples botones. Por ejemplo, todos los botones númericos pueden usar la misma función.

En el caso de HSCalc, tal como esta implementado, se hace uso de IORef para mantener el estado de la pila. En este caso la función plantilla de la parte Controlador seria la siguiente.

pulsaBoton :: IORef m -> v -> IO()
pulsaBoton modelo vista = do
valor <- getIORef modelo

-- usa el valor
-- .....
-- let nuevoValor = .....

writeIORef modelo nuevoValor
actualizaVista vista nuevoValor

Bueno, uno de mis temores con Haskell es como realizar el flujo de un programa normal. Mediante este MVC simplificado se me ha hecho francamente fácil. En próximos posts ya iré contando como me va con Haskell Stack Calculator

La imagen del diagrama MVC ha sido obtenida de Wikipedia. La imagen del diagrama simplificado la he realizado yo a partir de la primera.

2 comentarios:

Unknown dijo...

-- off-topic

rehusar no es lo que estás pensando.

el realidad la rae no recoge reusar, pero parece correcto como neologismo.

Luis Cabellos dijo...

Cierto, ... es reusar la palabra correcta. Corregido :-P