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

Documentos relacionados