Programación Orientada a Objetos Model-View-Controller César Julio Bustacara Medina Facultad de Ingeniería Pontificia Universidad Javeriana 28/04/2016 1 Agenda Introducción Model-View-Controller Ejemplo Contexto Problema Solución Estructura Dinámica Implementación Introducción • Los sistemas de hoy permiten un alto grado de interacción con el usuario, principalmente lograda con la ayuda de la interfaz gráfica de usuario. • El objetivo es ampliar la usabilidad de una aplicación. • Los sistemas de software usables proporcionan acceso conveniente a sus servicios, entonces permite a los usuarios aprender la aplicación para producir resultados rápidamente. Introducción • Cuando se especifica la arquitectura de tales sistemas, el reto es mantener el núcleo funcional independiente de la interfaz de usuario. • El núcleo del sistema interactivo está basado en los requerimientos funcionales para el sistema, y usualmente permanece estable. • Las interfaces de usuario, sin embargo, son objeto de cambios frecuentes y adaptación. Introducción • Por ejemplo, pueden soportar diferentes estándares de interfaz de usuario, metáforas específicas del cliente, o interfaces que deban ser ajustadas a los procesos de negocio del cliente. • Esto requiere la adaptación de partes de la interfaz de usuario sin causar mayores efectos a la funcionalidad del software. Introducción • Se describen dos patrones arquitectónicos de organización para sistemas de software interactivos: – El patrón Model-View-Controller (MVC). Divide una aplicación interactiva en tres componentes. • El modelo contiene la funcionalidad central y los datos. • La vista presenta la información al usuario. • Los controladores manejan la entrada de usuario. Un mecanismo de propagación de cambios asegura la consistencia entre la interfaz de usuario y el modelo. Introducción • El patrón Presentation-Abstraction-Control (PAC). Define una estructura para sistemas de software interactivos en forma de una jerarquía de agentes cooperantes. – Cada agente es responsable de un aspecto específico de la funcionalidad y consiste de tres componentes: presentación, abstracción, y control. – Esta subdivisión separa los aspectos de interacción hombre-máquina del agente de su funcionalidad central y su comunicación con otros agentes. Model-View-Controller (MVC) • Divide una aplicación interactiva en tres componentes. – El modelo contiene la funcionalidad central y los datos. – La vista presenta la información al usuario. – Los controladores manejan la entrada del usuario. Ejemplo • Considere un sistema de información simple para elecciones políticas con representación proporcional. • Este ofrece una hoja de cálculo para ingresar los datos y varios tipos de tablas y diagramas para presentar los resultados actuales. • Los usuarios pueden interactuar con el sistema a través de una interfaz gráfica. • Toda la información debe reflejar los cambios a los datos de votación inmediatamente.. Ejemplo Negro: 43% Rojo: 39% Azul: 6% Verde: 10% Otro: 2% 50 40 30 20 10 0 Negr o Rojo Azul Ver de Ot r o Negro Rojo Azul Verde Otro 43 39 6 10 2 Ejemplo • Debe ser posible integrar nuevas formas de presentación de datos, como la asignación de sillas parlamentarias a partidos políticos, sin mayor impacto en el sistema. Además, el sistema debe ser portable a plataformas con diferente “look and feel”, como estaciones de trabajo corriendo KDE o PCs corriendo Mac o Windows. Contexto • Aplicaciones interactivas con interfaz hombremáquina flexible. Problema • Las interfaces gráficas son especialmente propensas a modificaciones. Cuando se extiende la funcionalidad de una aplicación, se deben modificar los menús para acceder a las nuevas funciones. • Un cliente puede llamar para la adaptación de una interfaz de usuario específica, o se puede necesitar portar un sistema a otra plataforma con un “look and feel” diferente. • Aún la actualización a una nueva versión de su sistema gráfico puede implicar cambios al código. • La interfaz gráfica de sistemas de larga duración presenta un objetivo en movimiento. Problema • Diferentes usuarios tienen requerimientos conflictivos en la interfaz de usuario, los digitadores querrán ingresar la información en formularios mediante el teclado, un administrador querrá usar el mismo sistema principalmente usando el ratón. Por tanto, se debe poder incorporar fácilmente soporte para varios paradigmas de interfaz de usuario. • Construir un sistema de tales características es costoso y propenso a errores si la interfaz de usuario está altamente acoplada con la funcionalidad central. Lo que puede resultar en el desarrollo y mantenimiento de varios sistemas diferentes: uno por cada implementación de la interfaz de usuario. Problema • Fuerzas : – La misma información es presentada de forma distinta en ventanas diferentes. – La presentación y comportamiento de la aplicación deben reflejar la manipulación de datos inmediatamente. – Los cambios a la interfaz de usuario deben ser fáciles, y posibles en tiempos de ejecución. – Soportar diferentes “look and feel” o el portar la interfaz de usuario no debe afectar el código en el núcleo de la aplicación. Solución • El patrón MVC divide una aplicación interactiva en tres áreas: procesamiento, entrada, y salida. – El Modelo encapsula los datos y la funcionalidad central; es independiente de las representaciones específicas de la salida o el comportamiento de la entrada. – La Vista presenta la información al usuario. Una vista obtiene los datos del modelo. Puede haber múltiples vistas del modelo. Cada vista tiene asociado un componente Controlador. Solución – Los Controladores reciben entradas, usualmente como eventos que codifican el movimiento del ratón, la activación de los botones del ratón, o el teclado. Los eventos son trasladados a solicitudes de servicio al modelo o a la vista. El usuario interactúa con el sistema únicamente a través de los controladores Estructura Estructura Imagen tomada de: Programming in Java using the MVC architecture, Afzaal Ahmad 19 Zeeshan Estructura Modelo – Contiene la funcionalidad central de la aplicación. – Encapsula los datos apropiados, y exporta procedimientos que ejecutan procesamiento específico de la aplicación. Los controladores invocan estos procedimientos en beneficio del usuario. – El modelo proporciona funciones para acceder a los datos que son usados por los componentes vista para adquirir los datos a ser presentados. Estructura Modelo – El mecanismo de propagación mantiene un registro de los componentes dependientes del modelo. – Todas las vistas y los controladores seleccionados registran su necesidad de ser informados sobre los cambios. – Los cambios al modelo disparan el mecanismo de propagación del cambio, quien es el único vínculo entre el modelo y las vistas y controladores. Estructura Vista – Presentan la información al usuario. – Diferentes vistas presentan la información del modelo en formas distintas. – Cada vista define un procedimiento de actualización que es activado por el mecanismo de propagación de cambios. – Cuando la actualización es invocada, una vista recupera los valores reales de los datos del modelo para ser presentados, y puestos en la pantalla. Estructura Vista – Durante la inicialización todas las vistas son asociadas con el modelo y registradas con el mecanismo de propagación de cambios. – Hay una relación uno a uno entre las vistas y los controladores. – Las vistas frecuentemente ofrecen funcionalidades que permiten a los controladores manipular la presentación, útil para operaciones que no afectan el modelo, como el desplazamiento. Estructura Controlador – Aceptan entradas del usuario como eventos. Cómo tales eventos son pasados al controlador depende de la interfaz gráfica. – Los eventos son transformados en solicitudes para el modelo o la vista asociada. – Si un comportamiento de un controlador depende del estado del modelo, el control se registra con el mecanismo de control de cambios, esto es útil cuando un cambio en el modelo activa o no una entrada en el menú. Estructura Estructura • Escenario 1. La entrada del usuario cambia el modelo y dispara el mecanismo de cambiopropagación. Controlador evento View Modelo servicio notificación actualizar obtener datos actualizar obtener datos vista actualizada vista actualizada desplegar Estructura • Escenario 2. Muestra como la triada MVC es inicializada. Implementación • Separar la funcionalidad esencial de la interacción humano-computador. • Implementar el mecanismo de cambio-propagación. • Diseñar e implementar las vistas. • Diseñar e implementar los controladores. • Diseñar e implementar la relación entre vistas y controladores. • Implementar: – La inicialización del MVC completo, – La creación de dinámica de vistas, – La controladores que capturan diferentes eventos, – La infraestructura jerárquica para vistas y controladores, – Componentes del sistema, con bajo acoplamiento. Consecuencias • Ventajas – Vistas múltiples del mismo modelo. La separación estricta del modelo de los componentes de la interfaz de usuario, permite que múltiples vistas sean implementadas usando un único modelo. – Vistas sincronizadas. El mecanismo de propagación del modelo asegura que todos los observadores conectados son notificados de cambios a los datos de la aplicación en el momento correcto. Esto sincroniza todos las vistas y controladores dependientes. Consecuencias • Ventajas – Vistas y controladores conectables. La separación conceptual de MVC permite intercambiar los objetos vista y controlador de un modelo. Los objetos de interfaz de usuario pueden ser sustituidos en tiempo de ejecución. – Intercambiabilidad de “look and feel”. Como el modelo es independiente de todo el código de la interfaz de usuario, el portar la aplicación a una nueva plataforma no afecta el núcleo funcional de la aplicación. – Framework potencial. Es posible basar un framework en este patrón Consecuencias • Desventajas – Incrementa la complejidad. No siempre seguir la estructura MVC es la mejor forma de construir una aplicación interactiva. GoF argumenta que usar componentes separados MVC para menús y elementos de texto incrementa la complejidad sin ganar flexibilidad. – Número potencialmente excesivo de actualizaciones. Si una única acción resulta en muchas actualizaciones, el modelo puede saltarse notificaciones innecesarias de cambios. Puede ser que no todas las vistas estén interesadas en cada cambio propagado por el modelo. Consecuencias • Desventajas – Conexión íntima entre vista y controlador. El controlador y la vista son independientes pero relacionados cercanamente, lo que tiende a ocultar su reutilización individual. Una vista puede ser usada sin su controlador y viceversa. – Acoplamiento de vistas y controladores al modelo. Tanto la vista como el controlador hacen llamadas directas al modelo. Esto implica que los cambios a la interfaz del modelo romperán el código de la vista y el controlador. Consecuencias • Desventajas – Ineficiente acceso a datos en la vista. Dependiendo de la interfaz del modelo, una vista puede necesitar hacer múltiples llamadas para obtener todos los datos que necesita presentar. Solicitud de datos innecesarios al modelo golpea el rendimiento si las actualizaciones son frecuentes. Usar un caché de datos en la vista mejora el tiempo de respuesta. – Inevitablemente se deben cambiar vista y controlador cuando se porte la aplicación. Todas las dependencias a la plataforma gráfica están encapsuladas en la vista y el controlador. Sin embargo, estos componentes también tienen código que es independiente de la plataforma. Cómo se implementa MVC en Java? • View • Controller • Model 34 View • AWT (Abstract Window Toolkit): Contiene todas las clases para crear interfaces de usuario y para pintar gráficas e imágenes. Es la base para las clases Swing. • Definido en el package java.awt • SWING: Es un conjunto de librerías para crear interfaces graficas de usuario (GUI) independiente de la plataforma. • Definido en el package javax.swing 35 Jerarquía AWT 0..* Component Tomada de: Java Programming Tutorial Programming Graphical User Interface (GUI) 36 Component La clase Component define datos y métodos que son relevantes para TODOS los componentes setBounds setSize setLocation setFont setEnabled setVisible setForeground -- colour setBackground -- colour 37 Container • Contiene componentes • Para que un componente se visualice se debe colocar en un Container • Container define todos los datos y métodos necesarios para manejar grupos de componentes add getComponent getMaximumSize getMinimumSize getPreferredSize remove removeAll 38 Jerarquía SWING Tomada de: Java Programming Tutorial Programming Graphical User Interface (GUI) 39 Componentes de la Vista • Containers : contenedores de componentes gráficos – Frame (JFrame): Posee titulo y bordes. – Panel (JPanel): provee un espacio de trabajo. – Window (JWindow): ventana sin bordes y sin barra de menú. 40 JFrame java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame 41 Ejemplo JFrame package Presentacion; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class VentanaPrincipal extends JFrame { private JPanel contentPane; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { VentanaPrincipal frame = new VentanaPrincipal(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public VentanaPrincipal() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); } /** * Launch the application. */ } 42 Controller • Se encarga de recibir los eventos del usuario y delegar al modelo la lógica de ejecución. • De acuerdo al resultado, invoca la vista necesaria para completar la solicitud. 43 Eventos en Java • Todo componente de la GUI puede generar eventos – Acciones del usuario sobre el componente – Temporizaciones – Cambios de estado, etc. • Modelo de Delegación – La responsabilidad de gestionar un evento que sucede en un componente (Fuente) la tiene otro objeto (Oyente) • Propagación de Eventos – El componente Fuente del evento invoca a un método del objeto Oyente, pasándole como un argumento un objeto que almacena toda la información relativa al evento 44 Fuentes 45 Oyentes (Listeners) de Eventos • Son objetos que implementan la interfaz correspondiente al tipo de evento a escuchar: – – – – ActionListener WindowListener MouseListener etc. • Las clases que extienden estas interfaces tienen que implementar TODOS los métodos de la interfaz – ¿Qué pasa si sólo nos interesa uno de los eventos? • Muchos métodos vacíos • Poca legibilidad • Solución: Adaptadores 46 Bibliografía • Pattern-Oriented Software Architecture: A System of Patterns, F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal. John Wiley & Sons, 1996