Model View Controller

El patrón MVC (Modelo Vista Controlador) fue inventado en el contexto de Smalltak con el objetivo de separar la interface gráfica del código que hace que trabaje una aplicación. Posteriormente esta idea afectaría una gran parte del código de Smalltak y sería ampliamente aplicada por otros lenguajes orientados a objetos. En el paradigma MVC las entradas del usuario, los modelos del mundo exterior y la retroalimentación visual son explícitamente separados y manejados por tres tipos de objetos, cada uno especializado para un conjunto de tareas específicas.

El objetivo principal del patrón MVC fue dar soporte a los modelos mentales de los usuarios acerca del espacio de información relevante y permitir a este inspeccionar y editar esta información. El paradigma MVC consiste en dividir las aplicaciones en tres partes:

  • Controlador
  • Modelo
  • Vistas

El Modelo incorpora la capa del dominio y persistencia, es la encargada de guardar los datos en un medio persistente (ya sea una base de datos, un archivo de texto, XML, registro, etc.). En el modelo es donde se hace el levantamiento de todos los objetos que tu sistema debe de utilizar, es el proveedor de tus recursos, es decir, el Modelo Automóviles te tiene que dar objetos Automóvil. Es muy típico que las clases del modelo incorporen otro patrón de diseño como Active Record, ya que así es más fácil guardar en el momento en la base de datos.

La Vista se encarga de presentar la interfaz al usuario, en sistemas web, esto es típicamente HTML, aunque pueden existir otro tipo de vistas. En la vista solo se deben de hacer operaciones simples, como ifs, ciclos, formateo, etc.

El Controlador es el que escucha los cambios en la vista y se los envía al modelo, el cual le regresa los datos a la vista, es un ciclo donde cada acción del usuario causa que se inicie de nuevo un nuevo ciclo.

El Controller en cierta forma debe tener un registro de la relación entre ordenes que le pueden llegar y la lógica de negocio que le corresponde (Es como una operadora de teléfono que recibe una petición y une dos líneas).

La forma más sencilla de implementar este patrón es pensando en capas, como regla, los accesos a la base de datos se hacen en el modelo, la vista y el controlador no deben de saber si se usa o no una base de datos. El controlador es el que decide que vista se debe de imprimir y que información es la que se envía.

En el lenguaje Java disponemos de unas clases muy sencillas para implantar el modelo MVC: la clase Observer, Observable del paquete útil. Aunque esa implementación del MVC con esas clases se podría hacer a un nivel muy simple de interacción entre unas pocas clases.

Ventajas de utilizar MVC

Obviamente una separación total entre lógica de negocio y presentación. A esto se le pueden aplicar opciones como el multilenguaje, distintos diseños de presentación, etc. sin alterar la lógica de negocio. La separación de capas como presentación, lógica de negocio, acceso a datos es fundamental para el desarrollo de arquitecturas consistentes, reutilizables y más fácilmente mantenibles, lo que al final resulta en un ahorro de tiempo en desarrollo en posteriores proyectos.

Al existir la separación de vistas, controladores y modelos es más sencillo realizar labores de mejora como:

  • Agregar nuevas vistas.
  • Agregar nuevas formas de recolectar las ordenes del usuario (interpretar sus modelos mentales).
  • Modificar los objetos de negocios bien sea para mejorar el performance o para migrar a otra tecnología.
  • Las labores de mantenimiento también se simplifican y se reduce el tiempo necesario para ellas. Las correcciones solo se deben hacer en un solo lugar y no en varios como sucedería si tuviésemos una mezcla de presentación e implementación de la lógica del negocio.
  • Las vistas también son susceptibles de modificación sin necesidad de provocar que todo el sistema se paralice. Adicionalmente el patrón MVC propende a la especialización de cada rol del equipo, por tanto en cada liberación de una nueva versión se verán los resultados.

MVC con JSP

Cuando se construyen aplicaciones con JSP´s hay que procurar desacoplar la lógica de presentación de la lógica de negocio. Para esto, se suele utilizar el denominado esquema modelo-vista-controlador.

En otras palabras, lo que realizamos es una consulta a un componente (normalmente un servlet) que realiza las labores complejas y delega sobre un JSP la labor de presentación (dejándole en variables de sesión o petición los valores a ser presentados).

Una pagina simple en JSP podría tener esta estructura:

  • Aplicación compuesta solamente de un conjunto de páginas JSP interrelacionadas
  • Las páginas manejan todo: presentación, control y lógica
    • siguiente página queda determinada por un click en un link del tipo <A HREF=”next.jsp”> o el envío de un formulario <FORM ACTION=”process.jsp”>
  • Aún es posible mantener cierta separación dentro de lo posible

Una pagina mas compleja en JSP podría tener esta estructura:

  • Páginas se construyen mediante componentes más pequeñas (HTML o JSP)
  • Uso de directiva <%include>
  • Es posible aislar presentación final de contenidos parciales (portales)
  • La página no requiere ser recompilada si se cambian contenidos incluidos
  • Pueden pasarse parámetros
<jsp:include page=" siguiente.jsp" flush=" true" >
<jsp:param name="id" value="123" />
</jsp:include>

Inconvenientes:

  • Dificultades de mantenibilidad
    • Mezcla significativa entre HTML y código JSP
    • Interacción compleja entre programadores Java y diseñadores de páginas
  • Problemas de control de flujo
    • Páginas pueden ser ejecutadas fuera del orden previsto
    • Debe validarse mucho en cada página
  • Apropiado para aplicaciones simples

MVC con Servlet y JSP

Un diseño de pagina centrado en Servlets tendría estas características:

  • Las páginas son usadas sólo para presentación
  • Lógica de control y de la aplicación son manejadas por detrás por uno o mas servlets
  • Los requests son ruteados indirectamente a las páginas JSP de front-end por un servlet
  • Posibles trabajos del servlet
    • Llevar a cabo acciones a nombre de un JSP (envío de una orden)
    • Entregar a un JSP información para display (record de una base de datos)
    • Controlar el flujo entre las distintas páginas JSP

Vamos a crear un Servlet el cual realizará labores “complejas”  y delegará en un JSP la parte de presentación:

import javax.servlet.*;
import javax.servlet.http.*;
public class ejemploMvc extends HttpServlet {
  public void doGet (HttpServletRequest request, HttpServletResponse response){
    try {
     request.setAttribute ("edad", "24");
     getServletConfig().getServletContext().getRequestDispatcher("/jsp/muestra.jsp").forward(request, response);
    } catch (Exception ex) {
     ex.printStackTrace ();
    }
  }
}

Nuestros JSP, para recoger estos valores y presentarlos correctamente deben tener la siguiente forma:

<html>
 <head>
    <title>Ejemplo de modelo-vista-controlador</title>
 </head>
 <body>
   El parámetro que nos han pasado es
   <% out.print (request.getAttribute("edad").toString()); %>
 </body>
</html>

Si no siguiéramos el modelo MVC todo el código (tanto del Servlet como del JSP) estaría incluido en este ultimo haciendo mas difícil la comprensión a medida que nuestra aplicación crece.

Referencias:

David H. Jonassen. Operationalizing Mental Models: Strategies for Assessing Mental Models to Support

Meaningful Learning and Design- Supportive Learning Environments.

(http://www.ittheory.com/jonassen2.htm).

Joseph Bergin. Building Graphical User Interaces with the MVC Pattern.

(http://csis.pace.edu/~bergin/mvcgui.html)


Anuncios

One Response to Model View Controller

  1. Pingback: Modelo – Vista – Controlador « :p

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: