#MVC = Model-View-Controller
##Contexto La interfaz de usuario es usualmente la parte más frecuentemente modificada de una aplicación interactiva. Por esta razón, es importante mantener las modificaciones a la interfaz de usuario separadas del resto del sistema. Los usuarios pueden querer ver los mismos datos desde distintas perspectivas, como en un gráfico de barras o de torta. Estas representaciones deberían reflejar el mismo estado actual de los datos.
##Problema Cómo se puede mantener la funcionalidad de interaz de usuario separada de la funcionalidad de la aplicación y aún poder responder a acciones del usuario o cambios a los datos de la aplicación? Y cómo pueden crearse, mantenerse y coordinarse las múltiples representaciones de los datos cuando estos cambien?
##Solución El patrón Model-View-Controller (MVC) separa la funcionalidad de aplicación en tres tipos de componentes:
- Model, que contiene los datos de la aplicación, el estado de ellos y la lógica y reglas para cambiarlos
- View, que produce una representación del modelo para el usuario o permite alguna manera de input del usuario
- Controller, que media entre el model y la view y traduce acciones del usuario en cambios en el modelo o en la vista
MVC no es apropiado para cualquier situación. El diseño e implementación de tres tipos distintos de componentes junto con sus variadas formas de interacción puede ser costoso y puede que no tenga sentido para interfaces de usuario relativamente simples.
Pueden existir varias vistas asociadas a un modelo. Por ejemplo, un conjunto de datos administrativos puede ser representado como filas y columnas en un Excel, como una gráfica de torta o como una infografía. A su vez, el modelo puede ser cambiado por distintos controladores.
Los componentes en MVC están conectados entre sí a través de alguna forma de notificaciones, como eventos o callbacks. Un cambio en el modelo, debe ser comunicado a las vistas para que actualicen su representación. Un evento externo, como un input de usuario, debe ser comunicado al controler, que a su vez actualizará la vista y/o el modelo.
Como los componentes están ligeramente acoplados, es fácil desarrollarlos y testearlos en paralelo y cambios en uno deberían tener un impacto mínimo en el otro.
La relación entre los componentes en MVC es representada en el siguiente diagrama.
Más información: