Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Intro Patrones
Intro Patrones
ndice
Introduccin Tipos de patrones Descripcin de patrones Caso de estudio: diseo de una aplicacin Web bancaria Unas palabras finales Referencias
Introduccin (1)
Disear software orientado a objetos es difcil Disear software reusable orientado a objetos es todava ms difcil Es difcil que un diseador inexperto sea capaz de hacer un buen diseo
Conoce los principios bsicos de la orientacin a objetos (herencia, polimorfismo, etc.) y un lenguaje orientado a objetos Pero no sabe cmo usar esos conocimientos de manera eficaz
Introduccin (2)
Reusan soluciones de diseo que les han funcionado bien en el pasado para resolver problemas similares
Efectiva: ha valido para resolver el problema en diseos pasados Reusable: la solucin es la misma para problemas similares
Introduccin (3)
Eric Gamma, Richard Helm, Ralph Johnson y John Vlissides publicaron el primer catlogo de patrones en el mbito del software en 1994
Design Patterns: Elements of Reusable Object-Oriented Software Tambin conocido como GoF (Gang of Four)
Y desde entonces, se han publicado muchos otros catlogos Fue la primera vez que se document el conocimiento que usaban los expertos para resolver problemas de diseo Se inspiraron en el trabajo de Christopher Alexander, que haba documentado patrones en el mbito de la arquitectura
Introduccin (y 4)
Existen patrones para las distintas actividades que hay que realizar en un proyecto (anlisis, diseo, implementacin, etc.)
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, tecnologas Web, etc.) con J2EE (la plataforma empresarial de Java)
Tambin conocido como The POSA Book Fue el primer libro en hacer una clasificacin de patrones
Patrones arquitectnicos
Aconsejan la arquitectura global que debe seguir una aplicacin Ej.: El patrn Model-View-Controller (MVC) aconseja la arquitectura global que debe tener una aplicacin interactiva
Tipos de patrones (y 3)
Patrones de diseo
Explican cmo resolver un problema concreto de diseo El patrn 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.) Explican cmo resolver un problema particular de implementacin con una tecnologa concreta Ej.: Cmo comparar objetos correctamente en Java?
Idiomas
Descripcin de patrones
Cada catlogo de patrones utiliza una plantilla para describir sus patrones
No existen plantillas estndar Nombre y clasificacin (creacin, estructura o comportamiento) Intencin Tambin conocido como Motivacin Aplicabilidad Estructura Participantes Colaboraciones Consecuencias Implementacin Cdigo de ejemplo Usos conocidos Patrones relacionados
Un sencillo ejemplo de una aplicacin Web bancaria Ver ejemplos de patrones aplicados a un caso
Patrones arquitectnicos: MVC Patrones de diseo: Transfer Object, DAO, Factory, Facade y Command
Obtener una visin global de los principios bsicos de diseo de una aplicacin Web con J2EE y Jakarta Struts Lo ms importante: captar la idea de lo que significa disear con patrones Estudiar el diseo completo de MiniBank Obtener una visin detallada de los principios bsicos de diseo de una aplicacin Web con J2EE y Jakarta Struts
Caso de estudio: diseo de una aplicacin Web bancaria (2) Casos de uso implementados en MiniBank
Datos de una cuenta: identificador de la cuenta, identificador del usuario, balance El identificador de la cuenta se genera automticamente
Buscar una cuenta a partir de su identificador Aadir 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 operacin: identificador de la operacin, identificador de la cuenta, fecha, tipo (aadir/retirar), cantidad de dinero
Caso de estudio: diseo de una aplicacin Web bancaria (3) MiniBank: bsqueda de una cuenta a partir de su identificador
Caso de estudio: diseo de una aplicacin Web bancaria (4) MiniBank: aadir dinero a una cuenta
Caso de estudio: diseo de una aplicacin Web bancaria (5) Objetos del dominio
User 1 1..n Account - accountIdentifier : Long - userIdentifier : Long - balance : double 1 0..n -
AccountOperation 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
Caso de estudio: diseo de una aplicacin Web bancaria (6) Arquitectura global de la aplicacin
Problema
Deseamos que haya una separacin entre la interfaz de usuario y la lgica de negocio
Interfaz de usuario: las clases y/o artefactos que reciben los eventos del usuario y generan las respuestas visuales Lgica de negocio: las clases que implementan los casos de uso de manera independiente de la interfaz de usuario Si se decide cambiar de tipo de interfaz de usuario en un futuro, la lgica de negocio se puede reusar
Ventajas
La lgica de negocio es independiente de la interfaz de usuario Personas que desarrollan la interfaz de usuario Personas que desarrollan la lgica de negocio
Caso de estudio: diseo de una aplicacin Web bancaria (7) Arquitectura global de la aplicacin
Solucin
Modelo: lgica 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
MiniBank Vista (4) Controlador (2) Modelo Servidor de aplicaciones Web J2EE (ej.: Jakarta Tomcat) (3) BD
(5) (1)
Navegador
Caso de estudio: diseo de una aplicacin Web bancaria (8) Diseo de la capa modelo - Problemas
Problema 1: Cmo representar el estado de los objetos del dominio (persistentes)? Problema 2: Cmo implementar la persistencia de los objetos del dominio de forma independiente del repositorio de datos (BD relacional, BD orientada a objetos, etc.)? Problema 3: Cmo proporcionar una vista sencilla de la capa modelo a la capa controlador?
Caso de estudio: diseo de una aplicacin Web bancaria (9) Diseo de la capa modelo Solucin al problema 1
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
Caso de estudio: diseo de una aplicacin Web bancaria (10) Diseo de la capa modelo Solucin al problema 1
Anteriormente conocido como Value Object (VO) Representa estado/valor Atributos privados => estado Mtodos get para acceder a los atributos Mtodos set para los atributos modificables Quizs un mtodo toString para imprimir el estado
Caso de estudio: diseo de una aplicacin Web bancaria (11) Diseo de la capa modelo Solucin al problema 2
<< 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
Caso de estudio: diseo de una aplicacin Web bancaria (12) Diseo de la capa modelo Solucin al problema 2
Caso de estudio: diseo de una aplicacin Web bancaria (13) Diseo de la capa modelo Solucin al problema 2
Ejemplo: SQLAccountDAO Define un interfaz con operaciones para insertar, borrar, actualizar y recuperar los objetos persistentes de un tipo El interfaz oculta el tipo de repositorio de datos
NOTAS
Por motivos de sencillez (se explican ms adelante), el interfaz SQLAccountDAO deja claro en su nombre (prefijo SQL) que las implementaciones trabajarn contra una BD relacional (porque las operaciones reciben un objeto java.sql.Connection) An 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.: generacin de identificadores numricos)
Se proporcionan tantas implementaciones del interfaz como repositorios de datos distintos se quieran soportar Fuente: http://java.sun.com/blueprints/patterns/index.html
Caso de estudio: diseo de una aplicacin Web bancaria (14) Diseo de la capa modelo Solucin al problema 2
Patrn Factory
Ejemplo: SQLAccountDAOFactory Permite crear objetos de una misma familia (implementan el mismo interfaz) sin que el cdigo dependa de los nombres concretos de las clases SQLAccountDAOFactory
getDAO()
Lee de la configuracin (mediante ConfigurationParametersManager) cul es nombre de la clase concreta que implementa SQLAccountDAO Usando el API de Java (java.lang.Class) carga la clase en memoria y crea una instancia
Si se decide cambiar de base de datos, slo es preciso crear una nueva implementacin de SQLAccountDAO (en caso de que no sea posible dar una implementacin genrica) y modificar el fichero de configuracin
Plug-n-play
Fuente: GoF
Caso de estudio: diseo de una aplicacin Web bancaria (15) Diseo de la capa modelo Solucin al problema 3
A c c ountFac adeDelegateFac tory < < static> > - delegateClass : Class < < static> > + getDelegate() : A c c ountFac adeDelegate
<< 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
Caso de estudio: diseo de una aplicacin Web bancaria (16) Diseo de la capa modelo Solucin al problema 3
Patrn 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 lgicamente relacionados Cada operacin corresponde a un caso de uso La declaracin de las operaciones oculta la tecnologa usada en su implementacin Puede usarse una factora para crear instancias
En el caso de MiniBank, slo hay una fachada (AccountFacadeDelegate) En una aplicacin real normalmente hay ms de una fachada Ej.: si amplisemos MiniBank para contemplar la consulta del catlogo de productos que vende el banco, podramos tener un ProductCatalogFacade (que ofrece operaciones para: encontrar productos por identificador, categora, palabras clave, etc.; recuperar todas las categoras, etc.)
Caso de estudio: diseo de una aplicacin Web bancaria (17) Diseo de la capa modelo Solucin al problema 3
Implementacin de addToAccount
:SQLAccountDAOFactory
:AccountFacadeDelegate 1: addToAccount 1.1: getDAO 1.2: find 1.3: update 1.4: getDAO 1.5: create
:SQLAccountDAO
:SQLAccountOperationDAOFactory
:SQLAccountOperationDAO
Caso de estudio: diseo de una aplicacin Web bancaria (18) Diseo de la capa modelo Solucin al problema 3
<< 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 >>
Caso de estudio: diseo de una aplicacin Web bancaria (19) Diseo de la capas controlador y vista en MiniBank
Capa vista
JavaServer Pages
Una pgina 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.) Con estas libreras y una buena arquitectura MVC, no se requieren conocimientos de programacin para crear las pginas JSP (slo conocimientos de HTML y de los tags de estas dos libreras)
Capa controlador
Jakarta Struts
Proporciona un framework para implementar la capa controlador de la aplicacin Web Proporciona la mencionada librera de tags de HTML (capa vista)
Caso de estudio: diseo de una aplicacin Web bancaria (20) Diseo de la capa controlador
Librera
Conjunto de clases a las que el desarrollador invoca directamente (normalmente a un subconjunto de ellas, las que definen el API de la librera)
Framework
Conjunto de clases que implementan de manera parcial la arquitectura de una aplicacin (o parte de la arquitectura)
Para completar la arquitectura, el desarrollador tiene que implementar algunos interfaces y/o extender algunas clases abstractas
Caso de estudio: diseo de una aplicacin Web bancaria (21) Diseo de la capa controlador
Action + execute
FindAccountsAction
TransferAction
...
MiniBank
Caso de estudio: diseo de una aplicacin Web bancaria (22) Diseo de la capa controlador
Fuente: GoF Recibe una peticin HTTP Invoca al mtodo execute de la accin correspondiente (todas extienden de Action), cuya implementacin:
RequestProcessor
Accede a los parmetros de la peticin HTTP (ej.: los campos de un formulario) Invoca una operacin de la fachada del modelo Selecciona una pgina JSP para generar la respuesta y le pasa el resultado de la operacin La pgina JSP genera la respuesta
Caso de estudio: diseo de una aplicacin Web bancaria (23) Ejecucin de un caso de uso
:RequestProcessor
:FindAccountsAction
:AccountFacadeDelegateFactory
:AccountFacadeDelegate
:AccountDetails.jspx
2.1: execute
View
Controller
Model
View
Caso de estudio: diseo de una aplicacin Web bancaria (24) Ejemplo de pgina 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>
Caso de estudio: diseo de una aplicacin Web bancaria (y 25) Resumen del mtodo de diseo seguido en MiniBank
Modelo
Un TO por cada objeto persistente Un DAO (+ factora) por cada objeto persistente Definir fachadas (+ factoras) del modelo
Controlador
Una accin (comando) por cada caso de uso Por cada caso de uso: una pgina JSP para el formulario de entrada y/o una pgina JSP para generar la salida
Vista
Aplico todos los patrones que yo s en el diseo de mi software Resuelvo cada problema de diseo que me surge con un patrn apropiado
OJO, un uso excesivo de patrones fcilmente terminar en una arquitectura excesivamente compleja
Hay que aplicar patrones para resolver problemas de verdad y no problemas filosficos En resumen: KISS (Keep It Simple Stupid!)
Referencias (1)
Libros
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 http://hillside.net/patterns http://java.sun.com/blueprints/patterns/index.html
Sitios Web
Referencias (y 2)
http://www.lfcia.org/dsi 4 Ingeniera Informtica Se centra en los patrones del GoF Transparencias y cdigo disponibles http://www.tic.udc.es/~fbellas/teaching/is 5 Ingeniera Informtica Se centra en el diseo e implementacin de aplicaciones empresariales con J2EE Transparencias y cdigo disponibles
Integracin de Sistemas
http://www.tic.udc.es/~fbellas/teaching/pfc3