Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Diseño basado en
Componentes (UML)
Chesmann
b. Desarrollo con reutilización
definitivos
Desarrollo Basado en
Componentes
Encontrar e integrar componentes reutilizables.
Es indispensable buscar un equilibrio entre los requisitos ideales
y los servicios prestados por los componentes disponibles.
(1) Determinar los requisitos -- no cambia
(2..3) La búsqueda (negociación incluida) de posibles componentes
que satisfagan los requisitos impuestos tanto por el cliente como
por la arquitectura de la aplicación
(4) Diseño de la arquitectura basada en componentes
Customer Product
Manager Manager
«component» «component» «component»
Customer Sales Product
Dominio/
Lógica de Account
Manager
Negocio
«component»
Accounts
«subsystem»
Persistencia Persistence
«library»
java.sql
Puede integrarse en
cada componente
Larman, C. “UML y Patrones. Introducción al Análisis y Diseño
Orientado a Objetos y al Proceso Unificado ”. Prentice Hall, 2002
Subsistemas de diseño
UI
Web
Dominio
Persistencia
Productos-Ventas Clientes
Transformar en componentes
Las dependencias entre subsistemas se pueden
implementar con conectores
Utilizar el patrón Fachada!
Las interfaces se pueden utilizar para crear las "costuras" de
un sistema:
Identificar las partes cohesivas del sistema
Empaquetar éstas en un componente
Definir una interfaz para cada componente
Dependencias -> interfaces
UI
Web
Dominio
Ventas Productos
Pero difícil de
Reutilizar!!
Persistencia
Productos-Ventas
Dependencias -> interfaces
UI
Web
Ventas
Productos
Ventas.Dominio Productos.Dominio
Ventas.Persistencia
Productos.Persistencia
Acitividades de Diseño
(enfoque Top Down)
Diseño paso a paso…
Asignar
Identificar Diseñar las Diseñar los Verificar los
responsabilidades a
Interfaces Interfaces componentes requisitos…
componentes
Actividades de diseño
Identificar Interfaces Operaciones del Sistema
Asignar responsabilidades componentes (caja negra)
Diseñar en detalle las Interfaces, incluyendo las que
interconectan los componentes
Organizar en paquetes y diseñar los componentes (caja
blanca)
prestamos
Después DS y añadir operaciones:
Clases <<Control>>
<<control>> <<control>>
GestorPrestamos GestorCatalogo
Prestamo
EjPrestable
1
1
<<interface>>
Iconsultar
<<interface>>
IPrestar
+ buscarUsuario() : Usuario
+ crearPrestamo() : void
+ devolverPrestamo() : void
Responsabilidades
IPrestar debe incluir las operaciones de prestar y
devolver un ejemplar
Iconsultar incluirá búsqueda de ejemplares por título,
por signatura, etc
Caja negra:
ComponentePrestamos
IPrestar
Iconsultar
ComponenteCatalogo
3. Diseñar las Interfaces
Para cada interfaz del componente definir en detalle
las Operaciones ofrecidas o requeridas por la
interfaz:
Parámetros de entrada y salida: objetos? int o String?
Pre y post-condiciones
Efectos de cada operación
Naturaleza de la Interfaz (llamada síncrona, mensaje
asíncrono, Web Service)
Para su definición se puede utilizar
UML+OCL
Lenguajes de programación
IDLs
[Organizar en puertos]
Encontrar más interfaces
Herencia e Interfaces!
Estudiar cada asociación:
¿La asociación tiene que ser a otra clase, o puede ser a una
interfaz?
Estudiar los mensaje enviados:
¿El mensaje tiene que ser enviado a otra clase, o puede
utilizar una interfaz?
Buscar grupos de operaciones repetidas, que puedan
ser útiles en el futuro PARA REUTILIZACIÓN
¿Algún componente ya existe en la empresa? ¿Se
puede adquirir? CON REUTILIZACIÓN
4. Diseñar los componentes
4.1. “Romper” el modelo original en paquetes
4.2. Eliminar las posibles asociaciones que cruzan las
fronteras
¿Es necesario exportar alguna clase?
¿Puede usarse un DTO común?
[El DTO más simple es el que corresponde al identificador de
esa clase]
<<interface>>
<<interface>> Iconsultar
IPrestar
+ buscarUsuario() : Usuario
+ crearPrestamo() : void
+ devolverPrestamo() : void
<<interface>>
IPrestable
<<control>>
GestorPrestamos + buscarEjemplarP() : EjPrestable
<<control>>
GestorCatalogo
Prestamo
Ejemplar
0..*
0..*
1 Usuario
EjRevista
EjPrestable
1
Profesor
Alumno
Paquetes no asociados…
ComponentePrestamos
ComponenteCatalogo
<<interface>>
<<interface>> Iconsultar
IPrestar
<<interface>>
IPrestable
<<control>>
GestorPrestamos
<<control>>
GestorCatalogo
Prestamo
- duracion : int
- fecha : Date
- ejemplar : EjPrestable
Ejemplar
0..*
1 Usuario
EjRevista
EjPrestable
Alumno
Profesor
EjPrestable
…y Componentes
¿Interfaces locales?
ComponentePrestamos
ComponenteCatalogo
<<control>>
IPrestar GestorPrestamos IPrestable
Iconsultar
<<control>>
GestorCatalogo
Prestamo
0..*
Ejemplar
1
Usuario
Alumno
Profesor EjPrestable EjRevista
IPrestar
¿…o Interfaces remotas?
IPrestable
Iconsultar
ComponentePrestamos
ComponenteCatalogo
<<control>>
GestorPrestamos <<control>>
GestorCatalogo
Prestamo
0..* Ejemplar
1
Usuario
Alumno
Profesor EjPrestable EjRevista
UML: Caja Blanca
IPrestable
IPrestar
Iconsultar
ComponentePrestamos
ComponenteCatalogo
IPrestar IPrestable
IPrestable
Iconsultar
Iconsultar
<<control>>
GestorPrestamos <<control>>
GestorCatalogo
Prestamo
0..* Ejemplar
1
Usuario
Alumno
Profesor EjPrestable EjRevista
Caja Negra: las dos opciones
ComponentePrestamos
IPrestar
Iconsultar
ComponenteCatalogo
IPrestable
<<EJB modulo>>
cc : ComponenteCatalogo
IPrestable
5. Verificar requisitos
5.1. Verificar los requisitos funcionales
Hacer el seguimiento de cada requisito, utilizando la
estructura funcional
Utilizar una tabla de requisitos funcionales contra componentes
del modelo estructural
buscarUsuario() : Usuario
buscarUsuario() : usuario
comprobarLimite() : boolean
crearPrestamo() : void
buscarEjemplarP() : EjPrestable
crearPrestamo() : void
<<create>>
Prestamo() prestamo : Prestamo
create(prestamo)
6. Análisis crítico
6. Análisis de Interacciones
Analizar la estructura propuesta en busca de interacciones
excesivas (acoplamiento excesivo entre los componentes)
7. Análisis de Flexibilidad
Escenarios “what if ”, ¿qué pasaría si…?
Algunos errores frecuentes
Mala definición de interfaces
Mala definición de responsabilidades
Componentes de tipo utilidad modelados como
componentes funcionales (listados, informes)
Nivel inapropiado de detalle
Se trata de un videoclub con películas (de cada una existen varios ejemplares cada
una). Mantiene información sobre las películas, los socios y los alquileres. La forma de
pago es con cargos y abonos en una cuenta.
Algunos Casos de Uso
39
40
Modelo de Dominio
Cuenta
Socio
ArtistaCine 1 1
- numero : int 0..*
- nombre : String - dni : String 1 {ordered} Movimiento
- nombre : String - fecha : Date
- fechaNacimiento : Date - importe : float
- fechaAlta : Date
- direccion : String
- telefonos : int[1..*]
+ buscarSocio(dni : String) : Socio
Actor Director + crearAlquiler(c : Cinta) : void
Ingreso
1 Cargo
1..* 1 + Ingreso() : void
Productora
0..*
- nombre : String 1 0..* 0..*
0..* Pelicula Alquiler CargoAlquiler
1 1
- titulo : String - fechaAlquiler : Date
<<enum>> + CargoAlquiler() : void
- año : int - horaAlquiler : float
Tema
- tema : Tema 1 - fechaDevolucion : Date[0..1] 1
- infantil : int - duracion : float 0..* - horaDevolucion : float[0..1]
1
0..* 0..1
- accion : int - estaDevuelto : boolean = false
CargoMulta
Cinta + Alquiler() : void
- numero : int
+ buscarCinta(n : int) : Cinta
4.4.1.
Composición y adaptación
Composición de componentes
Es el proceso de ensamblaje de componentes para crear un
sistema.
La composición involucra la integración de los componentes
entre sí y con la infraestructura de componentes.
Normalmente hay que escribir “código pegamento” (“glue
code”) para integrar los componentes
Tipos de composición
a: Composición secuencial
los componentes se ejecutan en secuencia. Esto implica
componer las interfaces que proporciona cada componente.
b: Composición jerárquica
uno de los componentes usa los servicios de otro. La interfaz
proporcionada de un componente se conecta con la interfaz
requerida de otro
c: Composición aditiva
Las interfaces de dos componentes se unen para crear un
nuevo componente. Las interfaces del componente
integrado son una combinación de las interfaces de los
componentes constituyentes.
Compatibilidad de interfaces
Incompatibilidad de parámetros
Las operaciones tienen el mismo nombre pero los parámetros o el
resultado que devuelve son de tipos diferentes
Incompatibilidad operaciones
Los nombres de las operaciones en las interfaces compuestas son
diferentes
Ausencia de operaciones
La interfaz que proporciona el interfaz de un componente es un
subconjunto de la interfaz que requiere de otro
Ejemplos de adaptación
Recolector de datos y sensor
Glue code
Ej: adaptador que extrae el código postal de addressFinder con
postCodeStripper y lo pasa al componente mapper
/* Otros… */
public Photograph retrieve (Identifier pid) ;
public CatalogEntry catEntry (Identifier pid) ;
Semántica y sintaxis
¿qué pasa si el identificador de la fotografía ya está
asociado con una fotografía en la biblioteca?
Los componentes
se realizan con «device»
n1 node
artefactos físicos
que los
implementan «component»
c1 «artifact»
a1
El modelo de
despliegue describe artifact
donde se
encuentran «device»
físicamente n2
«component» «artifact»
c2 a2
Modelo de despliegue
Describe cómo se distribuye la funcionalidad en nodos
físicos
Se modela la traducción de la arquitectura de software a la
arquitectura del sistema físico
Es el modelo del sistema como artefactos desplegados
en los nodos o recursos computacionales
Los nodos tienen relaciones que representan los métodos de
comunicación entre ellos, por ejemplo http, iiop, netbios
Los artefactos representan software, por ejemplo, un .JAR,
.class o .exe
Pasos del Diseño de la arquitectura física:
Determinar nodos y conexiones
Despliegue de artefactos
UML: diagramas de
Despliegue
«device» y «execution environment» son esteretipos
estándar
«device» «device»
WindowsPC LinuxServer
Relaciones jdom.jar
realiza
«manifest» «manifest» «manifest»
Con otros
artefactos: «component»
Book
«component»
Library
«component»
Ticket
Dependencia ISBN TicketID
Composición 1 1
LibraryImpl
1 1
BookImpl TicketImpl
«directory»
META_INF
«file»
MANIFEST.MF
UML Java Profile
«device»
Server: WindowsPC
«deployment spec»
converterDeploymentSpecification
BeanClass: ConverterBean
BeanName: ConverterBean
BeanType: StatelessSession
Ejemplo simple
Presentación
Dominio-DTO <<Servlet>>
Controller
<<entity>> - fecha_arranque : String JSPs
Manufacturer - num_accesos : int
- manufacturerId : Integer - url : String
- name : String # processRequest() : void
- addressline1 : String # doGet() : void
- addressline2 : String # doPost() : void
- city : String + getServletInfo() : String
- state : String
- zip : String
- phone : String
- fax : String
- email : String
- rep : String ManufacturerManagerRemote
Despliegue
<<Stateless EJB>>
ManufacturerManager
Acceso a Datos
# getEntityManager() : EntityManager
+ ManufacturerFacade()
Aplicacion.war
<<Servlet>>
Módulos:
Controller
<<entity>>
Manufacturer
con dos
proyectos:
.war
.jar Aplicacion.jar
<<Stateless EJB>>
ManufacturerManager
ManufacturerFacadeLocal <<entity>>
Manufacturer
<<Stateless EJB>>
ManufacturerFacade
Dos servidores:
Servidor Web y Servidor JEE
PC WIndows/Linux
0..* 1
Chrome.exe <<http>> Servidor TomCat
Aplicacion.war
1..*
<<http>>
1
Servidor EJB
Aplicacion.jar
Servidor Linux/Oracle 1 1
Base Datos
Un servidor (y servidor BD)
Servidor GlassFish
PC WIndows/Linux Aplicacion.ear
Chrome.exe Aplicacion.war
Aplicacion.jar
Servidor Linux/Oracle
Base Datos