MVC - Model View Controller
El modelo–vista–controlador (MVC) es un patrón de arquitectura de software que separa los datos y la lógica de negocio de una aplicación de la interfaz de usuario y el módulo encargado de gestionar los eventos y las comunicaciones. Fue una de las primeras ideas en el campo de las interfaces gráficas de usuario - Wikipedia.
Se debe destacar lo siguiente:
- MVC es un patrón de arquitectura.
- MVC es creado para implementar interfaces gráficas de usuario: separando datos y lógica de negocio de la atención a las solicitudes por parte del usuario.
Lo anterior no nos da mucha información sobre el porque MVC puede ser usado para el desarrollo web. A continuación expongo la razón detrás de MVC en el desarrollo web.
Un lenguaje de programación en el lado del servidor (o back-end) requiere llevar a cabo los siguientes pasos como aplicación web:
Recibir y atender solicitudes (GET/POST) de parte del cliente (Navegador Web) realizados por un usuario. Por ejemplo:
- Dame una lista de los trabajadores del departamento de ventas
- Cambia a este trabajador a este departamento
- Actualiza los datos personales de este trabajador
Tomar decisiones sobre el como atender la solicitud del cliente.
Por ejemplo:
- Determinar de donde obtendrá los datos para atender la solicitud
- Determinar si es permitido llevar a cabo la solicitud por parte del usuario
- Mostrar mensajes de advertencia/error ante solicitudes mal hechas o que provoquen algún error durante su atención
Realizar operaciones (lecturas, escrituras, eliminaciones o actualizaciones) sobre alguna fuente de datos/información.
Por ejemplo:
- Acceder a la tabla
trabajadores
de la base de datosempresa
y seleccionar a los que correspondan al departamento de ventas. - Extraer datos de un documento e ingresarlos a la tabla
trabajadores
de la base de datosempresa
.
- Acceder a la tabla
Generar alguna presentación de los datos al cliente para que los visualice el usuario.
Por ejemplo:
- Generar un documento HTML que mediante un elemento
<table>
muestre a los trabajadores del departamento de ventas. - Generar un documento PDF que muestre los datos personales de un trabajador, incluyendo su foto.
- Generar un documento HTML que mediante un elemento
Como se puede notar estamos hablando de varias y distintas operaciones llevadas a cabo en una misma aplicación.
Es aquí en donde entra MVC para ayudarnos a identificar y separar en nuestra aplicación quien se encarga de que cosa.
Consideraciones previas de MVC
MVC nace en los años 70´s para el desarrollo de interfaces gráficas de usuario en aplicaciones de escritorio, por lo tanto el MVC del que aquí hablaré no es el MVC original, si no más bien su adaptación en el desarrollo de aplicaciones web.
MVC como patrón de arquitectura solo nos da las pautas del como implementarlo. En la realidad cada programador puede implementar su propio MVC con el lenguaje de programación de su preferencia pero manteniendo la idea esencial de MVC.
Finalmente, por cuestiones prácticas se asocia a MVC con el paradigma de programación orientado a objetos, sin embargo MVC no está asociado a algún lenguaje o paradigma de programación en particular. Lo anterior ha dado como resultado que existan distintas interpretaciones e implementaciones de MVC para el desarrollo de aplicaciones web.
Las distintas intepretaciones e implementaciones de MVC se encuentran en los frameworks para desarrollo web o aplicaciones web.
La idea esencial de MVC
MVC identifica 3 componentes o elementos en toda aplicación que requiera de una interfaz de usuario mediante la cual el usuario interactúa (hace solicitudes):
- Controlador: contiene la programación para recibir y atender la solicitud del cliente, realizada por el usuario.
- Modelo: contiene la programación para mantener y respetar la lógica de negocio. Esto suele incluir el realizar operaciones sobre alguna fuente de datos.
- Vista: contiene la programación para generar una representación de los datos.
De lo anterior y como ejemplo de la interacción entre un controlador, un modelo y una vista:
El controlador recibe la solicitud del cliente: "dame una lista de los trabajadores del departamento de ventas", pero no sabe como o de donde se obtienen los datos para atender la solicitud, pero sabe quien si puede ayudarle, el modelo, por lo tanto el controlador le solicita los datos al modelo.
El modelo no sabe quien, como o cuando realizó la solicitud pero sabe que el controlador le está pidiendo los datos de los trabajadores del departamento de ventas, por lo tanto accede a su fuente de datos, extrae los datos y se los entrega al controlador.
El controlador al obtener los datos por parte del modelo no sabe como o en que formato presentarlos al cliente, pero sabe que existe alguien que se encarga de eso, la vista, por lo tanto el controlador le da los datos a la vista y le pide la ayuda para generar una presentación de los mismos.
La vista no sabe quien, como o cuando realizó la solicitud y ni mucho menos sabe de donde provienen los datos, pero sabe que el controlador le está dando datos de los trabajadores del departamento de ventas para generar una presentación de los mismos, lo que él sí sabe hacer.
La siguiente imagen se presenta como ejemplo de la interacción entre un controlador, un modelo y una vista:
Debido a que las interpretaciones e implementaciones existentes de MVC no sea han unificado, existen variaciones:
Para algunos no es la vista quien envía la presentación al usuario, si no que le hace la entrega del mismo al controlador y es éste último quien se lo envía al cliente:
Para otros, la interacción entre un controlador, un modelo y una vista es de la siguiente forma:
En ésta forma el controlador le pide a la vista generar una presentación para responder a la solicitud del cliente, la vista solicita los datos al modelo, éste le hace entrega de los mismos y finalmente, dos opciones, la vista envía la presentación al cliente o bien le hace entrega de éste mismo al controlador y es éste quien se lo envía al cliente.
Consideraciones
Se presentan las siguientes disyuntivas sobre los limites de asuntos concernientes (separation of concerns o separación de intereses), esto es, que tanto debe hacer cada componente o elemento de MVC:
Validación sobre solicitudes
Supongamos que el usuario mediante el cliente solicita lo siguiente:
- Cambiar al empleado x al departamento y.
Ahora puede surgir la siguiente duda:
- ¿Quien valida que no se esté quebrantando alguna regla de negocio?, por ejemplo: un empleado debe tener z estudio profesional para ocupar un puesto en el departamento y.
Ahora estamos ante la disyuntiva:
- ¿Es el controlador o el modelo quien resuelve este asunto?.
Presentación de los datos
Supongamos que el usuario desea ver dos datos de un empleado:
- Fecha de ingreso a la empresa y tiempo en servicio, esto es el tiempo que lleva trabajando en la empresa.
Ahora puede surgir la siguiente duda:
- ¿Es el modelo o la vista quien calcula el tiempo transcurrido?. Ya que el tiempo en servicio es un valor calculado podemos decir que no existe en la fuente de datos disponible para el modelo.
Tipos
MVC se presenta en dos tipos: push based y pull based.
Push based (también conocido como action based): mediante la definición de acciones en los controladores el cliente hace la solicitud y posteriormente se empujan (push) los datos a la vista. Es el más conocido.
Ejemplos de frameworks push-based para desarrollo web:
- Play!
- Spring MVC
- Stripes
- Struts2
- Symfony
- CakePHP
- Django
- Ruby On Rails
Pull based (también conocido como component based): enfatiza a las vistas, quienes extraen (pull) los datos de múltiples controladores, tantos como sean necesarios.
Ejemplo de frameworks pull-based para desarrollo web:
- Wicket
- Tapestry
- Lift
- JavaServer Faces
- PRADO
- Nooku
- Yii
- Qcodo.
Sugerencia
Si estás interesado en el estudio y aprendizaje de algún framework te recomiendo los siguientes:
Spring Framework, para el lenguaje de programación Java.
Sitio oficial: http://projects.spring.io/spring-framework
Incorpora a Spring MVC para el desarrollo de aplicaciones web empresariales siguiendo el patrón de arquitectura MVC push-based.
Mi razón para recomendarte este framework se basa en los siguientes puntos:
- Documentación actual (lecturas y video-tutoriales) existente en español, por lo menos con 2 años de antigüedad ;)
- Comunidades (foros, chat, redes sociales, etc) de desarrolladores web alrededor de los mismos.
- Difusión de las mejores prácticas (ingeniería, metodologías, principios, filosofías, etc) en el desarrollo de aplicaciones web empresariales.
- Integración con herramientas que ya conoces: Eclipse IDE, Apache Tomcat, Apache HTTP Server, Windows-Linux, Git, etc. que ayudan a trabajar de una forma más fácil con ellos.
Lecturas
Patrones y Antipatrones: una Introducción - Parte I y Patrones y Antipatrones: una Introducción - Parte II.
Sobre patrones de software, sus niveles y clasificaciones (catálogo) así como los antipatrones. Menciona tanto a patrones de arquitecturas (como ejemplo a MVC) y los patrones de diseño.
Patrones de Diseño, Refactorización y Antipatrones
Añade el tema de refactorización como técnica, dentro de la ingeniería de software, para el mejoramiento del diseño de un código.