Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ndice Introduccin Tipos de patrones Descripcin de patrones Caso de estudio: diseo de una aplicacin Web bancaria Unas palabras finales Referencias
Noviembre 2008
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.
Noviembre 2008
Introduccin (2)
La orientacin a objetos propugna no reinventar la rueda en la pura codificacin respecto de la resolucin de problemas.
Por qu, entonces, reinventarla para el ataque genrico a problemas comunes de anlisis, diseo e implementacin?
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, algn esquema de documentacin que permita tal comunicacin.
La mera documentacin de lneas de cdigo resulta insuficiente, pues nicamente fomenta el uso de la tcnica de copiar y pegar. El tipo de los problemas y soluciones a documentar es muy variado
Programacin/anlisis/arquitectura/gestin/...
Se necesita un formato de documentacin nico que ane conceptualmente estos distintos tipos.
Noviembre 2008
Introduccin (3) Un patrn es una solucin a un problema de diseo no trivial que es:
Efectiva: ha sido vlido para resolver el problema en diseos pasados. Reusable: la solucin es la misma para problemas similares.
Un catlogo de patrones es un medio para comunicar la experiencia de forma efectiva, reduciendo lo que se conoce como curva de aprendizaje del diseo.
Coleccin de patrones organizados que incluye:
Descripcin completa de cada uno de los patrones Modos de acceso a la coleccin de patrones.
Correspondencia entre un problema real y un patrn (o conjunto de patrones).
Noviembre 2008
Introduccin (4) 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.
Cada patrn describe un problema que ocurre una y otra vez en nuestro entorno, para describir despus el ncleo de la solucin a ese problema, de tal manera que esa solucin pueda ser usada ms de un milln de veces sin hacerlo siquiera dos veces de la misma forma.
Christopher Alexander
Noviembre 2008
Introduccin (y 5)
Contexto Problema Solucin
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 especificacin de la implementaciones. Ayudan a reutilizar cdigo, facilitando la decisin entre "herencia o composicin" (favorece la composicin sobre la herencia y hace uso de la delegacin). Relacionan estructuras en tiempo de compilacin y en tiempo de ejecucin. Permiten hacer un diseo preparado para el cambio.
Noviembre 2008
Tipos de patrones (1) Existen patrones para las distintas actividades que hay que realizar en un proyecto (anlisis, diseo, implementacin, etc.)
Este seminario se centra en los relativos al diseo.
Noviembre 2008
Tipos de patrones (2) Pattern-Oriented Software Architecture: A System of Patterns (F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal, 1996).
Tambin conocido como The POSA Book. Fue el primer libro en hacer una clasificacin de patrones:
Patrones arquitectnicos [Diseo]. Patrones de diseo [Diseo]. Idiomas [Implementacin].
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.
Noviembre 2008
10
Idiomas:
Explican cmo resolver un problema particular de implementacin con una tecnologa concreta. Ej.: Cmo comparar objetos correctamente en Java? Correcta redefinicin de equals() y hashCode().
Noviembre 2008
11
Descripcin de patrones Cada catlogo de patrones utiliza una plantilla para describir sus patrones.
No existen plantillas estndar.
Intencin.
Descripcin de lo que se pretende conseguir con el patrn.
Motivacin.
Escenario que presenta un problema de diseo. Solucin para el escenario utilizando el patrn.
Aplicabilidad.
Situaciones en las cuales se puede aplicar el patrn.
Noviembre 2008
12
Participantes.
Clases y objetos participantes que componen el patrn. Responsabilidades.
Consecuencias.
Ventajas e inconvenientes que pueden derivarse del uso del patrn.
Implementacin.
Tcnicas y peligros que pueden presentarse al implementar el patrn.
Noviembre 2008
13
Descripcin de Patrones (y 3)
Cdigo de ejemplo.
Planteamiento de cdigo prctico referido a un ejemplo (o ejemplos) suficientemente representativo del uso del patrn.
Usos conocidos.
Ejemplos del patrn 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
14
Patrones estructurales:
Se ocupan de cmo se utilizan clases y objetos para componer estructuras de mayor tamao.
Lo fundamental son las relaciones de uso entre los objetos, y, stas estn determinadas por las interfaces que soportan los objetos. Estudian cmo se relacionan los objetos en tiempo de ejecucin y sirven para disear las interconexiones entre los objetos.
Noviembre 2008
15
Chain of Responsability, State, Strategy, Visitor, Observer, Template Method, Memento, ...
Noviembre 2008
16
Antipatrones
Los patrones ofrecen una forma de resolver un problema tpico; los antipatrones muestran formas de enfrentarse a problemas con consecuencias negativas conocidas. Los antipatrones se basan en la idea de que puede resultar ms fcil 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 eleccin de la mejor alternativa. Al documentar los antipatrones, adems de los patrones de diseo, se dan argumentos a los diseadores de sistemas para no escoger malos caminos, partiendo de documentacin disponible en lugar de simplemente la intuicin. Ejemplo tpico: The Blob (clases gigantes).
Noviembre 2008
17
Caso de estudio: Diseo de una aplicacin Web bancaria (1) Caso de estudio: MiniBank.
Un sencillo ejemplo de una aplicacin Web bancaria.
Obtener una visin global de los principios bsicos de diseo de una aplicacin Web con Java EE y Apache Struts. Lo ms importante: captar la idea de lo que significa disear con patrones.
Caso de estudio: Diseo de una aplicacin Web bancaria (2) Casos de uso implementados en MiniBank
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.
Noviembre 2008
19
Caso de estudio: Diseo de una aplicacin Web bancaria (3) MiniBank: bsqueda de una cuenta a partir de su identificador
Noviembre 2008
20
Caso de estudio: Diseo de una aplicacin Web bancaria (4) MiniBank: aadir dinero a una cuenta
Noviembre 2008
21
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.
Noviembre 2008
22
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.
Ventajas
Si se decide cambiar de tipo de interfaz de usuario en un futuro, la lgica de negocio se puede reutilizar.
La lgica de negocio es independiente de la interfaz de usuario.
Caso de estudio: Diseo de una aplicacin Web bancaria (7) Arquitectura global de la aplicacin
Solucin
Patrn Model-View-Controller (MVC) Estructurar el software en 3 capas.
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.
(5) (1)
MiniBank Vista (4) Controlador (2) Modelo Servidor de aplicaciones Web JavaEE (ej.: Apache Tomcat) (3) BD
Navegador
Noviembre 2008
24
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?
Noviembre 2008
25
Caso de estudio: Diseo de una aplicacin Web bancaria (9) Diseo de la capa modelo Solucin 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
26
Caso de estudio: Diseo de una aplicacin Web bancaria (10) Diseo de la capa modelo Solucin al problema 1
Noviembre 2008
27
Caso de estudio: Diseo de una aplicacin Web bancaria (11) Diseo de la capa modelo Solucin 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 - S QLA c c ountDA OFactory () < < s tatic > > + getDA O() : S QLA c c ountDA O < <ins tantiate> > < <us e> > ConfigurationP aram eters M anager (from c onfiguration)
<< 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
28
Caso de estudio: Diseo de una aplicacin Web bancaria (12) Diseo de la capa modelo Solucin al problema 2 Recuperacin 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
29
Caso de estudio: Diseo de una aplicacin Web bancaria (13) Diseo de la capa modelo Solucin al problema 2
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 patrn Strategy [GoF].
Noviembre 2008
30
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 la misma 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 la 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
Noviembre 2008 Introduccin al Diseo con Patrones 31
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
Noviembre 2008
32
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.
Permite seleccionar implementaciones alternativas.
Noviembre 2008
33
Caso de estudio: Diseo de una aplicacin Web bancaria (17) Diseo de la capa modelo Solucin al problema 3
Noviembre 2008
34
Caso de estudio: Diseo de una aplicacin Web bancaria (18) Diseo de la capa modelo Solucin al problema 3
Implementacin de addToAccount
:AccountFacadeDelegate 1: addToAccount 1.1: getDAO 1.2: find 1.3: update 1.4: getDAO 1.5: create
:SQLAccountDAOFactory
:SQLAccountDAO
:SQLAccountOperationDAOFactory
:SQLAccountOperationDAO
Noviembre 2008
35
Caso de estudio: Diseo de una aplicacin Web bancaria (19) Diseo de la capa modelo Solucin al problema 3
Implementacin 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 Introduccin al Diseo con Patrones 36
Caso de estudio: Diseo de una aplicacin Web bancaria (20) 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.).
Capa controlador
Apache Struts.
Proporciona un framework para implementar la capa controlador de la aplicacin Web. Proporciona la mencionada librera de tags de HTML (capa vista).
Noviembre 2008
37
Caso de estudio: Diseo de una aplicacin Web bancaria (21) Diseo de la capa controlador
Framework:
Conjunto de clases que implementan de manera parcial la arquitectura de una aplicacin (o parte de la arquitectura).
Implementan una coleccin de patrones.
Para completar la arquitectura, el desarrollador tiene que implementar algunas interfaces y/o extender algunas clases abstractas. El framework invoca al cdigo de la aplicacin Tambin suelen tener una parte que acta como librera.
Noviembre 2008
38
Caso de estudio: Diseo de una aplicacin Web bancaria (22) Diseo de la capa controlador
Action + execute
FindAccountsAction
TransferAction
...
MiniBank
Noviembre 2008
39
Caso de estudio: Diseo de una aplicacin Web bancaria (23) Diseo de la capa controlador
RequestProcessor
Recibe una peticin HTTP. Invoca al mtodo execute de la accin correspondiente (todas extienden de Action), cuya implementacin:
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.
Noviembre 2008
40
Caso de estudio: Diseo de una aplicacin Web bancaria (24) Ejecucin de un caso de uso
:FindAccounts.jspx 1: clic en el enlace Find accounts 2: clic en el botn Find :RequestProcessor
:FindAccountsAction
:AccountFacadeDelegateFactory
:AccountFacadeDelegate
:AccountDetails.jspx
2.1: execute
Controller
Model
View 41
Caso de estudio: Diseo de una aplicacin Web bancaria (25) 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> Noviembre 2008 Introduccin al Diseo con Patrones 42
Caso de estudio: Diseo de una aplicacin Web bancaria (y 26) 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.
Cada fachada agrupa a un conjunto de casos de uso relacionados.
Controlador:
Una accin (comando) por cada caso de uso.
Vista:
Por cada caso de uso: una pgina JSP para el formulario de entrada y/o una pgina JSP para generar la salida.
Noviembre 2008
43
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. 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 ingeniera.
Noviembre 2008 Introduccin al Diseo 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 Introduccin al Diseo con Patrones 45
Integracin de Sistemas:
http://www.tic.udc.es/~fbellas/teaching/is-2007-2008 5 Ingeniera Informtica. Se centra en el diseo e implementacin de aplicaciones empresariales con Java EE. Transparencias y cdigo disponibles.
Noviembre 2008
46