lunes, 16 de abril de 2012

MVC, ingenio y figura.

MVC, ¿No es una unidad del Starcraft?

Para todos aquellos que no sepan lo que es un *MVC (Modelo Vista Controlador ò Model View Controller en Shekespeare), se trata de un patrón de diseño muy utilizado en los lenguajes de programación para diferenciar las diferentes áreas que componen una arquitectura de Software. Sin embargo no es simplemente un patrón, yo lo definiría también como un método de trabajo y una forma elegante de particionar el trabajo entre las diferentes capas que componen la forma de una aplicación.

Cuando estamos construyendo nuestra aplicación, en nuestro equipo a demás de existir programadores (dependiendo de la magnitud del mismo) podrán existir Analistas, Diseñadores, Administradores de Bases de datos, maquetadores, especialistas en pruebas, jefes de proyecto, etc. Todos estos encajan de alguna manera u otra en este famoso MVC.

Estupendo Sigo pensando que era el cacharro que recoge recursos en el Starcraft ...

Cuando realizamos el diseño de una aplicación, en nuestro flujo de datos, siempre existen tres componentes mínimos:

1. El interfaz del usuario (Esa pantalla que muestra los datos)

2. El controlador (Hablaríamos de todas esas funciones, métodos, propiedas, flujos de datos, if-elses, Fors, etc ...)

3. El modelo (Acceso a datos persistentes)

¿Lo sigues sin ver claro?

Vamos a ver un ejemplo de cada una de las capas (existen proyectos que tienen más de estas tres capas, pero estas son las tres básicas):

Vista, ¡Anda, como el Güido!

Cuando hablamos de vista, ni hablamos de la nueva PSP ni del truño de Windows Vista ... Hablamos del interfaz que vamos a mostrar al usuario. Como bien sabemos, las personas que deberían tocar la vista no deben por que saber programar, por lo tanto en esta capa deberíamos de incluir lo mínimo de flujos o podemos tener algunos problemas bastante serios (cuando un maquetador ve un "foreach" o un "if" lo que realmente está leyendo es: "wachu chuwa aipe")

Ponemos el ejemplo de una página web, donde el maquetador tocaría su hoja de estilos (CSS) y cambiaría a su voluntad para hacer la aplicación más agradable al usuario. En el caso de diseñadores, indicarían la distribción óptima de elementos para accesibilidad e usuarios (en el caso de usuarios discapacitados). De lenguajes en este caso sería Html.

Modelo, ¿Qué coño tiene que ver aquí la Schiffer?

Todos nos imaginamos a una mujer 90 - 60 - 90, sin embargo nos referimos al acceso a la BASE de DATOS. Normalmente en un proyecto el acceso a este tipo de capas se reserva para los programadores más experimentados o Administradores de la base de datos. El diseño de una base de datos es bastante comlicado y que funcione todo correctamente es experiencia de muchos años metiendo la pata. Las consultas, agregado, actualizado, etc. suele ser muy delicado, por ejemplo traerse datos críticos de usuarios es complejo, o por ejemplo el borrado de la tabla de usuarios mediante inyecciones. El lenguaje por excelencia es SQL (Simple Query Languaje)

En nuestra aplicación normalmente traemos los datos de una base de datos (Oracle, Mysql, Sql Server) y los mostramos por pantalla a través de un interfaz (Vista). Sin embargo algunas veces queremos hacer una validación de esos datos, por ejemplo:

TABLA:



Tendríamos en nuestro modelo:

CONSULTAR.


SELECT Nombre, Apellidos, Direccion, Telefono FROM Usuarios; // Cada vez que alguien hace un SELECT *, Dios mata un gato.


AGREGAR.

INSERT INTO Usuarios VALUES ('Antonio', 'Dorador Plateado', 'C\ Falsa', '23423423');

ACTUALIZAR.

UPDATE Usuarios VALUES (SET Nombre = 'x') WHERE Nombre = 'Pedro';

BORRAR

DELETE FROM Usuarios WHERE Nombre = 'Pedro';

Imaginemos que queremos paginar los datos, necesitamos cláusulas IF, ELSE, FOR, DO WHILE, etc. ¿El encargado de realizar el acceso a datos se ocupa de esto? Desde luego que no, como hemos dicho, la administración de una BBDD es algo muy costoso y delicado, para eso tendremos la siguiente capa, para filtrar los datos y mostrarlos como nosotros queremos y enviárselos a la capa Vista. Por lo tanto el Controlador es como un "pegamento" entre la Vista y el Modelo.

Contolador (No, no voy a hablar de la novia)

Con esta capa nos referimos a la capa que se dedica al tratamiento de datos, recoge los datos de la Base de datos los gestiona y los envía directamente a la Vista. Según el MVC la Vista y el Modelo no se hablan directamente, sólamente a través del controlador. Es como cuando os peleáis los amigos y uno en común os pone deacuerdo. Si tú Modelo se comunica con tú Vista ... entonces te mereces el premio a Anti-patrón de diseño sysdate('yyyy');. Los programadores son los individuos que pululan en esta capa.

Existen miles de lenguajes de programación como C++, C, Java, C#, PHP, Python, Ruby, etc.

Un ejemplo básico de MVC sería:

Para ponernos en situación ...

Nos imaginamos que hemos desarrollado un buscador de personas, animales, cosas o banqueros. Explicaremos que ocurre por debajo en un patrón MVC. Vamos a explicar el patrón a través de una aplicación Web, bajo mi punto de vista es como más claro se ve.

Vista

El usuario está en nuestro buscador de personas y escribe sobre una caja de texto "Pedro" y pulsa el botón "buscar".

Vista -> Controlador

Entraría en nuestro controlador, filtraría el nombre introducido en la caja te texto con funciones como por ejemplo "trim" (quita espacios en blanco a la izquierda ya la derecha del texto), "sanitize" (Evita inyecciones maliciosas), etc.

Controlador -> Modelo.

Una vez el texto es seguro realizamos la consulta correspondiente a la base de datos:

SELECT Nombre, Apellidos, Direccion, Telefono FROM Usuarios WHERE Nombre = parametro_de_entrada; // En este caso Pedro.

Modelo -> Controlador.


La base de datos encontraría un resultado y lo enviaría al controlador, flitramos los datos devueltos:

- Si hay algún resultado pasárselo a la vista.

- Si no existe ningún resultado, mostrar mensaje "No existen resultados para esta búsqueda".

- En el caso de encontrar un banquero, mostramos mensaje: "Error, esto es un buscador de personas".

Controlador -> Vista.








Mostramos que hay correspondencia de datos, escribimos: "Pedro".

De lo que se trata es de ir pasando por las diferentes capas que tienen un único cometido y un tipo específico de persona especialista para cada una de ellas. Para administrar todo esta arquitectura, encontraríamos al jefe de proyecto que controlaría los tiempos de desarrollo, toma de decisiones, etc.

Para dentro de poco, intentaré montar un MVC funcionando integrando las tecnologías de Struts 2 - Spring - Hibernate (como los osos), Maven, etc. Empezaré con Struts2, en Gnu/Linux ubuntu 10,04 (que es en lo que trabajo).

Prometo que lo tendré para pronto.

Mistmoore.

* ¡La unidad del Starcraft es VCE!