Introducción al Diseño con Patrones
Transcripción
Introducción al Diseño con Patrones
UNIVERSIDADE DA CORUÑA Departamento de Tecnoloxías da Información e as Comunicacións (TIC) Introducción al Diseño con Patrones Paula Montoto Castelao [email protected] Noviembre 2008 [Basado en la charla de Juan Raposo Santiago, curso 2007/08 (http://www.tic.udc.es/~jrs)] Índice • • • • • • Introducción Tipos de patrones Descripción de patrones Caso de estudio: diseño de una aplicación Web bancaria Unas palabras finales Referencias Noviembre 2008 Introducción al Diseño con Patrones 2 Introducción (1) • Diseñar software orientado a objetos es difícil. • Diseñar software reusable orientado a objetos es todavía más difícil. • Es difícil que un diseñador inexperto sea capaz de hacer un buen diseño. Conoce los principios básicos de la orientación a objetos (herencia, polimorfismo, etc.) y un lenguaje orientado a objetos. Pero no sabe cómo usar esos conocimientos de manera eficaz. • Sin embargo, un diseñador experto es capaz de hacer buenos diseños. Reutiliza soluciones de diseño que les han funcionado bien en el pasado para resolver problemas similares. Noviembre 2008 Introducción al Diseño con Patrones 3 Introducción (2) • La orientación a objetos propugna “no reinventar la rueda” en la pura codificación respecto de la resolución de problemas. ¿Por qué, entonces, reinventarla para el ataque genérico a problemas comunes de análisis, diseño e implementación? • Debe existir alguna forma de comunicar al resto de los “ingenieros” los resultados encontrados tras mucho esfuerzo por algunos de ellos. • Se necesita, al fin, algún esquema de documentación que permita tal comunicación. La mera documentación de líneas de código resulta insuficiente, pues únicamente fomenta el uso de la técnica de “copiar y pegar”. El tipo de los problemas y soluciones a documentar es muy variado • Programación/análisis/arquitectura/gestión/... Se necesita un formato de documentación único que aúne conceptualmente estos distintos tipos. Noviembre 2008 Introducción al Diseño con Patrones 4 Introducción (3) • Un patrón es una solución a un problema de diseño no trivial que es: Efectiva: ha sido válido para resolver el problema en diseños pasados. Reusable: la solución es la misma para problemas similares. • Un catálogo de patrones es un medio para comunicar la experiencia de forma efectiva, reduciendo lo que se conoce como “curva de aprendizaje” del diseño. Colección de patrones organizados que incluye: • Descripción completa de cada uno de los patrones • Modos de acceso a la colección de patrones. – Correspondencia entre un problema real y un patrón (o conjunto de patrones). Noviembre 2008 Introducción al Diseño con Patrones 5 Introducción (4) • Eric Gamma, Richard Helm, Ralph Johnson y John Vlissides publicaron el primer catálogo de patrones en el ámbito del software en 1994. Design Patterns: Elements of Reusable Object-Oriented Software. También conocido como GoF (“Gang of Four”). Y desde entonces, se han publicado muchos otros catálogos. Fue la primera vez que se documentó el conocimiento que usaban los expertos para resolver problemas de diseño. Se inspiraron en el trabajo de Christopher Alexander, que había documentado patrones en el ámbito de la arquitectura. • “Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno, para describir después el núcleo de la solución a ese problema, de tal manera que esa solución pueda ser usada más de un millón de veces sin hacerlo siquiera dos veces de la misma forma.” – Christopher Alexander Noviembre 2008 Introducción al Diseño con Patrones 6 Introducción (y 5) Contexto Solución Problema • Esencia: establecer parejas Problema – Solución. El contexto explica bajo qué circunstancias la solución es aplicable al problema. El contexto resalta una serie de factores que deben ser abordados por una solución útil al problema. • Ventajas del diseño con patrones: Permiten reusar soluciones probadas. Facilitan la comunicación entre diseñadores. • Establecen un marco de referencia: terminología, justificación. • Los patrones tienen nombres estándar. Facilitan el aprendizaje al diseñador inexperto. Noviembre 2008 Introducción al Diseño con Patrones 7 Aportaciones de los Patrones de Diseño • Permiten identificar a los objetos apropiados de una manera mucho más sencilla. En la programación orientada a objetos resulta complicado descomponer el sistema en objetos (encapsulación, granularidad, dependencias, flexibilidad, reusabilidad, etc.). • • • • • • Permiten determinar la granularidad de los objetos. Ayudan a especificar las interfaces, identificando los elementos clave en las interfaces y las relaciones existentes entre distintas interfaces. Facilitan la especificación de la implementaciones. Ayudan a reutilizar código, facilitando la decisión entre "herencia o composición" (favorece la composición sobre la herencia y hace uso de la delegación). Relacionan estructuras en tiempo de compilación y en tiempo de ejecución. Permiten hacer un diseño preparado para el cambio. Noviembre 2008 Introducción al Diseño con Patrones 8 Tipos de patrones (1) • Existen patrones para las distintas actividades que hay que realizar en un proyecto (análisis, diseño, implementación, etc.) Este seminario se centra en los relativos al diseño. • Existen patrones independientes del dominio y otros específicos a un dominio concreto. Ej.: Los patrones del GoF son independientes del dominio. Ej.: Los patrones publicados en http://java.sun.com/blueprints/patterns/index.html son aplicables al desarrollo de aplicaciones empresariales (persistencia, tecnologías Web, etc.) con Java EE (la plataforma empresarial de Java) Noviembre 2008 Introducción al Diseño con Patrones 9 Tipos de patrones (2) • Pattern-Oriented Software Architecture: A System of Patterns (F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal, 1996). También conocido como The POSA Book. Fue el primer libro en hacer una clasificación de patrones: • Patrones arquitectónicos [Diseño]. • Patrones de diseño [Diseño]. • Idiomas [Implementación]. • Patrones arquitectónicos: Aconsejan la arquitectura global que debe seguir una aplicación. Ej.: El patrón Model-View-Controller (MVC) aconseja la arquitectura global que debe tener una aplicación interactiva. Noviembre 2008 Introducción al Diseño con Patrones 10 Tipos de patrones (y 3) • Patrones de diseño: Explican cómo resolver un problema concreto de diseño. El patrón “Data Access Object” (DAO) permite abstraer y encapsular los accesos a un repositorio de datos (ej.: BD relacional, BD orientada a objetos, ficheros planos, etc.) • Idiomas: Explican cómo resolver un problema particular de implementación con una tecnología concreta. Ej.: ¿Cómo comparar objetos correctamente en Java? • Correcta redefinición de equals() y hashCode(). Noviembre 2008 Introducción al Diseño con Patrones 11 Descripción de patrones • Cada catálogo de patrones utiliza una plantilla para describir sus patrones. No existen plantillas estándar. • Ejemplo: plantilla para patrones de diseño [GoF] Nombre y clasificación. • Creación, estructura o comportamiento. Intención. • Descripción de lo que se pretende conseguir con el patrón. También Conocido Como. • Otros nombres del mismo patrón. Motivación. • Escenario que presenta un problema de diseño. • Solución para el escenario utilizando el patrón. Aplicabilidad. • Situaciones en las cuales se puede aplicar el patrón. Noviembre 2008 Introducción al Diseño con Patrones 12 Descripción de Patrones (2) Estructura. • Descripción gráfica de los comportamientos, acciones y relaciones de los objetos que participan en el patrón – Diagrama de clases. – Diagrama de colaboración. Participantes. • Clases y objetos participantes que componen el patrón. • Responsabilidades. Colaboraciones entre participantes. • Relaciones e interacciones entre los participantes de un patrón. Consecuencias. • Ventajas e inconvenientes que pueden derivarse del uso del patrón. Implementación. • Técnicas y peligros que pueden presentarse al implementar el patrón. Noviembre 2008 Introducción al Diseño con Patrones 13 Descripción de Patrones (y 3) Código de ejemplo. • Planteamiento de código práctico referido a un ejemplo (o ejemplos) suficientemente representativo del uso del patrón. Usos conocidos. • Ejemplos del patrón en sistemas reales. Patrones relacionados. • Referencias a otros patrones que bien son directamente utilizados por el descrito o bien representan soluciones complementarias o suplementarias del mismo. Noviembre 2008 Introducción al Diseño con Patrones 14 Clasificación de Patrones (GoF 1) • Clasificación de los patrones de diseño según su propósito. Patrones de creación: • Abstraen la forma en la que se crean los objetos, permitiendo tratar las clases a crear de forma genérica, dejando para más tarde la decisión de qué clases crear o cómo crearlas. • Prototype, Singleton, Factory Method, Abstract Factory, ... Patrones estructurales: • Se ocupan de cómo se utilizan clases y objetos para componer estructuras de mayor tamaño. – Lo fundamental son las relaciones de uso entre los objetos, y, éstas están determinadas por las interfaces que soportan los objetos. – Estudian cómo se relacionan los objetos en tiempo de ejecución y sirven para diseñar las interconexiones entre los objetos. • Composite, Proxy, Facade, Decorator, ... Noviembre 2008 Introducción al Diseño con Patrones 15 Clasificación de Patrones (GoF y 2) • Clasificación de los patrones de diseño según su propósito. Patrones de comportamiento: • Se refieren a los algoritmos y a la asignación de responsabilidades entre objetos. – Los patrones de comportamiento estudian las relaciones entre llamadas entre los diferentes objetos, normalmente ligados con la dimensión temporal. • Chain of Responsability, State, Strategy, Visitor, Observer, Template Method, Memento, ... Noviembre 2008 Introducción al Diseño con Patrones 16 Antipatrones • Los patrones ofrecen una forma de resolver un problema típico; los antipatrones muestran formas de enfrentarse a problemas con consecuencias negativas conocidas. • Los antipatrones se basan en la idea de que puede resultar más fácil detectar a priori fallos en el desarrollo del proyecto que elegir el camino correcto, o lo que es lo mismo, descartar las alternativas incorrectas nos puede ayudar a la elección de la mejor alternativa. • Al documentar los antipatrones, además de los patrones de diseño, se dan argumentos a los diseñadores de sistemas para no escoger malos caminos, partiendo de documentación disponible en lugar de simplemente la intuición. • Ejemplo típico: The Blob (“clases gigantes”). Noviembre 2008 Introducción al Diseño con Patrones 17 Caso de estudio: Diseño de una aplicación Web bancaria (1) • Caso de estudio: MiniBank. Un sencillo ejemplo de una aplicación Web bancaria. • ¿Cuáles son los objetivos? Ver ejemplos de patrones aplicados a un caso. • Patrones arquitectónicos: MVC. • Patrones de diseño: Transfer Object, DAO, Factory, Facade y Command. Obtener una visión global de los principios básicos de diseño de una aplicación Web con Java EE y Apache Struts. Lo más importante: captar la idea de lo que significa diseñar con patrones. • ¿Cuáles no son los objetivos? Estudiar el diseño completo de MiniBank. Obtener una visión detallada de los principios básicos de diseño de una aplicación Web con Java EE y Apache Struts. Noviembre 2008 Introducción al Diseño con Patrones 18 Caso de estudio: Diseño de una aplicación Web bancaria (2) Casos de uso implementados en MiniBank • Crear una cuenta bancaria. Datos de una cuenta: identificador de la cuenta, identificador del usuario, balance. El identificador de la cuenta se genera automáticamente. • • • • • • • Buscar una cuenta a partir de su identificador. Añadir una cantidad de dinero a una cuenta. Retirar una cantidad de dinero de una cuenta. Buscar todas las cuentas de un usuario. Eliminar una cuenta. Hacer una transferencia de dinero de una cuenta a otra. Buscar todas las operaciones que se han hecho sobre una cuenta entre dos fechas. Datos de una operación: identificador de la operación, identificador de la cuenta, fecha, tipo (añadir/retirar), cantidad de dinero. Noviembre 2008 Introducción al Diseño con Patrones 19 Caso de estudio: Diseño de una aplicación Web bancaria (3) MiniBank: búsqueda de una cuenta a partir de su identificador Noviembre 2008 Introducción al Diseño con Patrones 20 Caso de estudio: Diseño de una aplicación Web bancaria (4) MiniBank: añadir dinero a una cuenta Noviembre 2008 Introducción al Diseño con Patrones 21 Caso de estudio: Diseño de una aplicación Web bancaria (5) Objetos del dominio User 1 1..n AccountOperation Account - accountIdentifier : Long - userIdentifier : Long - balance : double 1 0..n - accountOperationIdentifier : Long accountIdentifier : Long date : java.util.Calendar type : byte amount : double • NOTA: Un objeto del dominio es uno que corresponde a un concepto del mundo real. Noviembre 2008 Introducción al Diseño con Patrones 22 Caso de estudio: Diseño de una aplicación Web bancaria (6) Arquitectura global de la aplicación • Problema Deseamos que haya una separación entre la interfaz de usuario y la lógica de negocio. • Interfaz de usuario: las clases y/o artefactos que reciben los eventos del usuario y generan las respuestas visuales. • Lógica de negocio: las clases que implementan los casos de uso de manera independiente de la interfaz de usuario. Ventajas • Si se decide cambiar de tipo de interfaz de usuario en un futuro, la lógica de negocio se puede reutilizar. – La lógica de negocio es independiente de la interfaz de usuario. • Se favorece la separación de roles en el equipo de desarrollo. – Personas que desarrollan la interfaz de usuario. – Personas que desarrollan la lógica de negocio. Noviembre 2008 Introducción al Diseño con Patrones 23 Caso de estudio: Diseño de una aplicación Web bancaria (7) Arquitectura global de la aplicación • Solución Patrón Model-View-Controller (MVC) • Estructurar el software en 3 capas. – Modelo: lógica de negocio – Vista (interfaz de usuario): las clases y/o artefactos que generan las repuestas visuales – Controlador (interfaz de usuario): las clases que reciben los eventos del usuario, invocan al modelo, y finalmente a la vista. (5) Navegador (1) MiniBank Vista (4) Controlador (2) Modelo (3) BD Servidor de aplicaciones Web JavaEE (ej.: Apache Tomcat) Noviembre 2008 Introducción al Diseño con Patrones 24 Caso de estudio: Diseño de una aplicación Web bancaria (8) Diseño de la capa modelo - Problemas • Problema 1: ¿Cómo representar el estado de los objetos del dominio (persistentes)? • Problema 2: ¿Cómo implementar la persistencia de los objetos del dominio de forma independiente del repositorio de datos (BD relacional, BD orientada a objetos, etc.)? • Problema 3: ¿Cómo proporcionar una vista sencilla de la capa modelo a la capa controlador? Noviembre 2008 Introducción al Diseño con Patrones 25 • Caso de estudio: Diseño de una aplicación Web bancaria (9) Diseño de la capa modelo – Solución al problema 1 Ejemplo para el caso de los datos de una cuenta bancaria < < Interfac e> > S eria lizable (from io) A cc o untV O - ac countIdentifier : Long - us erIdenti fier : Long - balanc e : double + + + + + + A c countV O(ac countIdentifier : Long, userIdentifier : Long, balanc e : double) getA c countIdentifier() : Long getUs erIdentifier() : Long getB alanc e() : double setB alanc e(newB alance : double) : void toS tring() : S tring Noviembre 2008 Introducción al Diseño con Patrones 26 Caso de estudio: Diseño de una aplicación Web bancaria (10) Diseño de la capa modelo – Solución al problema 1 • Patrón Transfer Object (TO). Anteriormente conocido como Value Object (VO). Representa estado/valor. Atributos privados => estado. Métodos get para acceder a los atributos. Métodos set para los atributos modificables. Quizás un método toString para imprimir el estado. • Útil para depuración y pruebas de unidad. Implementa java.io.Serializable si se precisa enviar por la red. Fuente: http://java.sun.com/blueprints/patterns/index.html Noviembre 2008 Introducción al Diseño con Patrones 27 Caso de estudio: Diseño de una aplicación Web bancaria (11) Diseño de la capa modelo – Solución al problema 2 • Ejemplo para el caso de los datos de una cuenta bancaria S QLA c c ountDA OFac tory << s tatic >> - daoClas s : Clas s < <us e> > ConfigurationP aram eters M anager (from c onfiguration) - S QLA c c ountDA OFactory () < < s tatic > > + getDA O() : S QLA c c ountDA O < <ins tantiate> > << Interfac e> > S QLA cc ountDA O + + + + + + c reate(c onnec tion : Connec tion, ac c ountV O : A c c ountV O) : A c c ountV O ex is ts (c onnec tion : Connec tion, ac c ountIdentifier : Long) : boolean find(c onnec tion : Connec tion, ac countIdentifier : Long) : A c c ountV O findB y Us erIdentifier(c onnec tion : Connec tion, us erIdentifier : Long, s tartIndex : int, c ount : int) : Lis t update(c onnec tion : Connec tion, ac c ountV O : A c c ountV O) : void rem ove(c onnec tion : Connec tion, ac c ountIdentifier : Long) : void Implementaciones particulares Noviembre 2008 Introducción al Diseño con Patrones 28 Caso de estudio: Diseño de una aplicación Web bancaria (12) Diseño de la capa modelo – Solución al problema 2 • Recuperación de los datos de una cuenta a partir de su identificador /* Get a connection. */ Connection connection = ... /* Get dao. */ SQLAccountDAO dao = SQLAccountDAOFactory.getDAO(); /* * Get the AccountVO corresponding to accountIdentifier * 12345. */ Long accountIdentifier = new Long(12345); AccountVO accountVO = dao.find(connection, accountIdentifier); Noviembre 2008 Introducción al Diseño con Patrones 29 Caso de estudio: Diseño de una aplicación Web bancaria (13) Diseño de la capa modelo – Solución al problema 2 • Patrón Data Access Object (DAO). Ejemplo: SQLAccountDAO. Define una interfaz con operaciones para insertar, borrar, actualizar y recuperar los objetos persistentes de un tipo. La interfaz oculta el tipo de repositorio de datos. • Por motivos de sencillez, la interfaz SQLAccountDAO deja claro en su nombre (prefijo SQL) que las implementaciones trabajarán contra una BD relacional (porque las operaciones reciben un objeto java.sql.Connection). • Aún así, oculta la base de datos relacional concreta que se use (Oracle, SQL Server, PostgreSQL, MySQL, etc.) , que para ciertos aspectos pueden usar dialectos de SQL diferentes (ej.: generación de identificadores numéricos). Se proporcionan tantas implementaciones de la interfaz como repositorios de datos distintos se quieran soportar. Fuente: http://java.sun.com/blueprints/patterns/index.html • Es un caso particular del patrón Strategy [GoF]. Noviembre 2008 Introducción al Diseño con Patrones 30 Caso de estudio: Diseño de una aplicación Web bancaria (14) Diseño de la capa modelo – Solución al problema 2 • Patrón Factory. Ejemplo: SQLAccountDAOFactory. Permite crear objetos de una misma familia (implementan la misma interfaz) sin que el código dependa de los nombres concretos de las clases. SQLAccountDAOFactory • getDAO() – Lee de la configuración (mediante ConfigurationParametersManager) cuál es nombre de la clase concreta que implementa SQLAccountDAO. – Usando la API de Java (java.lang.Class) carga la clase en memoria y crea una instancia. • Si se decide cambiar de base de datos, sólo es preciso crear una nueva implementación de SQLAccountDAO (en caso de que no sea posible dar una implementación genérica) y modificar el fichero de configuración. – Plug-n-play • Fuente: GoF Noviembre 2008 Introducción al Diseño con Patrones 31 Caso de estudio: Diseño de una aplicación Web bancaria (15) Diseño de la capa modelo – Solución al problema 3 A c c ountFac adeDelegateFac tory < < us e> > < < static> > - delegateClass : Class ConfigurationP aram eters M anager (from configuration) < < static> > + getDelegate() : A c c ountFac adeDelegate << ins tantiate> > << Interface> > A cc ountFa c adeDelegate + + + + + + + + createA c count(ac countV O : A cc ountV O) : A c c ountV O findA c c ount(ac c ountIdentifier : Long) : A c c ountV O addToA c count(ac countIdentifier : Long, am ount : double) : void withdrawFrom A c count(ac countIdentifier : Long, am ont : double) : void findA c c ounts B y UserIdentifier(userIdentifier : Long, s tartIndex : int, c ount : int) : A c countChunk V O rem oveA cc ount(acc ountIdentifier : Long) : void transfer(sourceA c countIdentifier : Long, des tinationA c c ountIdentifier : Long, am ount : double) : void findA c c ountOperationsB y Date(ac c ountIdentifier : Long, startDate : Calendar, endDate : Calendar, s tartIndex : int, c ount : int) : A c countOperationChunk V O Implementaciones particulares Noviembre 2008 Introducción al Diseño con Patrones 32 Caso de estudio: Diseño de una aplicación Web bancaria (16) Diseño de la capa modelo – Solución al problema 3 • Patrón Facade. Define una interfaz de alto nivel que simplifica el uso de un subsistema. Fuentes: GoF. En el caso de la capa modelo: • Session Facade + Business Delegate (http://java.sun.com/blueprints/patterns/index.html ) • Una fachada representa un conjunto de casos de uso lógicamente relacionados. • Cada operación corresponde a un caso de uso. • La declaración de las operaciones oculta la tecnología usada en su implementación. • Puede usarse una factoría para crear instancias. – Permite seleccionar implementaciones alternativas. Noviembre 2008 Introducción al Diseño con Patrones 33 Caso de estudio: Diseño de una aplicación Web bancaria (17) Diseño de la capa modelo – Solución al problema 3 • Patrón Facade (cont) • En el caso de MiniBank, sólo hay una fachada (AccountFacadeDelegate). • En una aplicación real normalmente hay más de una fachada. • Ej.: si ampliásemos MiniBank para contemplar la consulta del catálogo de productos que vende el banco, podríamos tener un ProductCatalogFacade (que ofrece operaciones para: encontrar productos por identificador, categoría, palabras clave, etc.; recuperar todas las categorías, etc.). Noviembre 2008 Introducción al Diseño con Patrones 34 Caso de estudio: Diseño de una aplicación Web bancaria (18) Diseño de la capa modelo – Solución al problema 3 • Implementación de addToAccount :AccountFacadeDelegate :SQLAccountDAOFactory :SQLAccountDAO :SQLAccountOperationDAOFactory :SQLAccountOperationDAO 1: addToAccount 1.1: getDAO 1.2: find 1.3: update 1.4: getDAO 1.5: create Noviembre 2008 Introducción al Diseño con Patrones 35 Caso de estudio: Diseño de una aplicación Web bancaria (19) Diseño de la capa modelo – Solución al problema 3 • Implementación de addToAccount (cont) << Get connection >> << Start transaction >> /* Find account. */ SQLAccountDAO accountDAO = SQLAccountDAOFactory.getDAO(); AccountVO accountVO = accountDAO.find(connection, accountIdentifier); /* Set new balance. */ double currentBalance = accountVO.getBalance(); double newBalance = currentBalance + amount; accountVO.setBalance(newBalance); accountDAO.update(connection, accountVO); /* Register account operation. */ SQLAccountOperationDAO accountOperationDAO = SQLAccountOperationDAOFactory.getDAO(); AccountOperationVO accountOperationVO = new AccountOperationVO(new Long(-1), accountIdentifier, Calendar.getInstance(), ADD_OPERATION, amount); accountOperationDAO.create(connection, accountOperationVO); << Commit transaction >> << Close connection >> Noviembre 2008 Introducción al Diseño con Patrones 36 Caso de estudio: Diseño de una aplicación Web bancaria (20) Diseño de la capas controlador y vista en MiniBank • Capa vista. JavaServer Pages. • Una página JSP permite generar el markup (en este caso, HTML) que se le va a enviar al navegador (un formulario, el resultado de un caso de uso, etc.). Las librerías de tags JSP estándar y la de HTML de Struts. • Con estas librerías y una buena arquitectura MVC, no se requieren conocimientos de programación para crear las páginas JSP (sólo conocimientos de HTML y de los tags de estas dos librerías). • Aplicación del Patrón View Helper (Core J2EE Patterns). • Capa controlador Apache Struts. • Proporciona un framework para implementar la capa controlador de la aplicación Web. • Proporciona la mencionada librería de tags de HTML (capa vista). Noviembre 2008 Introducción al Diseño con Patrones 37 Caso de estudio: Diseño de una aplicación Web bancaria (21) Diseño de la capa controlador • Diferencia entre un framework y una librería Librería: • Conjunto de clases a las que el desarrollador invoca directamente (normalmente a un subconjunto de ellas, las que definen la API de la librería). – El código de la aplicación invoca a la librería Framework: • Conjunto de clases que implementan de manera parcial la arquitectura de una aplicación (o parte de la arquitectura). – Implementan una colección de patrones. • Para completar la arquitectura, el desarrollador tiene que implementar algunas interfaces y/o extender algunas clases abstractas. – El framework invoca al código de la aplicación • También suelen tener una parte que actúa como librería. Noviembre 2008 Introducción al Diseño con Patrones 38 Caso de estudio: Diseño de una aplicación Web bancaria (22) Diseño de la capa controlador Struts RequestProcessor # actions : Map Action 0..n + execute + process FindAccountsAction TransferAction ... MiniBank Noviembre 2008 Introducción al Diseño con Patrones 39 Caso de estudio: Diseño de una aplicación Web bancaria (23) Diseño de la capa controlador • El anterior esquema corresponde a una aplicación del patrón Command. Fuente: GoF • RequestProcessor Recibe una petición HTTP. Invoca al método execute de la acción correspondiente (todas extienden de Action), cuya implementación: • Accede a los parámetros de la petición HTTP (ej.: los campos de un formulario). • Invoca una operación de la fachada del modelo. • Selecciona una página JSP para generar la respuesta y le pasa el resultado de la operación. Pasa el control a la página JSP seleccionada por la acción. • La página JSP genera la respuesta. Noviembre 2008 Introducción al Diseño con Patrones 40 Caso de estudio: Diseño de una aplicación Web bancaria (24) Ejecución de un caso de uso :FindAccounts.jspx :RequestProcessor :FindAccountsAction :AccountFacadeDelegateFactory :AccountFacadeDelegate :AccountDetails.jspx 1: clic en el enlace “Find accounts” 2: clic en el botón “Find” 2.1: execute 2.1.1: getDelegate 2.1.2: findAccount 2.1.3: foward View Noviembre 2008 Controller Model Introducción al Diseño con Patrones View 41 Caso de estudio: Diseño de una aplicación Web bancaria (25) Ejemplo de página JSP (capa vista): AccountDetails.jspx <table xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" xmlns:c="http://java.sun.com/jsp/jstl/core" class="accountDetails"> <jsp:output omit-xml-declaration="true"/> <tr> <th><fmt:message key="AccountAttributes.accountIdentifier"/></th> <td><c:out value="${requestScope.account.accountIdentifier}"/></td> </tr> <tr> <th><fmt:message key="AccountAttributes.userIdentifier"/></th> <td><c:out value="${requestScope.account.userIdentifier}"/></td> </tr> <tr> <th><fmt:message key="AccountAttributes.balance"/></th> <td><fmt:formatNumber value="${requestScope.account.balance}"/></td> </tr> </table> Noviembre 2008 Introducción al Diseño con Patrones 42 Caso de estudio: Diseño de una aplicación Web bancaria (y 26) Resumen del método de diseño seguido en MiniBank • Modelo: Un TO por cada objeto persistente. Un DAO (+ factoría) por cada objeto persistente. Definir fachadas (+ factorías) del modelo. • Cada fachada agrupa a un conjunto de casos de uso relacionados. • Controlador: Una acción (comando) por cada caso de uso. • Vista: Por cada caso de uso: una página JSP para el formulario de entrada y/o una página JSP para generar la salida. Noviembre 2008 Introducción al Diseño con Patrones 43 Unas palabras finales • Diseñar con patrones NO ES “Aplico todos los patrones que yo sé en el diseño de mi software”. • Diseñar con patrones ES “Resuelvo cada problema de diseño que me surge con un patrón apropiado”. • OJO, un uso excesivo de patrones fácilmente terminará en una arquitectura excesivamente compleja. Hay que aplicar patrones para resolver “problemas de verdad” y no problemas “filosóficos”. Principio “KISS” (Keep It Simple Stupid, Keep It Short and Simple, …). • Recomienda el desarrollo empleando partes sencillas y comprensibles, rechazando lo enrevesado e innecesario en el desarrollo de sistemas complejos en ingeniería. Noviembre 2008 Introducción al Diseño con Patrones 44 Referencias (1) • Libros: E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addisson-Wesley, 1994 J. Crupi, D. Alur, D. Malks, Core J2EE Patterns, 2nd edition, Prentice Hall, 2003 F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal, Pattern-Oriented Software Architecture: A System of Patterns, Wiley & Sons, 1996 J. W. Cooper, Java Design Patterns: A Tutorial, AddisonWesley, 2000 M. Grand, Patterns in Java: Catalogue of Reusable Design Patterns Illustrated with UML - Vol 1, Wiley & Sons, 2002 • Sitios Web: http://hillside.net/patterns http://java.sun.com/blueprints/patterns/index.html Noviembre 2008 Introducción al Diseño con Patrones 45 Referencias (y 2) • Asignaturas en la Facultad de Informática de la UDC. Diseño de Sistemas Informáticos: • • • • http://www.lfcia.org/dsi 4º Ingeniería Informática. Se centra en los patrones del GoF. Transparencias y código disponibles. Integración de Sistemas: • http://www.tic.udc.es/~fbellas/teaching/is-2007-2008 • 5º Ingeniería Informática. • Se centra en el diseño e implementación de aplicaciones empresariales con Java EE. • Transparencias y código disponibles. • Transparencias de esta charla disponibles en la página de la asignatura PFC Noviembre 2008 Introducción al Diseño con Patrones 46