Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Patrones diseño de software
1. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Desarrollo Utilizando Patrones Software
M.I. Capel
ETS Ingenierías Informática
y Telecommunicación
Universidad de Granada
Email: manuelcapel@ugr.es
Desarrollo de Software
Ingeniería de Software (3er curso de Grado)
M.I.Capel
Tema 1
2. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Índice
1
Introducción
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
2
Patrones de Diseño y Calidad del Software
M.I.Capel
Tema 1
3. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Índice
1
Introducción
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
2
Patrones de Diseño y Calidad del Software
M.I.Capel
Tema 1
4. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Conceptos básicos y motivación
Un patrón permite capturar el conocimiento más
importante acerca del diseño de la solución a un
problema, que permite su posterior reutilización
1
2
3
Se aplica en un contexto
Resuelve un problema
Generan indirectamente la solución
La idea de patrón procede de la Arquitectura:
Chistopher Alexander (Buildings Architect)
Each pattern describes a problem that occurs over and over again
in our environment and then describes the core of the solution to
that problem in such a way that you can use the solution a million
times over without ever doing it the same way twice
M.I.Capel
Tema 1
5. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Marcos de trabajo
Para desarrollar un diseño completo de un sistema
complejo hay que proporcionar una infraestructura
parecida a un esqueleto de la implementación del sistema
Los marcos de trabajo no son patrones de diseño:
Los patrones de diseño son más abstractos que los marcos
de trabajo
Los patrones de diseño son elementos arquitectónicos más
pequeños que los marcos de trabajo
Los patrones de diseño son más especializados que los
marcos de trabajo
M.I.Capel
Tema 1
6. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Definition (Framework)
“Reusable minimum architecture that provides the generic
structure and behaviour for a family of software abstractions,
along with a context . . . that specifies their collaboration and
their use within a given domain"
M.I.Capel
Tema 1
7. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Caracterización
Los marcos de trabajo se suelen aplicar sin cambios
Proporcionan una estructura de clases para adaptar
Son generalmente mucho más grandes
arquitectónicamente que los patrones
Son más concretos que los patrones
M.I.Capel
Tema 1
8. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Caracterización II
Un patrón de diseño es mucho más que un diagrama de
clases en UML
Son más abstractos que los marcos de trabajo
Los patrones capturan las abstracciones del espacio del
problema que son relevantes para encontrar una solución
Una “metodología de diseño orientada" a objetos ayuda a
obtener una descomposición del sistema
M.I.Capel
Tema 1
9. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Clasificación basada en su funcionalidad
Patrones arquitectónicos: intentan reflejar la estructura de
los problemas que resuelven
Patrones de datos: relacionados con la organización de la
información en aplicaciones
Patrones de Diseño Orientado a Objetos:descomposición,
intercomunicación y ubicación de los componentes de un
sistema dentro de una jerarquía de clasificación
Patrones de diseño de interfaces
Patrones para aplicaciones Web
M.I.Capel
Tema 1
10. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Patrones de Diseño Orientado a Objetos
Patrones Creacionales: instanciación de objetos
reforzando las restricciones en el tipo y número de objetos
Patrones Estructurales: organización en integración de
clases de objetos dentro de grandes estructuras de
información
Patrones Comportamentales: asignación de
responsabilidades y comunicación entre los objetos
M.I.Capel
Tema 1
11. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Ámbito de los patrones actuales
Segundo criterio de clasificación de los patrones de diseño
Las relaciones entre clases y subclases es estática
Los patrones que se refieren a objetos tratan de relaciones
dinámicas
Patrones creacionales de clases vs. de objetos
Patrones comportamentales de clases vs. de objetos
M.I.Capel
Tema 1
12. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Tipos de metodologías de diseño orientadas a objetos
Enfocadas hacia la subclasificación
Enfocadas hacia las colaboraciones y responsabilidades
en el sistema objetivo
Enfocada hacia el modelado
Los enfoques anteriores son complementarios
M.I.Capel
Tema 1
13. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Aspectos generales comunes
Los patrones de diseño ayudan a determinar
qué es un objeto y hasta donde descomponerlos en
objetos más simples (granularidad)
Determinación de la jerarquía y tipos de clases de objetos
Determinación de la interfaces
Diferencias entre el mecanismo de herencia de las clases
y de las interfaces
Definition (Principio de diseño)
“Program to an interface not to an implementation"
M.I.Capel
Tema 1
14. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Descripción de un patrón
Contexto
Problema
Fuerzas
Solución
Intención
Anti-patrones
Patrones relacionados
Referencias
Plantilla
describe el entorno en el que se
ubica el problema incluyendo el
dominio de aplicación
una o dos frases que explican lo que
se pretende resolver
lista el sistema de fuerzas que afectan a la
manera en que ha de resolverse el problema
incluye las limitaciones y restricciones
que han de respetarse
proporciona una descripción detallada
de la solución propuesta para el problema
describe el patrón y lo que hace
“soluciones" que no funcionan en el contexto
o que son peores; suelen ser errores
cometidos por principiantes
referencias cruzadas relacionadas
con los patrones de diseño
reconocimientos a aquellos desarrolladores
que desarrollaron o inspiraron el patrón que se propone
M.I.Capel
Tema 1
15. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Tipos de patrones de diseño
Resolución de problemas de diseño utilizando patrones
Lenguajes de patrones
Modelo de Requisitos
Describe el conjunto del problema.
Establece el contexto e identifica
los intereses que dominan en la
búsqueda de un patrón.
Se trata de una colección de patrones de diseño que
colaboran para resolver los problemas dentro de un
dominio de aplicaciones
Se ha de definir una arquitectura software o un marco de
trabajo
Hasta llegar al nivel de patrones de diseño que implican
clases y componentes relacionados
M.I.Capel
Tema 1
16. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Diseño basado en patrones dentro de un contexto
Principios Generales de Diseño
I
II
III
IV
V
Descubrir el contexto del problema a partir del modelo de
requerimientos
Extraer los patrones del nivel actual de abstracción
Escoger un esqueleto de implementación que refleje el
contexto
Trabajar siempre hacia dentro del contexto
Refinar el prototipo adaptándolo a las características del
software
M.I.Capel
Tema 1
17. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Catálogos de Patrones de Diseño
Existen varios catálogos actualmente:
El denominado "The Gang of Four":
Gamma–Helm–Johnson-Vlissides [Gamma et al., 1995]
Pero no es el único:Coad–North–
Mayfield, [Bass et al., 2012], [Booch, 2008],
Buschmann [Buschmann et al., 1995],
Lethbridge [Lethbridge and Laganiere, 2005], etc.
GoF y “Code Complete" (Steve McConnell, Microsoft) son
los catálogos de patrones de diseño de referencia
M.I.Capel
Tema 1
18. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Tareas de diseño
Desarrollar una jerarquía de entidades de análisis del
problema [Bruegge and Dutoit, 2013]
Determinar existencia de un lenguaje de patrones aplicable
Determinación de patrones arquitectónicos candidatos
Utilizar las colaboraciones entre patrones de más bajo nivel
Buscar los patrones de diseño de interfaces adecuados
Independientemente del nivel de abstracción, compararlo con
otras soluciones pre-existentes
M.I.Capel
Tema 1
19. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Abstracción–caso
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
20. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Abstracción–caso-2
Titulo
Nombre
Autor
ISBN
fechaPublicacion
bibliotecaNacional
Ejemplar
materializacionnumeroCodigodeBarras
1..*
Plantilla–ejemplo para el patrón Abstracción-caso
M.I.Capel
Tema 1
21. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Ejemplar
Titulo
Nombre
Autor
ISBN
fechaPublicacion
bibliotecaNacional
Titulo
Autor
ISBN
fechaPublicacion
bibliotecaNacional
numeroCodigoBarras
Viajes Gulliver
Mobby Dick
Ejemplar
numeroCodigoBarras
Forma inapropiada de representar abstracciones y casos
M.I.Capel
Tema 1
22. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Patrones Relacionados
El catálogo GoF propone los patrones: Prototype y
Flyweight que pueden considerarse como relacionados
con Abstracción–Caso
El patrón de diseño Prototype: especifica la tipología de
los objetos a crear utilizando una clase de prototipo
Los nuevos objetos se crean copiando el prototipo
El patrón de diseño Flyweight utiliza compartición del
estado intrínseco de objetos de granularidad fina para
evitar creación masiva de estos objetos en una aplicación
M.I.Capel
Tema 1
23. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Actor–Papel
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
24. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
interpreta
Actor
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
RolAbstracto
1..*
Rol-2
Rol-1
Plantilla del patrón Actor–Papel
M.I.Capel
Tema 1
25. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
SituacionAcademica
TiempoParcial
asiste
1
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Alumno
DedicacionCompleta
acredita
1
Graduado
Ejemplo del patrón Actor–Papel
M.I.Capel
Tema 1
NivelEstudios
PreGraduado
26. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Adaptador
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
27. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Superclase
metodoPolimorfico()
Nota
metodoPolimorfico()()
{
return
adaptado.metodoAdaptado();
}
Adaptador
Adaptado
1
metodoAdaptado()
Plantilla del patrón de diseño Adaptador
M.I.Capel
Tema 1
28. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Figura3D
volumen()
Toro
volumen()
{
return
toroPrev.calcVolumen();
}
Toro
Esfera
ToroPrev
1
Ejemplo con el patrón de diseño Adaptador
M.I.Capel
Tema 1
calcVolumen()
29. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Composite
Se trata de un patrón de diseño para el particionamiento
Mediante este patrón, un grupo de objetos es tratado de la
misma forma que un solo objeto
“Componer" objetos en estructuras en forma de árbol
abstracto para representar jerarquías todo–parte
Con este tipo de representación las aplicaciones–cliente
pueden procesar de manera uniforme los objetos
individuales y las composiciones de objetos
M.I.Capel
Tema 1
30. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Client
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Component
Operation()
Add(Component)
Remove(Component)
GetChild(int)
children
Leaf
Composite
Operation()
Operation()
Add(Component)
Remove(Component)
GetChild(int)
Diagrama de clases del patrón Composite
M.I.Capel
Tema 1
31. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
¿Cuándo utilizar el patrón “Composite"?
Es necesario componer objetos para formar árboles que
representen jerarquías
Hay que representar (abstractamente) objetos primitivos
(leaf) y sus contenedores
Los contenedores pueden ser agregados de otros
contenedores o de objetos
Hay operaciones del contenedor que aplican a todos los
descendientes (children)
M.I.Capel
Tema 1
32. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
¿Para qué utilizar el patrón “Composite"
Para conseguir que los clientes ignoren la diferencia entre
objetos individuales y agregaciones de objetos
(Composite)
Para que los clientes traten a todos los objetos de una
agregación de manera uniforme
Para hacer más fácil la inclusión de nuevos componentes
Para hacer el diseño más general
M.I.Capel
Tema 1
33. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Componente
contiene
*
Contenedor
Panel
Etiqueta
Boton
Ventana
Ejemplo utilización patrón Composite
M.I.Capel
Tema 1
Lista
34. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Delegación
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
35. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Delegante
Nota
metodoDelegador()
{
delegado.metodo();
}
metodoDelegador()
Delegado
1
Plantilla del patrón Delegación
M.I.Capel
Tema 1
metodo()
36. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Pila
ListaEnlazada
push()
pop()
estaVacia()
Nota
push()
{
1
lista.insertaPrimero();
}
insertaPrimero()
insertaUltimo()
insertaDetras()
eliminaPrimero()
eliminaUltimo()
elimina()
estaVacia()
Ejemplo del patrón de diseño Delegación
M.I.Capel
Tema 1
37. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Fachada
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
38. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
PackageClase1
1
Fachada
*
1
1
PackageClase2
*
*
Nota
Contiene un subconjunto de
métodos públicos tal que
los otros subsistemas no
tendrán que acceder a las
clases dentro de los paquetes
Plantilla del patrón Fachada
M.I.Capel
Tema 1
PackageClase3
39. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
VueloRegular
1
LineaAerea
*
Pasajero
1
encuentraVuelo()
hacerReserva()
eliminarReserva()
*
Ejemplo con el patrón de diseño Fachada
M.I.Capel
Tema 1
40. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Factoría Abstracta
Definition (Intención del Patrón)
Proporcionar una interfaz para crear familias de objetos
relacionados sin tener que especificar las clases a las que
pertenecen.
Definition
Queremos ofrecer una biblioteca de clases de productos pero
revelar sólo sus interfaces, no sus implementaciones
Definition
Queremos imponer que una familia de productos relacionados
sean utilizados conjuntamente por las aplicaciones
M.I.Capel
Tema 1
41. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Factoría Abstracta 2
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
42. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Plantilla del patrón Factoria Abstracta
DemandanteCreacion
<<interface>>
Factoria
1
crearInstancia()
*
ClaseGenerica
ClaseEspecificaApl
FactoriaEspecificaApl
crear
M.I.Capel
Tema 1
43. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Factoría Abstracta
Factoría: declara una interfaz para las operaciones de
creación de productos abstractos
Factoría Específica de la Aplicación: programan las
operaciones para crearse objetos–producto concretos
Clase Genérica: declara una interfaz para un tipo concreto
de objetos–producto
Clase Específica de la Aplicación: programa el
objeto–producto que va a ser creado por la factoría
correspondiente; implementa la interfaz en clase genérica
Demandante Creación: sólo usa las interfaces declaradas
en ClaseGenerica y Factoria
M.I.Capel
Tema 1
44. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
¿Cuándo utilizar “Flyweight"
Han de darse todas las condiciones siguientes
La aplicación utiliza un número grande de objetos (baja
granularidad)
Altos costes de almacenamiento debido a la cantidad de
objetos
La mayoría del estado de un objeto se puede convertir en
extrínseco
Después de encapsular el estado extrínseco, muchos
grupos de objetos pueden ser reemplazados por un
número relativamente pequeño de objetos compartidos
No se depende de la identidad de los objetos
M.I.Capel
Tema 1
45. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
FactoriaFlyweight
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Flyweight
flyweights
Operacion(estadoExtrinseco)
FlyweightConcreto
FlyweightConcretoNoCompartido
estadoIntrinseco
Operacion(estadoExtrinseco)
todosEstados
Operacion(estadoExtrinseco)
Cliente
Ejemplo del patrón Flyweight
M.I.Capel
Tema 1
46. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
¿Para qué utilizar el patrón “Flyweight"
Para ahorrar espacio: mayor cuanto más estado intrínseco
de los objetos se pueda compartir
Para negociar el espacio del estado extrínseco por tiempo
de cómputo (si se puede calcular el estado)
Para representar estructuras jerárquicas combinado con el
patrón Composite
Pero, los nodos–hojas representados por “flyweights" no
pueden contener un puntero a su nodo superior
M.I.Capel
Tema 1
47. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
ElementoEscritura
Dibujar(Contexto)
Intersectar(Punto,Contexto)
descend
Fila
Dibujar(Contexto)
Intersectar(Punto,Contexto)
descend
Caracter
char c
Dibujar(Contexto)
Intersectar(Punto,Contexto)
Columna
Dibujar(Contexto)
Intersectar(Punto,Contexto)
Ejemplo de aplicación susceptible de utilizar “flyweights"
M.I.Capel
Tema 1
48. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Inmutable
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
49. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Interfaz Sólo–Lectura
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
50. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
ClaseSinPrivilegio
<<interface>>
SoloLectura
*
*
consigueAtributo()
Mutante
Mutable
*
*
private
consigueAtributo()
fijaAtributo()
Plantilla del patrón de diseño Interfaz Sólo–Lectura
M.I.Capel
Tema 1
51. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Método Factoría
Se trata de programar un Constructor Virtual incluido en
un marco de trabajo
El patrón Metodo Factoria deja la responsabilidad de crear
los objetos a las subclases del marco de trabajo
El metodoFactoría está incluido en una clase abstracta
El conocimiento necesario para crear los objetos que se
precisa está encapsulado fuera del marco de trabajo
M.I.Capel
Tema 1
52. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Creador
<<interface>>
Producto
metodoFactoria()
unaOperacion()
ProductoConcreto
CreadorConcreto
metodoFactoria()
Plantilla del patrón Método Factoría
M.I.Capel
Tema 1
Nota
...
{
producto= metodoFactoria();
}
Nota
...
{
return new ProductoConcreto();
}
53. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Una vez que se ha instanciado CreadorConcreto, puede
crear ya el producto concreto sin tener que conocer qué
clase de producto va a crear
Existirá otra jerarquía de clases “helper" que contienen el
conocimiento para crear los productos concretos
M.I.Capel
Tema 1
54. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Observador
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
55. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Observable
incluirObervador()
notificarObservadores()
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
*
*
ObservableConcreto
<<interface>>
Observador
actualizar()
ObservadorConcreto
Plantilla de patrón de diseño Observador
M.I.Capel
Tema 1
56. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Observable
*
*
Pronosticador
<<interface>>
Observador
MonitorTiempo
Los obervadores son notificados cuando cambia el tiempo
Ejemplo con el patrón Observador
M.I.Capel
Tema 1
57. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Cuándo utilizar “Prototype"
Un sistema ha de ser independiente de cómo se crean,
componen y representan sus productos
Los objetos se crean en tiempo de ejecución, después de
cargar dinámicamente las clases en la aplicación
Evitando la redundancia de crear una jerarquía de clases
de factorías que se empareje con la jerarquía de productos
Resulta más práctico clonar que instanciar una clase para
crear objetos en las aplicaciones
M.I.Capel
Tema 1
58. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Cliente
Operacion()
prototipo
1
1..*
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Prototype
Clonar()
PrototipoConcreto1
PrototipoConcreto2
Clonar()
Clonar()
Diagrama de clases del patrón Prototype
M.I.Capel
Tema 1
59. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Para qué utilizar “Prototype"
Para añadir y eliminar productos en tiempo de ejecución
Para definir nuevos objetos sólo cambiando valores
Clonar un prototipo es como instanciar una clase, sólo que
con este patrón se puede ver bastante reducido el número
de clases que necesita un sistema
Para definir nuevos objetos sólo variando la estructura
Para reducir la subclasificación
Para configurar dinámicamente una aplicación con clases
M.I.Capel
Tema 1
60. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Proxy
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
61. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
<<interface>>
ClassIF
Cliente
*
Proxy
*
ClasePesada
0..1
0..1
Plantilla del patrón de diseño Proxy
M.I.Capel
Tema 1
62. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
“Singleton"
Contexto
Problema
Fuerzas
Solución
Ejemplos
Anti–patrones
Patrones Relacionados
Referencias
M.I.Capel
Tema 1
63. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Visitante
Para representar a una operación que ha de ser realizada
sobre los elementos de una estructura de objetos
Las aplicaciones crearán objetos VisitanteConcreto y
después atraviesan la estructura de objetos
Al ser visitados los objetos, el visitante llamará al método
adecuado para cada objeto
Se ha de evitar cambiar las clases de los elementos sobre
los que opera
M.I.Capel
Tema 1
64. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Cliente
Visitante
VisitanteConcreto1
VisitanteConcreto2
visitarElemConcretoA(...)
visitarElemConcretoB(...)
visitarElemConcretoA(...)
visitarElemConcretoB(...)
Elemento
Estructura
aceptar(Visitante)
ElemConcretoA
ElemConcretoB
aceptar(Visitante v)
operacionA()
aceptar(Visitante v)
operacionB()
M.I.Capel
Tema 1
65. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Visitante 2
Los VisitanteConcreto programan cada operación
declarada en Visitante, proporcionan el contexto para
ejecutar la operación y almacenan su estado durante el
recorrido de la estructura
Los objetos del tipo Elemento definen una operación
aceptar() a la que se le pasa un VisitanteConcreto como
argumento
A la operación visitar() hay que pasarle la referencia del
elemento que envía la petición a un VisitanteConcreto
M.I.Capel
Tema 1
66. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Patrones Arquitectónicos
Características de estos patrones
Una clasificación [Booch, 2008] atendiendo a características para cumplir con los requisitos de seguridad,
rendimiento, despliegue y almacenamiento
Control de accesos: el acceso a determinadas partes de la
arquitectura software ha de ser controlado rigurosamente.
Concurrencia: diferentes formas de permitir que los
componentes de la aplicación sean concurrentes.
Distribución: la comunicación entre entidades software es
muy diversa y afecta al diseño, la ubicación de los
componentes ha de ser optimizable (configurabilidad).
Persistencia: la supervivencia de los objetos (atributos y
estado) entre distintas ejecuciones es algo diseñable. Una
mala solución puede dañar la eficiencia gravemente
M.I.Capel
Tema 1
67. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Categorías
Whole UI ⇒ TopLevelNavigation
Page Layout ⇒ CardStack
Forms and Input ⇒ Fill-in-the-blanks
Tables ⇒ SortableTable
Direct Data Manipulation ⇒ BreadCrumbs
Navigation ⇒ EditInPlace
Searching ⇒ SimpleSearch
Page Elements ⇒ Wizard
E–Commerce ⇒ ShoppingCart
Miscellaneous ⇒ ProgressIndicator
M.I.Capel
Tema 1
68. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Patrones de Diseño WebbApp
Dimensiones a considerar para resolver los problemas de diseño
(a) Enfoque con el que diseñamos el patrón
(b) Nivel de granularidad de lo que estamos diseñando
Enfoque de diseño
Patrones de la Arquitectura de Información: estructura de
la información y formas de acceso
Patrones de navegación: estructuras de enlaces
Patrones de interacción: cómo desarrollar interfaces
basándose en el contexto e informando de las
consecuencias
Patrones de presentación: organización interna de
funciones de control para conseguir usabilidad
Patrones funcionales: flujos y algorítmica
M.I.Capel
Tema 1
69. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Utilización de los patrones de diseño con UML
Patrones Arquitectónicos
Patrones a Nivel de Componentes
Granularidad del diseño
El nivel de abstracción distinto según el tamaño del
elemento (aplicación, página, componente, etc.) a diseñar.
Esto afectará al tipo de patrón a utilizar.
Patrones arquitectónicos: definen la estructura global y las
reglas de las relaciones entre elementos
Patrones de diseño: resuelven un problema específico a un
determinado de nivel diseño
Patrones de componentes: aplicables a elementos de
pequeña escala de los componentes o páginas
Patrones de pruebas:aplicables al software desarrollado
específicamente para realizar pruebas
M.I.Capel
Tema 1
70. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Conceptos Generales
Objetivo: conseguir componentes y servicios software
“evolutivos"
Definition (Software Evolutivo)
En la medida que incorpore, de manera estable, los cambios en
los requerimientos que pueden aparecer en cualquier momento
del proceso de desarrollo y la vida del sistema software.
Para producir “software evolutivo": una arquitectura que
propicie la facilidad de modificación, la flexibilidad, y la
extensibilidad del software.
Los anteriores atributos de calidad dependen directamente
de la arquitectura software utilizada para desarrollar el
sistema.
M.I.Capel
Tema 1
71. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Patrones y Mantenibilidad del Software
Se estudian los patrones de diseño que propician
conseguir el atributo de calidad mantenibilidad del software
Referencia ISO 9126 (ISO/IEC 2002):
Definition (Mantenibilidad del Software)
Facilidad de cambio, Facilidad de análisis, Facilidad de prueba,
y Estabilidad del software
Esta característica de calidad no se limita sólo a la fase del
Mantenimiento: relacionada concepto Evolución software
M.I.Capel
Tema 1
72. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Fachada
Definition (–Contexto)
Mejorar la portabilidad de una aplicación al encapsular las
APIs de bajo nivel del sistema operativo
Encapsular mecanismos o servicios proporcionados por
APIs existentes, no orientadas a objeto
Aumentar la cohesión de componentes
M.I.Capel
Tema 1
74. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad del patrón Fachada
Beneficios
Encapsular APIs bajo nivel
Decrementar probabilidad errores
Acceso uniforme a APIs
Aislar de efectos “no portables"
Mejora la configurabilidad
Mejora la comprensión
Clases más cohesivas
Manejo excepciones
Atributo Calidad
Encapsulamiento, cohesión
Integridad
Accesibilidad
Adaptabilidad
Independencia plataforma
Modificabilidad
Reusabilidad
Integridad
M.I.Capel
Tema 1
Característica ISO 9216
Mantenibilidad, cambios
Fiabilidad, madurez
Funcionalidad, adecuación
Portabilidad, adaptabilidad
Adaptabilidad
Cambios y pruebas
Cambios, análisis
Fiabilidad, Tolerancia Fallos
75. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad 2
Perjuicios
Perder funcionalidad
Degradar el rendimiento
Limitaciones de integración
Estaticidad del patrón
Atributo Calidad
Accesibilidad
Desempeño
Compatibilidad
Dinamismo
Característica ISO 9216
Funcionalidad, adecuación
Eficiencia, tiempo respuesta
Mantenibilidad
Facilidades
Implementar una abstracción sobre otra pre-existente
puede ocasionar que se pierda funcionalidad
Incrementar el coste en recursos (salvar contextos) si los
métodos de la nueva API incluyen mucha funcionalidad
Problemas de integración de interfaces nativas en los
lenguajes de programación que implementan la nueva API
La reusabilidad de las clases de este patrón, una vez
implementado, es muy limitada
M.I.Capel
Tema 1
76. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad
Característica
Sub-característica
Facilidad de cambio
Impacto
+
Facilidad de análisis
+
Mantenibilidad
Funcionalidad
Fiabilidad
Eficiencia
Portabilidad
Facilidad de prueba
Conformidad
con
estándares
Adecuación
Madurez
Tolerancia a Fallas
Tiempo de respuesta
Uso de recursos
Adaptabilidad
M.I.Capel
Tema 1
+
+
+
Atributo
Reusabilidad
Modificabilidad
Encapsulamiento
Cohesión
Dinamismo
Reusabilidad
Modificabilidad
Dinamismo
Modificabilidad
Compatibilidad
Accesibilidad
Accesibilidad
Encapsulamiento
Integridad
Desempeño
Independencia
plataforma
de
77. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad 2
M.I.Capel
Tema 1
78. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Adaptador
Definition (Contexto)
Reutilizar clases existentes cuya interfaz no es adecuada
para lo que necesita la aplicación cliente
Crear clases reutilizables que cooperen con otras clases
Utilizar varias subclases de manera conjunta
M.I.Capel
Tema 1
80. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad del patrón Adaptador
Beneficios
Coordinación mínima con adaptado
Funcionalidad inclusiva
Múltiples adaptadores
Atributo Calidad
Desempeño
Extensibilidad
Reusabilidad
M.I.Capel
Tema 1
Característica ISO 9216
Eficiencia, tiempo respuesta
Mantenibilidad, facilita cambios
Mantenibilidad, cambios, análisis
81. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad 2
Perjuicios
No transparencia adaptador
Mala adaptación de subclases
Invalidar comportamiento adaptado
Trabajo adaptación variable
Atributo Calidad
Complejidad
Modificabilidad
Correctitud
Complejidad
Característica ISO 9216
Manten., cambios,pruebas,análisis
Mantenibilidad, cambios
Funcionalidad, adecuación
Mantenibilidad, cambios
Los adaptadores no son transparentes a todos los clientes
Una clase adaptadora se limita a la adaptación de clase
origen a clases destino
La cantidad de trabajo a realizar para cada adaptador
dependerá del grado de similitud con el adaptado
M.I.Capel
Tema 1
82. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad
Característica
Sub-característica
Facilidad de cambio
Impacto
+
Mantenibilidad
Facilidad de prueba
Facilidad de análisis
Eficiencia
Tiempo de respuesta
Funcionalidad
+
+
Adecuación
-
M.I.Capel
Tema 1
Atributo
Extensibilidad
Reusabilidad
Complejidad
Modificabilidad
Complejidad
Reusabilidad
Complejidad
Desempeño
Correctitud
83. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad 2
M.I.Capel
Tema 1
84. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Visitante
Definition (–Contexto)
Estructuras de objetos de muchas clases y con interfaces
diferentes
Ejecutar operaciones distintas y no relacionadas sobre los
objetos de la estructura
Definir nuevas operaciones sobre los objetos
M.I.Capel
Tema 1
86. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad del patrón Visitante
Beneficios
Fácil adición operaciones
Comportamiento centralizado
Visitar objetos independientes
Extensibilidad interfaces visitantes
Atributo Calidad
Modific., extens.
Cohesión
Flexibilidad
Flexibilidad
M.I.Capel
Tema 1
Característica ISO 9216
Manteniblidad, cambios, análisis
Mantenibilidad, cambios, pruebas
Mantenibilidad, cambios
Mantenibilidad, cambios
87. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad 2
Perjuicios
Deterioro jerarquía visitantes
Acumulación estados visitados
Compromiso encapsulamiento objetos
Atributo Calidad
cohesión
Modif., complj.
Complej., desempeño
Característica ISO 9216
Manten., cambios, pruebas
Manten., cambios, análisis
Eficiencia, recursos
Cuando se añaden con frecuencia nuevas clases de
elementos concretos, se puede afectar al Visitante
Acumulación de distintos estados en los visitantes como
consecuencia de visitar por diferentes motivos
Acceder al estado interno de los objetos visitados puede
romper su encapsulamiento
M.I.Capel
Tema 1
88. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad Visitante
Característica
Sub-característica
Facilidad de cambio
Impacto
+
Mantenibilidad
Facilidad de análisis
+
-
Fiabilidad
Eficiencia
Estabilidad
Facilidad de prueba
Madurez
Uso de recursos
+
-
Funcionalidad
Adecuación
+
M.I.Capel
Tema 1
Atributo
Modificabilidad
Extensibilidad
Flexibilidad
Cohesión
Modificabilidad
Complejidad
Modificabilidad
Extensibilidad
Modificabilidad
Complejidad
Encapsulamiento
Cohesión
Encapsulamiento
Complejidad
Desempeño
Extensibilidad
89. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad 2
M.I.Capel
Tema 1
90. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Cadena de responsabilidad
Definition (–Contexto)
Objetos “manejadores" son asignados dinámicamente
para que atienda peticiones de aplicaciones–cliente
Delegar el atender las peticiones a uno o varios objetos sin
que éstos sean determinados a priori
Inclusión dinámica de objetos–“manejadores"
Patrones relacionados: Composite
M.I.Capel
Tema 1
91. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Cadena de responsabilidad
M.I.Capel
Tema 1
92. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad de cadena de
responsabilidad
Beneficios
Simplicar interconexiones objetos
Cambio dinámico responsabilidad
Detección errores fácil
Mejor control peticiones
Escalabilidad de la cadena
Atributo Calidad
Acoplamiento
Modif., flexibilidad
Toler.fallas
Manejo error, precisión
Escalab., modif.
M.I.Capel
Tema 1
Característica ISO 9216
Manten., cambios, análisis
Manten., cambios
Fiabilidad
Fiabilidad
Manten., cambios
93. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Implicaciones en la calidad 2
Perjuicios
Pérdida peticiones
Funcionalidad por herencia
Atributo Calidad
Adecuación, disponib.
Dinamismo
Característica ISO 9216
Funcion.,fiab.,madurez
Mantenib., cambios
Una petición podría llegar al final de la cadena sin ser
atendida
Para que funcione bien, la cadena ha de estar bien
configurada
El funcionamiento o el comportamiento necesitan de la
herencia para poder ser manejados
M.I.Capel
Tema 1
94. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad
Característica
Sub-característica
Facilidad de cambio
Impacto
+
Mantenibilidad
Fiabilidad
Funcionalidad
+
+
+/-
Facilidad de análisis
Madurez
Tolerancia a fallas
Adecuación
M.I.Capel
Tema 1
Atributo
Escalabilidad
Simplicidad
Bajo Acoplamiento
Modificabilidad
Flexibilidad
Dinamismo
Bajo acoplamiento
Disponibilidad
Manejo de errores
Precisión
95. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Resumen Características de calidad 2
M.I.Capel
Tema 1
96. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Bass, L., Clemens, P., and Kazman, R. (2012).
Software Architecture in Practice.
Addison-Wesley, 3rd edition.
Booch, G. (2008).
Handbook of software architecture.
Addison-Wesley, http:
//www.handbookofsoftwarearchitecture.com/.
Bruegge, B. and Dutoit, A. (2013).
Object–Oriented Software Engineering Using UML,
Patterns and Java.
Prentice-Hall, Upper Saddle River, NJ.
Buschmann, F., Meunier, R., Rohnert, H., Sommerlad, P.,
and Stal, P. (1995).
Pattern-Oriented Software Architecture: a system of
patterns, volume I.
M.I.Capel
Tema 1
97. Introducción
Análisis y diseño con patrones
Patrones de Diseño y Calidad del Software
Wiley and sons.
Gamma, E., Helm, R., Johnson, R., and Vlissides, J.
(1995).
Design patterns elements of reusable object-oriented
sofware.
Addison-Wesley, Reading, Mass.
Lethbridge, T. and Laganiere, R. (2005).
Object-Oriented Software Engineering: Practical Software
Development Using UML and Java.
McGraw,-Hill.
M.I.Capel
Tema 1