Académique Documents
Professionnel Documents
Culture Documents
Instituto de Computación
Facultad de Ingeniería
Universidad de la República
http://www.fing.edu.uy/inco
Resumen
El desarrollo basado en componentes (CBD) es un área nueva y poco
explorada. Uno de los principales problemas que enfrenta esta área es el de
definir las tareas a desarrollar y las técnicas a aplicar para la producción de
software de buena calidad. El software en el que estamos interesados está
orientado a ambientes empresariales y es de gran porte. El constante cambio
en los requerimientos es uno de los aspectos más característicos del desarrollo
actualmente, un software de calidad debe estar preparado para absorber este
tipo de cambios con el menor impacto posible. La definición de una
arquitectura de componentes resulta fundamental en este sentido por permitir
observar y manejar globalmente los cambios. Inclusive, el cambio se
experimenta a nivel de las tecnologías aplicables, tanto para el desarrollo
como para el deploy de los sistemas, por lo que dicha arquitectura de
componentes no debe apoyarse en una implementación particular sino en una
especificación de los mismos. En este trabajo se proponen actividades que
guían la especificación de una arquitectura basada en componentes e
independiente de la tecnología para sistemas de tipo empresarial y de gran
porte, donde el énfasis principal esta hecho en facilitar el cambio.
Palabras clave: Desarrollo Basado en Componentes, Arquitectura de Software
1
1. Introducción
El desarrollo basado en componentes (CBD) es un área nueva y poco explorada. Se lo suele asociar e
incluso confundir con el desarrollo orientado a objetos (OOD); a pesar de que ambos enfoques están
relacionados, los mismos son aplicables a sistemas de distinto porte. Generalmente OOD es asociado con
Programming-in-the-Small, mientras que CBD es más aplicable a Programming-in-the-Large.
Actualmente existen plataformas que permiten el desarrollo de aplicaciones basadas en componentes (e.g.
J2EE). Muchas empresas han adaptado sus metodologías para adecuarlas a la plataforma sobre la cual
montarán sus desarrollos. Este cambio en las metodologías, generalmente en forma ad hoc, ha llevado a
que los artefactos construidos durante el diseño sean particulares a la tecnología a utilizar. Este hecho no es
beneficioso considerando que las tecnologías de componentes son tecnologías emergentes y en continua
evolución.
El presente artículo es el resultado del trabajo de investigación de los autores en esta área. Como anexo de
este documento se encuentran tres juegos de transparencias que ahondan en distintos puntos de la
metodología. La estructura de este documento es la siguiente: la primera sección presenta los principios que
rigen el paradigma de componentes. La segunda sección presenta las líneas generales de la metodología,
basada en la propuesta del Racional Unified Process [RUP]. La adecuación de los workflows de las
disciplinas del RUP en la metodología propuesta es presentada en la tercera sección. La cuarta sección
muestra la aplicación de la metodología sobre a un caso de estudio. Por último se concluye y se presentan
trabajos futuros.
2. Principios de Componentes
2.1. Objetivos
El desarrollo basado en componentes es una aplicación de la técnica de divide & conquer para manejar la
complejidad. La diferencia principal con los métodos estructurados es principalmente que el análisis y
diseño es realizado dentro del mismo paradigma que la implementación. Esta implementación queda
relegada a un segundo plano, siendo importante dar una solución lógica al problema, previo a su
codificación. Este principio fue utilizado en el paradigma de orientación a objetos, el hecho de combinar
operaciones e información en una misma unidad, y de contar con técnicas de modelado dentro del mismo
paradigma, hizo que la orientación a objetos tuviera un éxito importante. El principal objetivo que se
persiguió con la introducción de este paradigma fue el reuso. A pesar de contar con técnicas de buenas
prácticas de diseño, como ser los patrones GRASP [Lar], no es sencillo mantener las unidades de software
(i.e. clases) con el nivel de acoplamiento y cohesión deseables. La necesidad de reusar una clase implica
llevar consigo otros artefactos que en un principio pueden no ser necesarios para el nuevo escenario donde
se quiere reaprovechar la clase.
Por esta razón, el paradigma de componentes no se focaliza en el principio de reuso sino que ataca
principalmente la mantenibilidad. El reuso es un objetivo admirable pero no es sencillo de obtener. Bajo el
enfoque de componentes se busca construir para el cambio. Los sistemas actuales cambian sus
requerimientos incluso cuando el sistema ya está en producción. El principal objetivo de un componente
no es el reuso sino que sea fácilmente reemplazable. El hecho de ser reemplazable implica que una nueva
implementación de un componente pueda ser utilizada en lugar de una implementación anterior sin afectar
el funcionamiento del resto de los componentes. Nuevas implementaciones pueden por ejemplo mejorar
su performance o proveer nuevos servicios; el único requerimiento es que provea los mismos servicios
provistos por la implementación anterior.
El enfoque de componentes enfatiza en la arquitectura del sistema y en la capacidad de manejar al sistema
completo, de forma tal que es en base a esa arquitectura que se evalúa el impacto del cambio y no en base a
información local. Las decisiones internas a los componentes son un objetivo secundario, siendo lo
primordial su interacción con el resto de los componentes del sistema. El enfoque propone concentrarse
en el todo y no en las partes.
2.2. Principios
Los componentes son unidades de software que se rigen por ciertos principios. Éstos son los mismos que
los presentes en el paradigma de orientación a objetos: unificación de datos y comportamiento, identidad y
encapsulamiento. A estos principios se le agrega el del uso obligatorio de interfaces. Cada cliente de un
componente depende exclusivamente de la especificación del componente y no de su implementación.
Esta importante separación es la clave para reducir el acoplamiento y el buen manejo de las dependencias.
2
La especificación de un componente esta formada por un conjunto de interfaces que describen el
comportamiento del componente. Las interfaces describen este comportamiento en función de un modelo
de información, el cual es una proyección del modelo de información del propio componente. Las
dependencias entre componentes son dependencias de uso de interfaces, no son dependencias directas
sobre el componente. Muchas implementaciones pueden realizar una especificación de componente
permitiendo de esta forma contar con la propiedad de reemplazabilidad.
3.1. Arquitectura
El término ‘arquitectura’ es heredado de otras disciplinas de la ciencia. Se entiende por arquitectura a un
conjunto de piezas de distintos tipos, que encajan entre sí y cumplen una función determinada. La
arquitectura presenta además el impacto del cambio de una de las piezas. Dentro del paradigma de
componentes, las piezas (o building blocks) son los componentes. La arquitectura de componentes dirá
con que tipos de componentes y en qué relación de dependencia se encuentran.
Como fue mencionado antes, la metodología aquí propuesta busca utilizar el paradigma de componentes a
sistemas empresariales de gran porte. Para ello consideramos arquitecturas distribuídas, en múltiples capas,
que incorporan fuentes de datos heterogéneas, sistemas legados y paquetes off-the-shelf.
El estilo de arquitectura en capas es aplicable a este tipo de sistemas. Cada capa sugiere un tipo diferente de
componentes, e indica el rol que juegan los componentes que residan en ella. La arquitectura propuesta se
presenta en la siguiente figura:
Interfaz de Usuario
Manejo de la lógica de UI
Diálogos del Usuario
Manejo de la lógica de casos de uso
Control de la sesión de usuario
Aplicación
Figura 1 - Arquitectura
El enfoque metodológico se centra en aquellas capas que representan las funcionalidades del sistema, a
saber, la capa de Servicios del Sistema y la capa de Servicios del Negocio.
La definición de la arquitectura de componentes cubre aspectos únicamente lógicos y es totalmente
independiente de la tecnología con la cual se implementarán los componentes y sobre la cual se hará el
deploy del sistema. Esta vista lógica nos permite medir el nivel de acoplamiento del sistema y razonar sobre
los efectos de modificar o reemplazar un componente. La independencia de la tecnología nos permite
abstraernos de los tecnicismos de éstas así como elegir la más apta dependiendo del sistema que se esté
desarrollando.
3
base para sus propios procesos. RUP debe ser ajustado a las necesidades y realidades del equipo de
desarrollo.
Como proceso de ingeniería de software es amplio y diverso; su objetivo principal es asegurar el desarrollo
de software de alta calidad que satisfaga los requerimientos del usuario final dentro de un tiempo y
presupuesto predecible. El proceso de RUP se resume en la siguiente figura:
RUP presenta un proceso iterativo organizado en cuatro fases. La cantidad de iteraciones realizadas en cada
fase depende principalmente del proyecto. La fase de Inception tiene como objetivo establecer el alcance
del proyecto, discriminar los escenarios de aplicación que involucran importantes decisiones de diseño,
exhibir una arquitectura inicial y estimar potenciales riesgos. La segunda fase, Elaboration, busca asegurar la
arquitectura del sistema resolviendo los principales riesgos; produce además un prototipo evolutivo del
sistema. Finalmente, Construction tiene como objetivo completar el análisis, diseño e implementación y
testeo de la totalidad de los requerimientos. Una arquitectura robusta permite un alto grado de paralelismo
en estas actividades. La fase de Transition refiere a la puesta en producción del producto en las
instalaciones del cliente.
El avance en el tiempo del proyecto esta dado por el avance en las fases. La división del mismo en
disciplinas brinda una organización de las actividades a realizar y permite comprender al proyecto desde el
punto de vista del desarrollo en cascada. Una disciplina es un conjunto de actividades relacionadas con un
área específica dentro del proyecto.
3.3. Metodología
La metodología propuesta abarca las tres primeras fases propuestas en el RUP, y propone actividades
correspondientes solamente a las disciplinas Business Modeling, Requirements y Analysis & Design.
Recordar que nuestro enfoque es independiente de la tecnología por lo cual no son consideradas las
disciplinas de implementación, testeo y deployment y tampoco la fase Transition. Asimismo, este enfoque
refiere a actividades exclusivamente de desarrollo de software y no a actividades de gestión y
gerenciamiento del mismo. Así, las otras disciplinas del RUP tampoco fueron consideradas.
Para una mayor aplicabilidad del enfoque hemos reformulado los workflows que ocurren en la
metodología. Los mismos no corresponden directamente a cada disciplina sino que corresponden a las
fases. Cada workflow indica claramente el lugar donde ocurren las iteraciones.
Las actividades presentes en el workflow de la fase Inception refieren principalmente a las actividades de la
disciplina Business Modeling propuesta por RUP. El lector puede referirse a la bibliografía para hallar una
descripción detallada de las mismas.
4
Figura 3 - Workflow de la fase Inception
El workflow de la fase Elaboration ataca los procesos en el orden dado por el ranqueo de procesos
realizado en la fase anterior. No es necesario atacar todos los procesos, sino aquellos críticos desde el
punto de vista de la arquitectura. Las actividades presentes en este workflow son similares a las propuestas
en el RUP. Al igual que las actividades de la fase anterior, el lector podrá identificar claramente cuales son
las tareas a realizar en cada una de ellas; a su vez puede referirse a la bibliografía. Dos de las actividades,
distinguidas en el diagrama, son aquellas que fueron incorporadas dentro de esta metodología; están
fuertemente basadas en la propuesta de Cheesman y Daniels [CD].
El workflow para la fase Construction es análogo al de la fase Elaboration. Además, dado que en la fase
Construction la arquitectura esta lo suficientemente estable, una nueva actividad debe llevarse adelante. La
misma lleva el nombre de Especificación de Componentes.
La siguiente sección presentará en más detalle cada una de las actividades particulares al enfoque aquí
presentado, a saber Identificación de Componentes, Interacción de Componentes y Especificación de
Componentes.
5
4. Actividades Particulares al Enfoque
4.1. Identificación de Componentes
Esta etapa identifica a partir de los artefactos generados en las actividades anteriores el conjunto de
interfaces y especificaciones de componentes que poblaran la arquitectura.
Esta actividad tiene como objetivos:
Crear un conjunto inicial de interfaces y especificaciones de componentes, tanto a nivel de componentes de
sistema como de componentes de negocio.
Producir el modelo de tipos del negocio inicial, partiendo del modelo conceptual preliminar.
Presentar las interfaces y especificaciones de componentes en una arquitectura de componentes inicial,
decidiendo de que forma se agrupan las interfaces en especificaciones de componentes.
La siguiente figura muestra las tareas que se proponen para llevar adelante esta actividad.
6
Figura 6 - Tareas que componen la actividad Interacción de Componentes
7
5. Caso de Estudio
El caso de estudio abordado representa un sistema de información de porte empresarial en el dominio
Hotelería, y concierne principalmente a la gestión de una cadena hotelera. Este sistema, llamado Sistema de
Gestión Hotelera, esta conformado por varios subsistemas; entre ellos se encuentra el Subsistema de
Reservas, objeto de estudio de esta sección. Este caso de estudio fue atacado originalmente en [CD01], con
la metodología allí propuesta. El lector podrá comparar ambos abordajes ayudando así al entendimiento de
las adaptaciones introducidas en este trabajo respecto al propuesto en [CD01].
Esta sección presenta los artefactos generados en cada una de las actividades propuestas en este trabajo.
No se incluyen, en cambio, los artefactos generados para satisfacer todos los requerimientos del Subsistema
de Reservas. Se presenta solamente los artefactos necesarios para el buen entendimiento de la aplicación de
la metodología.
8
5.1.2. Identificar Procesos de Negocio
El caso de estudio se centra en el Subsistema de Reservas del Sistema de Gestión Hotelera. Para este
subsistema se identifican los siguientes procesos de negocio:
Gerenciamiento de la cadena hotelera (P1)
Este proceso involucra un conjunto de procesos simples encargados del gerenciamiento. Permite
la incorporación de nuevos hoteles al sistema, así como la eliminación de los mismos. Se encarga
además de la administración del personal de la cadena de hoteles.
Reserva de Habitación (P2)
Este proceso administra todas las actividades de reserva por parte de los clientes. Involucra
modificaciones y cancelaciones de reservas, así como la detección de aquellos clientes que no
tomaron su reserva. La actividad de check-in está incluida en este proceso, siendo el camino a un
estado final del mismo.
Check-out y Facturación (P3)
Este proceso cubre el check-out de los huéspedes, así como la facturación de los servicios
contratados por ellos. La contratación de servicios por parte de los huéspedes no forma parte de
este proceso.
Consultas Estadísticas (P4)
Este proceso ocurre cuando la gerencia general realiza un estudio de la situación de la cadena
hotelera. Mediante este proceso se extraerá la información del sistema útil para crear un data-
warehouse sobre el cual realizar variados tipos de estudios.
9
posibles problemas con la interoperabilidad con dichas
herramientas.
llega cliente/
Esperar evento
solicitud/ Cancelar reserva
cancelar/
[habitacion disp]
Ver disponibilidad Hacer reserva
Procesar NSP
Modificar reserva
10
El proceso de aquellas reservas en las que el cliente asociado no se haya presentado no será realizado en
forma automática por el sistema, sino que se realizará a solicitud del actor involucrado en dicha actividad.
El sistema, además, mediante asistencia del usuario realizará tareas en las otras actividades marcadas en el
proceso.
Debido a estas decisiones, se refina el diagrama de actividad asociando responsabilidades sobre las
actividades por medio de andariveles.
Huesped
Tomar reserva
Procesar NSP
Modificar reserva
System
Sugerir Alternativas Confirmar reserva Notificar Facuracion
Puede asociarse conceptos del dominio de la aplicación a los actores aquí definidos. El mapeo primario es:
Huésped → Huesped
Cliente → Huésped, CreadorDeReserva
Recepcionista → CreadorDeReserva
Gerente → CreadorDeReserva, AdministradorDeReservas
11
(CU2.2) CancelarReserva CancelarReserva CreadorDeReserva
(CU2.3) ModificarReserva ModificarReserva CreadorDeReserva
ConfirmarReserva
(CU2.4) TomarReserva TomarReserva Huesped
NotificarFacturacion SistemaDeFacturacion
(CU2.5) ProcesarNSP ProcesarNSP AdministradorDeReservas
NotificarFacturacion SistemaDeFacturacion
1 1..* 1 1..*
hotelContactado
Hotel
*
1
1
* 1..*
*
ubicacion
Cliente Reserva Habitacion
1 * * 0..1
1 1 *
*
0..1 direccionContacto
Direccion
0..1 1
1
Cuenta TipoHabitacion
1
0..1
Pago
12
vencida el sistema notifica a SistemaDeFacturacion que se cargue a la cuenta del cliente.
Los casos de uso (CU2.2), (CU2.3) y (CU2.4) involucran una secuencia común de las actividades necesarias
para identificar la reserva en cuestión. Se factoriza entonces la secuencia común en un nuevo caso de uso
(CU2.13) IdentificarReserva.
Nombre (CU2.13) IdentificarReserva
Actores Solamente para inclusión
Sinopsis Identifica una reserva existente.
Los casos de uso (CU2.1) y (CU2.3) involucran la actividad de confirmación por e-mail al cliente. Se
factoriza entonces como un nuevo caso de uso (CU2.14) ConfirmarReserva.
Nombre (CU2.14) ConfirmarReserva
Actores Solamente para inclusión
Sinopsis Confirma la reserva al cliente por e-mail.
13
System
ABMHotel
ABMTipoDeHabitacion
AdministradorHotel
ABMHabitacion
ABMRecepcionista
System
«include»
HacerReserva
ConfirmarReserva
«include»
ModificarReserva
CreadorDeReserva
«include» TomarReserva
CancelarReserva
«include»
«include»
IdentificarReserva Huesped
ProcesarNSP
ModificarCliente
AdministradorDeReservas RemoverReservas
Caducas
SistemaDeFacturacion
RemoverClientes
Inactivos
Los casos de uso CU2.6, CU2.7, CU2.8, CU2.9 y CU2.10 involucran actividades de gerenciamiento de
información, y pueden ser postergados hasta la fase de construcción.
14
Los casos de uso CU2.11 y CU2.12 son de interés para el proceso de negocio. En cambio son
requerimientos secundarios, por lo que pueden ser postergados hasta la fase de construcción.
En la fase de elaboración se atacará solamente el caso de uso CU2.4 por las razones expuestas
anteriormente. Los casos de uso CU2.1, CU2.5, CU2.3 y CU2.2 serán atacados posteriormente.
15
Nombre (CU2.13) IdentificarReserva
Actores Solamente para inclusión
Sinopsis Identifica una reserva existente.
Curso Típico de Eventos
1. El Actor indica el identificador de la reserva.
2. El Sistema localiza la reserva.
Extensiones
2. El Sistema no encuentra la reserva con el identificador indicado
a. El Actor provee nombre y código postal.
b. El Sistema muestra las reservas activas para el cliente con dicha información.
«derived»
c. El Actor elige la reserva correspondiente.
d. Fin.
«interface type»
2. El identificador indicado refiere a una reserva en otro hotel. IIdentificarReserva
a2. Fallo.
2b. No hay reservas activas para el cliente en este hotel. getReserva()
a. Fallo.
«becomes»
IdentificarReserva
«instance»
«include»
«dialog type»
«instance» DlgTomarReserva
TomarReserva
«becomes»
En el caso de uso CU2.4 el Huesped llega al hotel e indica que tiene una reserva. Se procede a
identificar la reserva del Huesped utilizando CU2.13 especificado en IIdentificarReserva. La
operación getReserva() es utilizada para dicho fin. Los detalles de la reserva son confirmados por
el Huesped. Para comenzar la estadía, el sistema asigna una habitación y notifica al Sistema de
Facturación que la estadía ha dado comienzo. Estas actividades son realizadas por la operación
comenzarEstadia().
Las interfaces que se han definido se encuentran en la capa Servicios del Sistema.
Definir el Modelo de Tipos del Negocio
Se eliminó el concepto CadenaDeHoteles ya que el Sistema solo representa a una cadena de hoteles.
La asociación Hotel-Cliente fue eliminada ya que no será mantenida por el Sistema. Las cuentas y
los pagos serán responsabilidad del Sistema de Facturación, por lo que también es eliminado. El
concepto Recepcionista no esta ligado a las funcionalidades del caso de uso en consideración, por lo
que también es eliminado.
Se refinó el modelo agregando atributos para los tipos participantes y definiendo un conjunto de
tipos de datos y restricciones en el modelo.
Se agregaron además reglas para el precio y la disponibilidad, por lo que se agregaron nuevos
atributos para reflejar las reglas.
Reglas de disponibilidad:
▪ (R1) Una tipo de habitación esta disponible si la cantidad de habitaciones reservadas en todas las
fechas del rango de fechas es menor que la cantidad de habitaciones. Se agregó un atributo
parametrizado disponible() en TipoHabitacion en donde se ubicará esta regla.
▪ (R2) Nunca se puede tener más reservas para un tipo de habitación en una fecha que
habitaciones de ese tipo (no hay overbooking).
16
Reglas de precios:
▪ (R3) El precio de un tipo de habitación para una estadía es la suma de los precios para cada día
de la estadía. Para capturar esta regla se agregó un atributo parametrizado por fecha, teniendo
así un precio variable en el modelo. Se agregó un atributo parametrizado precioEstadia() en
donde se ubicará esta regla de negocio.
Se detectó que Hotel y Cliente son core types. Un core type es un business type cuya existencia es
independiente dentro del negocio. Los otros tipos de negocio, como ser TipoHabitacion,
Habitacion y Reserva, son tipos que dependen (existencialmente) del Hotel. Los core types han sido
indicados en el Modelo de Tipos del Negocio con el estereotipo «core». Todos los otros tipos del
modelo aportan detalles a los core types.
«type»
«core» TipoHabitacion
Hotel 1
1 1..* nombre : String
nombre : String
precio(in f : Fecha) : Importe
1 precioEstadia(in rf : RangoFechas) : Importe
1 disponible(in rf : RangoFechas) : Boolean
*
*
«core»
«type»
Cliente «type»
Reserva ubicacion
nombre : String Habitacion
rid : String *
direccion : Direccion 1 * numero : String
fechas : RangoFechas
email : String
* 0..1
Restricciones:
context Hotel inv:
self.habitacion.tipoHabitacion→asSet() = self.tipoHabitacion
17
«datatype» «datatype» «datatype» «datatype»
Boolean String Fecha Importe
«datatype» «datatype»
RangoFechas Direccion
inicio : Fecha Calle : String
fin : Fecha CodigoPostal : String
asSet() : Set(Fecha) Estado : String
includes(in : Fecha) : Boolean Pais : String
*
*
«core»
«type»
Cliente «type»
Reserva ubicacion
nombre : String Habitacion
rid : String *
direccion : Direccion 1 * numero : String
fechas : RangoFechas
email : String
* 0..1
*
*
1
«interface type»
IClienteMgt
18
deployment y reemplazo en un sistema basado en componentes. El componente será el building
block del Sistema.
Las interfaces de sistema detectadas a partir de los casos de uso de un mismo proceso se solapan
fuertemente. Por dicha razón se crea una especificación de componente SistemaDeReserva
encargada de dar soporte a dichas interfaces. Inicialmente se cuenta con las interfaces
correspondientes a los dos casos de uso que se esta tratando en esta iteración, a saber,
ITomarReserva e IIdentificarReserva.
Se tendrá además una especificación de componente para cada sistema existente detectado en
etapas anteriores. Por ello, se incluye SistemaDeFacturacion.
Para las interfaces de negocio, el punto de partida será tener una especificación de componente por
cada interfaz detectada. Por lo tanto se tendrá HotelMgr y ClienteMgr para IHotelMgt e
IClienteMgt respectivamente. Se utiliza el sufijo Mgr (de Manager, o Gerenciador) para estas
especificaciones de componente.
La dependencia entre los componentes puede resultar intuitiva. Sin embargo se esperará a la
siguiente etapa para detectarla. Debido a ello la arquitectura inicial es prácticamente desconexa.
ITomarReserva
ISistemaDeFacturacion
IIdentificarReserva
Se sabe del caso de uso CU2.13 que la operación debe obtener los detalles de la reserva
correspondiente al identificador provisto por el actor. Se define entonces un tipo de datos que
represente a la información de una reserva. Generalizaremos esta operación devolviendo además los
detalles del cliente que realizó la reserva.
IIdentificarReserva::getReserva(
in rid : String,
out dr : DetallesReserva,
out dc : DetallesCliente)
signals ReservaInexistente
El parámetro rid es el identificador de la reserva, dr son los detalles de la reserva con identificador
rid, y dc son los detalles del cliente que realizó la reserva. ReservaInexistente indica que el
identificador de la reserva provisto no existe en el Sistema.
getReservasCliente()
Notar que el caso de uso CU2.13 presenta extensiones al curso típico de eventos. Que la reserva
corresponda a otro hotel no será corroborado por esta operación, por lo que deberá ser
corroborado por algún componente en una capa superior. Se necesita, en cambio, una operación
que permita detectar todas las reservas activas que corresponden a un cliente determinado. Se
agrega entonces la operación getReservasCliente(). Esta operación recibe el identificador de un
Cliente y devuelve las reservas activas del mismo. La lógica del caso de uso, manejada en el diálogo
de usuario, al no encontrar la reserva deseada debe buscar un cliente según los criterios de búsqueda
del cliente. Una vez elegido el mismo, debe buscar las reservas de un cliente dado, según su
identificador.
IIdentificarReserva::getReservasCliente(
in cid : ClienteId)
: Set(DetallesReserva)
19
El parámetro cid es el identificador del cliente. La operación devuelve un conjunto con los detalles
de las reservas activas del cliente.
comenzarEstadia()
Una vez ubicada la reserva que será tomada por el Huesped, se indica al Sistema que una estadía
dará comienzo mediante esta operación. Según el caso de uso CU2.4 el Sistema debe asignar una
habitación a la reserva e indicar al usuario la habitación en la que se hospedará. Se notifica además al
Sistema de Facturación que debe abrir una cuenta para un nuevo cliente. Se cobrará por la estadía al
momento del check-out (proceso de negocio P3). En ese momento se conoce exactamente la
cantidad de días que se ha hospedado el Huesped.
ITomarReserva::comenzarEstadia(
in rid : String,
out n : String)
: SistemaDeReservas 2: d
/ IIdentificarReserva c :=
g et
D et
alle
sCli
e n te
( dr .
clie
n te
)
/ IClienteMgt
: SistemaDeReservas / IHotelMgt
/ IIdentificarReserva
dr)
(rid, / IHotelMgt
erva )
lle sRes dia(rid,n
tDeta rEsta
1: ge omenza
2: c
comenzarEstadia(rid, n) 3: dc := getDetallesCliente(dr.cliente)
: SistemaDeReservas / IClienteMgt
/ ITomarReserva
4: a
brirC
uen
ta(d
r, dc
)
/ ISistemaDeFacturacion
La siguiente figura muestra las interfaces y operaciones descubiertas en esta etapa. Estas últimas son
obtenidas de las interacciones realizadas.
20
«interface type»
IIdentificarReserva
«interface type»
ITomarReserva
«interface type»
IHotelMgt
«interface type»
IClienteMgt
«interface type»
ISistemaDeFacturacion
«datatype» «datatype»
HotelId ClienteId
«interface type»
ISistemaDeFacturacion
{frozen} 1
21
Figura 24 - Responsabilidad de asociaciones entre componentes
Hay distintas opciones para asegurar que las referencias entre componentes sean válidas; estas son:
▪ La responsabilidad se le asigna al Component Object que almacena la referencia; se le da
responsabilidad total y exclusiva
▪ La responsabilidad se le asigna al Component Object al que pertenece el objeto de la referencia;
éste debe tener un mecanismo para saber cuáles componentes tienen referencias a él y
notificarlos según corresponda
▪ La responsabilidad se le asigna a un tercer Component Object, generalmente más arriba en la
cadena de llamadas
▪ Permitir y tolerar referencias inválidas
▪ Deshabilitar la baja de información
Considerando las tres primeras opciones, se presenta a continuación cual sería la decisión a tomar
para cada una de ellas:
▪ Todas las solicitudes para eliminar un cliente son enviadas a HotelMgr, quien le enviará la
solicitud a ClienteMgr. Ningún otro Component Object podrá acceder a ClienteMgr.
▪ ClienteMgr notifica a HotelMgr sobre la eliminación de un Cliente (aplicación de Observer)
▪ SistemaDeReserva será responsable de eliminar clientes interactuando con ClienteMgr y
HotelMgr
Refinar la Arquitectura
La arquitectura de componentes refinada para el proceso P2 se presenta en la siguiente figura.
«dialog type»
IDlgTomarReserva
DlgTomarReserva
IIdentificarReserva
ISistemaDeFacturacion
ITomarReserva
IHotelMgt IClienteMgt
22
5.3. Fase Construction
5.3.1. Definir Modelos de Información para Interfaces
23
Figura 28 - Modelo de Información para IIdentificarReserva
and
24
-- la reserva no debe estar tomada
r.tomada = false
post:
let r := reserva->select(res | res.id = rid)->any()
let habs := reserva.hotel.habitacion->asSet()
let h := habs->exists(h | h.tipoHabitacion = r.tipoHabitacion and
h.reserva.fecha.asSet()->asSet())->any()
in
r.habitacion = h and
r.tomada = true and
n = h.nombre and
h.reserva = h.reserva@pre->including(r)
7. Referencias Bibliográficas
[CD] UML Components
John Cheesman, John Daniels
Addison-Wesley, 2001
ISBN 0-201-70851-5
[RUP] Rational Unified Process
Racional Software Corporation, 2002
http://www.rational.com/rup
[Lar] Applying UML and Patterns
Craig Larman
Prentice-Hall, 2002
ISBN 0-13-092569-1
25