UML 2 - Iniciación Ejemplos y Ejercicios Corregidos (3 Edición)
UML 2 - Iniciación Ejemplos y Ejercicios Corregidos (3 Edición)
UML 2 - Iniciación Ejemplos y Ejercicios Corregidos (3 Edición)
Motivaciones de la obra
UML (Unified Modeling Language o lenguaje unificado de modelación) es un lenguaje
gráfico destinado al modelado de sistemas y procesos. Está basado en la orientación a
objetos que condujo, en primer lugar, a la creación de lenguajes de programación como
Java, C++ o Smalltalk.
UML está unificado, ya que deriva de varias notaciones precedentes. En la actualidad UML
es promovido por el OMG (Object Management Group), un consorcio de más de 800
sociedades y universidades activas en el campo de las tecnologías orientadas a objetos.
UML es un lenguaje semánticamente rico y, por tanto, resulta bastante difícil retener todos
los conceptos en los que se basa. Esperamos que la presente guía constituya una
herramienta útil para comprenderlos y memorizarlos, y pueda servir de referencia a la hora
de modelar con UML.
Mientras lee la obra imagine que se encuentra al frente de una granja de cría de caballos.
Podríamos situar el escenario en Kentucky. En ese caso su rancho estaría compuesto por
una manada de quarter horse. No obstante, si se decanta por un ambiente más distinguido,
entonces su papel sería el de director de un picadero en Andalucía formado por purasangres
ingleses destinados a la cría de yearlings. Sea cual fuere la elección, deberá llevar a cabo un
seguimiento riguroso y gestionar una gran cantidad de datos con vínculos específicos entre
sí y ciclos propios.
No cabe duda de que se le plantearán a diario preguntas como estas:
Contenido de la obra
La obra se organiza en once capítulos cuyo contenido describimos brevemente a
continuación.
Capítulo 1
La presente introducción.
Capítulo dedicado, por un lado, al origen del UML y, por otro, al Proceso Unificado y a la
MDA (Model Driven Architecture o arquitectura guiada por modelos).
El objetivo del capítulo 4 es mostrar los casos de uso empleados para describir los
requisitos funcionales perseguidos a la hora de redactar el pliego de condiciones de un
sistema o las funcionalidades de un sistema existente.
El capítulo 5 explica la manera en que UML representa las interacciones entre objetos. La
descripción de las interacciones se utiliza también para ver qué objetos componen un
sistema. La vista está basada en las interacciones que intervienen en los casos de uso del
sistema.
El capítulo incluye un estudio del diagrama de clases. Dicho diagrama contiene los
atributos, métodos y asociaciones de los objetos. Es básico a la hora de modelar un sistema
mediante objetos. De todos los diagramas UML, es el único obligatorio en tales modelados.
El capítulo 7 está dedicado a los empaquetados. UML 2 describe los empaquetados con
ayuda de un diagrama específico. Un empaquetado es un agrupamiento de elementos de
modelado: clases, componentes, otros empaquetados, etc.
El capítulo 8 estudia el ciclo de vida de los objetos. El ciclo de vida de un objeto está
constituido por las diferentes etapas o estados por los que éste pasa para participar, dentro
del sistema, en la realización de un objetivo. Un estado corresponde a un momento de
actividad o de inactividad (espera) del objeto.
Anexo 3 - Glosario
Anexo 4 - Léxico
Anexo 6 - Bibliografía
Introducción
El presente capítulo está dedicado, por un lado, al origen del UML y, por otro, a dos
elementos vinculados a UML:
En los años 80 y principios de los 90, las notaciones gráficas se multiplican y, muy a
menudo, cada uno utiliza su propia notación. En 1994, James Rumbaugh y Grady Booch
deciden unirse para unificar sus notaciones, procedentes de sus respectivos métodos: OMT
para James Rumbaugh y método Booch para Grady Booch. En 1995, Yvar Jacobson decide
unirse al equipo de los ”tres amigos”. El equipo trabaja entonces dentro de Rational
Software.
Desde entonces, la Task Force ha actualizado UML en varias ocasiones. En marzo de 2003
ve la luz la versión 1.5, que ofrece la posibilidad de describir acciones gracias a una
extensión de UML llamada Action Semantics o semántica de acciones.
La versión 2.0 fue publicada en julio de 2005. Constituye la primera evolución importante
desde la aparición del UML en 1997. A ella se han ido añadidendo numerosos diagramas y
los ya existentes se han enriquecido con nuevas construcciones. Desde julio de 2005 esta
versión 2.0 ha sido mejorada. En febrero 2009, la versión 2.2 se publicó incluyendo la
taxonomía oficial de los perfiles UML. La última versión es la 2.4, publicada en agosto de
2011.
La figura 2.1 ilustra la evolución de UML y traza su origen y sus principales versiones con
ayuda de un diagrama de actividad.
El Proceso Unificado
El Proceso Unificado es un proceso de realización o de evolución de software enteramente
basado en UML, de ahí el interés de presentarlo en esta obra. Está constituido por un
conjunto de directivas que permiten producir software a partir del pliego de condiciones
(requisitos). Cada directiva define quién hace qué y en qué momento. Un proceso permite,
por tanto, estructurar las diferentes etapas de un proyecto informático.
Los tres autores del Proceso Unificado son los mismos que los del UML. No obstante, el
uso de UML no exige la utilización del Proceso Unificado. Un proyecto que emplee UML
puede utilizar otro proceso diferente del Proceso Unificado o no emplear ninguno.
El Proceso Unificado es conducido por los casos de uso. Éstos se utilizan para describir los
requisitos del proyecto y se describen con ayuda de una representación específica del
Proceso Unificado más rica que la contenida en UML.
El Proceso Unificado es iterativo. Todos los subproyectos se efectúan con las mismas
actividades. Al concluir cada subproyecto se evalúa una entrega parcial.
Los creadores del Proceso Unificado proponen el desarrollo incremental e iterativo para
evitar tener que tratar en su totalidad los proyectos importantes con entregas muy
posteriores a la redacción del pliego de condiciones. En efecto, en casos semejantes, es
probable que las necesidades del cliente hayan evolucionado desde entonces y que no
recuerde con exactitud aquello que había solicitado en el pliego de condiciones. De ser así,
podrían llegar a producirse conflictos fácilmente evitables con un desarrollo incremental e
iterativo.
En el Proceso Unificado, cada fase está detallada por un conjunto de actividades. Una
actividad es un conjunto de acciones descrito por un diagrama de actividades. Con el
Proceso Unificado se suministra también un diccionario muy completo constituido por
modelos de actividades y casos de uso adaptados a sectores de actividad específicos.
En la fase de inception las actividades utilizadas con mayor frecuencia son el modelado de
procesos de negocio y la gestión de requisitos.
Durante la elaboración, las actividades empleadas con mayor frecuencia son la gestión de
requisitos y el análisis y diseño.
En MDA, el modelo de objetos del dominio se llama PIM, es decir, Platform Independent
Model o modelo independiente de la plataforma. El PIM está constituido por un conjunto
de elementos cuyo diseño debe hacerse de forma independiente a cualquier lenguaje de
programación o tecnología. Posteriormente, el modelo se transforma, manual o
automáticamente, en un modelo específico de una plataforma y de un lenguaje de
programación. Dicho modelo específico recibe el nombre de PSM, es decir, Platform
Specific Model o modelo específico de plataforma.
La relación con UML se establece a nivel del PIM. UML es un excelente candidato a
lenguaje a ese nivel. Posee la ventaja de describir con precisión los objetos, manteniéndose
al mismo tiempo independiente de las tecnologías. En lo que respecta a los tratamientos, la
extensión Action Semantics de UML debería permitirle responder a todas las necesidades
de descripción.
Introducción
El objetivo del presente capítulo es describir los diferentes conceptos y principios de la
orientación a objetos en los que se basa el lenguaje UML. Conocerlos resulta indispensable
para comprender los elementos utilizados en los diagramas UML que abordaremos en los
capítulos siguientes.
Finalmente trataremos la composición de objetos para concluir con una noción más
específica de UML, la especialización de los elementos del diagrama a través de los
estereotipos.
El objeto
Un objeto es una entidad identificable del mundo real. Puede tener una existencia física (un
caballo, un libro) o no tenerla (un texto de ley). Identificable significa que el objeto se
puede designar.
Ejemplo
Mi yegua Jorgelina
Mi libro sobre UML
El artículo 293B del código de impuestos
En UML todo objeto posee un conjunto de atributos (estructura) y un conjunto de métodos
(comportamiento). Un atributo es una variable destinada a recibir un valor. Un método es
un conjunto de instrucciones que toman unos valores de entrada y modifican los valores de
los atributos o producen un resultado.
Incluso los objetos estáticos del mundo real son percibidos siempre como dinámicos. Así,
en UML, un libro se percibe como un objeto capaz de abrirse él mismo en una página
determinada.
Todo sistema concebido en UML está compuesto por objetos que interactúan entre sí y
realizan operaciones propias de su comportamiento.
Ejemplo
Una manada de caballos es un sistema de objetos que interactúa entre sí, cada objeto posee
su propio comportamiento.
La abstracción
La abstracción es un principio muy importante en modelado. Consiste en tener en cuenta
únicamente las propiedades pertinentes de un objeto para un problema concreto. Los
objetos utilizados en UML son abstracciones del mundo real.
Ejemplo
Si nos interesamos por los caballos en su actividad de carrera, las propiedades aptitud,
velocidad, edad, equilibrio mental y casta de origen son pertinentes para dicha actividad y
se tienen en cuenta.
Si nos interesamos por los caballos en su actividad de bestia de tiro, las propiedades edad,
tamaño, fuerza y corpulencia son pertinentes para dicha actividad y se tienen en cuenta.
Clases de objetos
Un conjunto de objetos similares, es decir, con la misma estructura y comportamiento, y
constituidos por los mismos atributos y métodos, forma una clase de objetos. La estructura
y el comportamiento pueden entonces definirse en común en el ámbito de la clase.
Todos los objetos de una clase, llamada también instancia de clase, se distinguen por tener
una identidad propia y sus atributos les confieren valores específicos.
Ejemplo
El nombre de las clases se escribe en singular y está formado siempre por un nombre
precedido o seguido por uno o varios adjetivos que lo califican. Dicho nombre es revelador
de los objetos que forman la clase.
Encapsulación
La encapsulación consiste en ocultar los atributos y métodos del objeto a otros objetos. En
efecto, algunos atributos y métodos tienen como único objetivo tratamientos internos del
objeto y no deben estar expuestos a los objetos exteriores. Una vez encapsulados, pasan a
denominarse atributos y métodos privados del objeto.
Ejemplo
Al correr, los caballos efectúan diferentes movimientos como pueden ser levantar las patas,
levantar la cabeza o levantar la cola. Esos movimientos son internos al funcionamiento del
animal y no tienen por qué ser conocidos en el exterior. Son métodos privados. Las
operaciones acceden a una parte interna del caballo: sus músculos, su cerebro y su vista. La
parte interna se representa en forma de atributos privados. El conjunto de atributos y
métodos se ilustra en la figura 3.3.
En la notación UML, los atributos y métodos públicos aparecen precedidos del signo más
mientras que los privados (encapsulados) aparecen precedidos del signo menos.
Especialización y generalización
Hasta el momento, cada clase de objetos se introduce de forma separada a las demás clases.
Las clases pueden definirse también como subconjuntos de otras clases, pero éstos deben
constituir siempre conjuntos de objetos similares.
Ejemplo
Ejemplo
Ejemplo
La clase de los caballos es una subclase de la clase de los mamíferos, ella misma subclase
de la clase de los animales. La clase de los perros es otra subclase de la clase de los
mamíferos. La jerarquía de clases correspondiente aparece representada en la figura 3.4.
Figura 3.4 - Jerarquía de clases
Herencia
La herencia es la propiedad que hace que una subclase se beneficie de la estructura y el
comportamiento de su superclase. La herencia deriva del hecho de que las subclases son
subconjuntos de las superclases. Sus instancias son asimismo instancias de la superclase y,
por consiguiente, además de la estructura y el comportamiento introducidos en la subclase,
se benefician también de la estructura y comportamiento definidos por la superclase.
Ejemplo
Tomamos un sistema en el que la clase Caballo es una subclase directa de la clase Animal.
El caballo se describe entonces mediante la combinación de la estructura y del
comportamiento derivados de las clases Caballo y Animal, es decir, mediante los atributos
edad, tamaño, peso, nombre y casta así como los métodos comer y correr. Esta herencia se
ilustra en la figura 3.5.
Las clases que poseen instancias, es decir, las clases Caballo y Perro, llamadas
clases concretas.
Las clases que no poseen directamente instancias, como la clase Animal. En efecto,
si bien en el mundo real existen caballos, perros, etc., el concepto de animal
propiamente dicho continuá siendo abstracto. No basta para definir completamente
un animal. La clase Animal se llama clase abstracta.
La finalidad de las clases abstractas es poseer subclases concretas y sirven para factorizar
atributos y métodos comunes a las subclases.
Ejemplo
La figura 3.6 retoma la jerarquía detallando las clases abstractas y las clases concretas. En
UML, el nombre de las clases abstractas se escribe en cursiva.
Polimorfismo
El polimorfismo significa que una clase (generalmente abstracta) representa un conjunto
formado por objetos diferentes, ya que éstos son instancias de subclases diferentes. Cuando
se llama a un método del mismo nombre, esta diferencia se traduce en comportamientos
distintos (excepto en los casos en los que el método es común y las subclases lo han
heredado de la superclase).
Ejemplo
Composición
Un objeto puede ser complejo y estar compuesto por otros objetos. La asociación que une a
estos objetos es la composición, que se define a nivel de sus clases, pero cuyos vínculos se
establecen entre las instancias de las clases. Los objetos que forman el objeto compuesto se
denominan componentes.
Ejemplo
Un caballo es un ejemplo de objeto complejo. Está formado por diferentes órganos (patas,
cabeza, etc.). La representación gráfica de esta composición puede verse en la figura 3.8.
Figura 3.8 - Composición
En la composición débil, los componentes pueden ser compartidos por varios objetos
complejos. En la composición fuerte, los componentes no pueden compartirse y la
destrucción del objeto compuesto conlleva la destrucción de sus componentes.
Ejemplo
Una composición fuerte para las patas y la cabeza. Efectivamente, las patas y la
cabeza no pueden compartirse y la desaparición del caballo conlleva la desaparición
de sus órganos.
Una agregación o composición débil para la silla.
Los estereotipos están formados por palabras clave que explicitan la especialización. Estas
palabras clave aparecen entre comillas.
Ejemplo
Conclusión
La orientación a objetos constituye la base del UML. Ésta está formada por conceptos
(objetos, clases, especialización, composición) y principios (abstracción, encapsulación).
Estos elementos hacen de la orientación a objetos un soporte real para el modelado de
sistemas complejos y para la programación de los mismos, más allá de UML.
En los capítulos siguientes, veremos cómo los diferentes diagramas de UML se apoyan en
conceptos y principios propios de la orientación a objetos.
Introducción
El objetivo del presente capítulo es mostrar los casos de uso empleados para describir los
requisitos funcionales esperados durante la redacción del pliego de condiciones del sistema
o las funcionalidades de un sistema existente.
Los casos de uso de un sistema contienen los requisitos funcionales deseados o existentes,
los actores (usuarios del sistema) y las relaciones que unen a actores y funcionalidades.
Este conjunto determina asimismo las fronteras del sistema, es decir, las funcionalidades
del sistema y aquellas que son externas a él.
Los casos de uso sirven de soporte para las etapas de modelado, desarrollo y validación.
Son una referencia del diálogo entre informáticos y clientes y, por consiguiente, constituyen
una base para elaborar los aspectos funcionales del pliego de condiciones.
Casos de uso
Los casos de uso describen en forma de acciones y reacciones el comportamiento del
sistema, estudiado desde el punto de vista del usuario. Definen los límites del sistema y sus
relaciones con el entorno.
Ahora bien, esta definición debe completarse, ya que no especifica si un caso de uso debe
describir la totalidad o sólo una parte del diálogo entre el usuario y el sistema. Podría
formularse así:
”Entre un usuario y el sistema, los casos de uso describen las interacciones vinculadas con
un objetivo funcional del usuario”.
Los casos de uso explicitan los requisitos funcionales del sistema relativos a uno de los
objetivos del usuario. Éstos se denominan también, de manera más precisa, casos de uso
con objetivo usuario.
Ejemplo
Actor
Un usuario externo al sistema puede desempeñar diferentes funciones en relación con el
sistema. Una pareja (usuario, función) constituye un actor específico, designado en UML
únicamente por el nombre de la función.
La definición se extiende a los demás sistemas que interactúan con el sistema. Estos forman
tantos actores como funciones desempeñadas.
Los actores primarios, para los cuales el objetivo del caso de uso es esencial.
Los actores secundarios, que interactúan con el caso de uso, pero cuyo objetivo no
es esencial.
Ejemplo
Retomemos el ejemplo del caso de uso de compra de un caballo por parte de un cliente. El
comprador del caballo es un actor primario. La parada de sementales del estado que registra
el certificado de venta es un actor secundario.
Escenario
Un escenario es una instancia de un caso de uso en la cual se fijan todas las condiciones
relativas a los diferentes eventos. Por tanto, a la hora del desarrollo, no existen alternativas.
Al igual que las clases, que albergan los aspectos comunes de las instancias, los casos de
uso describen de manera común el conjunto de escenarios utilizando derivaciones
condicionales para representar las diferentes alternativas.
Ejemplo
La compra de Jorgelina por parte de Fien constituye un ejemplo de escenario del caso de
uso de compra de un caballo. Todas las alternativas del desarrollo se conocen, ya que Fien
ha comprado a Jorgelina.
Relación de comunicación
La relación que vincula a un actor con un caso de uso se denomina relación de
comunicación.
Los servicios que el sistema debe suministrar a cada uno de los actores del caso de
uso.
Las informaciones del sistema que un actor puede introducir, consultar o modificar.
Los cambios que intervienen en el entorno, de los cuales un actor informa al
sistema.
Los cambios que intervienen dentro del sistema, de los cuales el sistema informa a
un actor.
Ejemplo
Cuando Fien compró a Jorgelina recibió de la granja de cría una serie de informaciones
(una propuesta de precio, los papeles de la yegua, la libreta de vacunación, etc.) y
suministró otras informaciones (una contraoferta de precio, una promesa de compra, etc.).
Ejemplo
El caso de uso de compra de un caballo se representa en la figura 4.1:
El sistema que responde al caso de uso puede representarse mediante un rectángulo en cuyo
interior aparece el caso.
Ejemplo
Los actores secundarios se representan del mismo modo que los actores primarios. Muchas
veces el sentido de la relación de comunicación entre los actores secundarios y el sistema se
invierte con respecto al sentido de la relación entre los actores primarios y el sistema. En
efecto, es el sistema y no el actor quien inicia la comunicación.
Ejemplo
La relación de inclusión sirve para enriquecer un caso de uso con otro. Dicho
enriquecimiento se lleva a cabo mediante una inclusión imperativa y, por tanto, es
sistemático.
El caso de uso incluido existe únicamente con ese propósito, ya que no responde a un
objetivo de un actor primario. Estos casos de uso son subfunciones.
La inclusión sirve para compartir una funcionalidad común entre varios casos de uso.
También puede emplearse para estructurar un caso de uso describiendo sus subfunciones.
En el diagrama de casos de uso, estas relaciones se representan mediante una flecha
discontinua acompañada del estereotipo «include».
Ejemplo
A la hora de adquirir un semental, el comprador se asegurará de que éste tenga las vacunas
en regla. Por consiguiente, el caso de uso de compra de un semental incluye dicha
verificación (ver figura 4.4).
La puesta en común del caso de uso de comprobación de las vacunas se ilustra en la figura
4.5, ya que este caso de subfunción es igualmente pertinente para la compra de una yegua.
La inclusión puede emplearse también para descomponer el interior de un caso de uso sin
compartir el caso incluido. En la figura 4.6, la comprobación de los partos de una yegua no
se comparte, pero su presencia ilustra bien que dicha comprobación forma parte de los
puntos estudiados durante la compra de la yegua.
2. Relación de extensión
En el caso de uso básico, la extensión se hace en una serie de puntos concretos y previstos
en el momento del diseño, llamados puntos de extensión.
Como ocurre con la inclusión, la extensión sirve para estructurar un caso de uso o para
compartir un caso de uso de subfunción.
En el diagrama de los casos de uso, esta relación se representa mediante una flecha
discontinua acompañada del estereotipo «extend».
Ejemplo
Ejemplo
Al igual que ocurría con las clases, el subcaso hereda el comportamiento y las relaciones de
comunicación, inclusión y extensión del supercaso de uso.
Los subcasos de uso tienen el mismo nivel que sus supercasos. Si el supercaso es un caso
con objetivo usuario, lo mismo ocurrirá con el subcaso. Si es un caso de subfunción, el
subcaso será también una subfunción.
Ejemplo
El caso de uso de compra de un caballo se especializa en dos subcasos: la compra de una
yegua o la compra de un semental. Se trata de un caso abstracto y su nombre aparece en
cursiva. La figura 4.9 ilustra esta especialización.
Los casos de uso de compra de una yegua y de compra de un semental son casos con
objetivo usuario y comunican con el comprador. La relación de comunicación que existe
entre el caso de uso de compra del caballo y el Comprador se hereda en los dos subcasos de
uso.
Ejemplo
Ejemplo
Conclusión
Los casos de uso sirven para:
Expresar los requisitos funcionales que los usuarios comunicaron al sistema durante
la redacción del pliego de condiciones.
Comprobar que el sistema cumple dichos requisitos en el momento de la entrega.
Determinar las fronteras del sistema.
Escribir la documentación del sistema.
Confeccionar los juegos de test.
Los casos de uso ofrecen una técnica de representación adecuada para dialogar con el
usuario ya que su formalismo es cercano al lenguaje natural. Se aconseja incorporar un
léxico para evitar posibles confusiones.
Más adelante estudiaremos cómo descubrir los objetos utilizando los diagramas de
secuencia asociados a los casos de uso.
Ejercicios
1. El hipódromo
2. El club ecuestre
Un club ecuestre pone a disposición de los clientes establos para guardar los caballos y
ofrece cursos de equitación y paseos. Sólo los socios tienen acceso a los cursos y a los
servicios de establo. Los demás clientes tienen la posibilidad de participar en los paseos y
de convertirse en socios.
Un tiovivo de caballos de madera ofrece a sus clientes la posibilidad de dar una vuelta
previo pago de una cantidad de dinero.
Introducción
El objetivo del presente capítulo es explicar de qué manera UML representa las
interacciones entre objetos. En el capítulo Conceptos de la orientación a objetos, vimos que
los objetos de un sistema poseen su propio comportamiento e interactúan entre sí para dotar
al sistema de una dinámica global. En el capítulo Modelado de los requisitos, estudiamos la
forma en que los casos de uso representan las acciones y reacciones entre un actor externo y
el sistema. Desde el punto de vista del modelado, esos dos tipos de interacciones se
distinguen por su diferencia interna/externa, pero no por su naturaleza.
Diagrama de secuencia
1. Definición
Para interactuar entre sí, los objetos se envían mensajes. Durante la recepción de un
mensaje, los objetos se vuelven activos y ejecutan el método del mismo nombre. Un envío
de mensaje es, por tanto, una llamada a un método.
Dado que representa la dinámica del sistema, el diagrama de secuencia hace entrar en
acción las instancias de clases que intervienen en la realización de la subfunción a la que
está vinculado. A cada instancia se asocia una línea de vida que muestra las acciones y
reacciones de la misma, así como los periodos durante los cuales ésta está activa, es decir,
durante los que ejecuta uno de sus métodos.
La notación "funcion: Clase" representa la función de una instancia seguida del nombre de
su clase. Para simplificar, en esta obra consideraremos que la función de la instancia
corresponde a su nombre, al igual que ocurría en UML 1. Si sólo una instancia de la clase
participa en el diagrama de secuencia, la función de la instancia es opcional. El nombre de
la clase puede también omitirse en las etapas preliminares del modelado, pero debe
especificarse lo antes posible.
Los diagramas de secuencia contienen varias líneas de vida, ya que tratan de las
interacciones entre varios objetos.
3. Envío de mensajes
Los envíos de mensajes se representan mediante flechas horizontales que unen la línea de
vida del objeto emisor con la línea de vida del objeto destinatario (ver figura 5.2).
Existen diferentes tipos de envíos de mensajes. En la figura 5.5 ofrecemos una explicación
gráfica.
Ejemplo
Un jinete da una orden a su caballo, luego le da una segunda orden sin esperar a que
concluya la ejecución de la primera. La primera orden constituye un ejemplo de envío de
mensaje asincrónico.
5. Descripción de la dinámica
Ejemplo
Un marco de interacción es una parte del diagrama de secuencia asociado a una etiqueta.
Dicha etiqueta contiene un operador que determina la modalidad de ejecución. Las
principales modalidades son la derivación condicional y el bucle.
2. La alternativa
Existe otro operador para la alternativa, denominado alt, que va seguido de varias
condiciones de test y de la palabra clave else. El marco se divide entonces en varias partes
cuyo contenido sólo se ejecuta si se cumple la condición asociada. El contenido de la última
parte se asocia a la palabra clave else (si no) y sólo se ejecuta si no se verifica ninguna de
las condiciones precedentes.
3. El bucle
El bucle se efectúa mediante el operador loop seguido de los parámetros min, max y de una
condición de test. El contenido del marco se ejecuta min veces. Después sólo lo hace
mientras que se verifique la condición de test y el número máximo de ejecuciones del bucle
no exceda de max. Los parámetros son opcionales.
Ejemplo
Un jinete puede intentar superar un obstáculo un determinado número de veces, pero sin
sobrepasar dos intentos fallidos.
Figura 5.12 - Ejemplo de bucle
Gracias a los diferentes elementos introducidos hasta el momento, ahora podemos describir
la dinámica del sistema de manera más general.
Ejemplo
La figura 5.13 representa el caso de uso de compra de una yegua. A diferencia de lo que
ocurre en la figura 5.8, se toman en cuenta las alternativas y bucles introducidos en el caso
de uso. Concretamente, el diagrama de secuencia sólo se ejecuta hasta el final si el
comprador confirma las vacunas y los partos. Se representa además el bucle de negociación
del precio de venta.
Figura 5.13 - Ejemplo de diagrama de secuencia: representación del caso de uso de compra
de una yegua
Diagrama de comunicación
El diagrama de comunicación es una alternativa al diagrama de secuencia. Éste se centra en
una representación espacial de los objetos.
Los envíos de mensajes se sitúan a lo largo de los vínculos entre objetos. Los mensajes
deben numerarse obligatoriamente, se puede emplear la numeración compuesta estudiada
en el apartado relativo a los diagramas de secuencia.
En una manada hay una yegua dominante, que es la responsable de la educación de todos
los potros. La yegua pasa el relevo a otra para que vigile a un potro en concreto.
En el ejemplo de la figura 5.15, la yegua dominante delega la vigilancia del potro Travieso
a otra yegua, que da una orden al potro que éste se niega a obedecer y, a consecuencia de
ello, recibe un castigo.
Dado que no existe un equivalente a los marcos de interacción, UML propone mecanismos
de test y de bucle en el envío de los mensajes.
Los mecanismos de test se realizan mediante una condición especificada entre corchetes
después del número del mensaje, lo que da la sintaxis siguiente:
Número[condición]: mensaje
Ejemplo
Figura 5.16 - Ejemplo de condición: el potro Travieso debe abandonar la manada a los dos
años
En estos diagramas el sistema está representado en forma de objeto y las interacciones con
el exterior se producen a lo largo de la línea de vida.
Para descubrir los objetos del sistema a partir de un caso de uso, la primera fase consiste en
preguntarse a qué objetos del sistema están destinados los mensajes procedentes del
exterior.
Determinar esto constituye una primera etapa de descomposición del sistema en objetos.
Ejemplo
En el ejemplo del caso de uso de compra de una yegua, las interacciones entre el comprador
y el criadero de caballos pueden descomponerse en interacciones entre el comprador, por
un lado, y el director, el contable o el mozo de las caballerizas, por otro (ver figura 5.17).
Figura 5.17 - Primer enriquecimiento del diagrama de secuencia de compra de una yegua
En una segunda fase se descomponen progresivamente los mensajes recibidos por los
objetos; poco a poco se van descubriendo así los objetos del sistema. La descomposición de
los mensajes obliga a utilizar nuevos objetos que responden a las funcionalidades
requeridas.
Ejemplo
Cuando el director recibe la solicitud de los papeles de la yegua, recurre a la base de datos
del criadero para encontrarlos. En consecuencia, el diagrama de secuencia correspondiente
se enriquece con la figura 5.18 (vista parcial correspondiente a la búsqueda de los papeles).
A partir de entonces, la yegua elegida se transmite dentro del diagrama como parámetro. De
esta forma, es posible encontrar sus papeles en la base de datos del criadero.
Figura 5.18 - Segundo enriquecimiento del diagrama de secuencia de compra de una yegua
(vista parcial)
Ejemplo
Cuando el contable recibe el pago, redacta los papeles de venta antes de enviarlos al
comprador. Esta descomposición introduce un nuevo objeto del sistema: los papeles.
Figura 5.19 - Tercer enriquecimiento del diagrama de secuencia de compra de una yegua
(vista parcial)
A menudo se emplea la palabra grano para designar el tamaño de un objeto. Existe todo un
abanico de granos, desde el más fino hasta el más grueso. El sistema, tomado como un
único objeto, es un objeto de grano grueso o de granulado significativo. Por el contrario, la
base de datos de la granja de cría es un objeto de granulado más fino. Dentro de ella, las
tablas o los datos serán objetos de granulado aún más fino. Esta noción es relativa. La
persona encargada del modelado será quien determine el nivel de grano de los objetos que
desea obtener.
Conclusión
Los diagramas de secuencia y de comunicación son importantes para lo siguiente:
Los diagramas de secuencia ponen en primer plano los aspectos temporales, mientras que
los diagramas de comunicación muestran los vínculos entre clases.
Ejercicios
1. El hipódromo
Construya el diagrama de secuencia de compra de una entrada para una carrera de caballos.
¿Cuáles son los objetos del sistema descubiertos así?
Introducción
El objetivo del presente capítulo es dar a conocer las técnicas UML de modelado estático
de objetos.
El uso del OCL o del diagrama de objetos es opcional, depende de las especificaciones del
proyecto de modelado.
La descomposición de los mensajes hace aparecer los objetos del sistema, ya que conduce a
mensajes más finos cuyo destinatario conviene buscar.
Otro posible planteamiento es la descomposición de la información contenida en un objeto.
Con frecuencia, esta información es demasiado compleja para ser representada sólo por la
estructura de un único objeto. A veces, también debe repartirse entre varios objetos.
Ejemplo
En el ejemplo del capítulo Modelado de la dinámica, el director busca los papeles (la
información) de la yegua que desea vender en la base de datos de la granja de cría. La base
constituye un objeto de granulado grueso compuesto a su vez por otros objetos, como los
papeles de los caballos, las informaciones económicas o contables y los documentos de
compraventa de los caballos. Los papeles de una yegua están compuestos, entre otras cosas,
por la cartilla de vacunación y los papeles de sus crías. Los papeles de las crías se
comparten con otros objetos como, por ejemplo, los papeles del padre semental. Esta
descomposición se guía por datos y no por aspectos dinámicos. La figura 6.1 ilustra la
composición de PapelesYegua en el diagrama de clases.
Ejemplo
La descomposición guiada por datos es más eficaz cuando la persona encargada del
modelado conoce bien el tema. La descomposición mediante objetos se realiza entonces de
manera inmediata.
Representación de clases
1. La forma simplificada de representación de clases
Los objetos del sistema se describen mediante clases. Presentamos una forma simplificada
de representación de las clases en UML en la figura 6.4. La representación consta de tres
partes.
Recordemos que el nombre de las clases se escribe en singular y está siempre formado por
un nombre común precedido o seguido de uno o varios adjetivos que lo califican. Dicho
nombre es representativo del conjunto de objetos que forman la clase, representa la
naturaleza de las instancias de una clase.
La segunda parte contiene los atributos. Éstos contienen a su vez la información de los
objetos. El conjunto de atributos forma la estructura del objeto.
La tercera parte contiene los métodos, que corresponden a los servicios ofrecidos por el
objeto y pueden modificar el valor de los atributos. El conjunto de métodos forma el
comportamiento del objeto.
Ejemplo
Esta es la forma más simple de representación de las clases porque no hace aparecer las
características de los atributos y de los métodos, a excepción de su nombre. Se utiliza a
menudo en las primeras fases del modelado.
Antes de examinar las representaciones más completas, debemos abordar las nociones
esenciales de encapsulación, tipo y firma de los métodos.
2. La encapsulación
UML, al igual que la mayoría de lenguajes modernos orientados a objetos, introduce tres
posibilidades de encapsulación:
La encapsulación se representa con un signo más, un signo menos, una almohadilla o una
tilde colocados antes del nombre del atributo. En el siguiente cuadro se detalla el
significado de los signos.
Ejemplo
3. La noción de tipo
Ejemplo
Veremos que, en general, el tipo de un atributo sólo recurre a una clase si ésta es una clase
de una biblioteca externa al sistema modelado o una interfaz como las que estudiaremos al
final del capítulo. No es aconsejable utilizar clases del sistema para dar un tipo a un
atributo. En esos casos, como veremos a continuación, vale más recurrir a las asociaciones
interobjetos.
Por el contrario, el tipo de un parámetro o del retorno de un método puede ser un tipo
estándar o una clase, pertenezca o no al sistema.
Ejemplo
La figura 6.7 muestra la clase Caballo, en la cual se ha establecido el tipo de todos los
atributos. Los atributos de esta clase utilizan tipos estándar.
Un método de una clase puede tomar parámetros y devolver un resultado. Los parámetros
son valores transmitidos:
Recordemos que el nombre de los parámetros puede ser nulo y que el tipo de resultado es
opcional.
Las direcciones out y inout no son compatibles con llamadas en modo asíncrono en las que
aquél que efectúa la llamada no espera el retorno de llamada del método.
Ejemplo
La representación completa de las clases muestra los atributos con las características de
encapsulación, el tipo y los métodos con la firma completa.
La figura 6.9 ilustra la representación completa de una clase. Por supuesto, es posible
escoger una representación intermedia entre la representación simplificada y la
representación completa.
Las instancias de una clase contienen un valor específico para cada uno de sus atributos.
Este valor, por tanto, no se comparte con el conjunto de instancias. En algunos casos, es
preciso utilizar atributos cuyo valor es común a todos los objetos de una clase. Tales
atributos comparten su valor al mismo título que su nombre, tipo y valor predeterminado y
se conocen como atributos de clase porque están vinculados a la clase.
Ejemplo
Ejemplo
La figura 6.11 agrega un método de clase a la clase PorciónCarneCaballar que sirve para
fijar la tasa de IVA. En efecto, la ley es la que fija dicha tasa y la ley puede modificarse.
Recordemos también que una subclase puede acceder a un atributo o a un método de clase
de una de sus superclases, a condición de que no se haya utilizado la encapsulación privada.
UML introduce la noción de atributo calculado, cuyo valor viene determinado por una
función basada en el valor de otros atributos. Estos atributos poseen un nombre precedido
del signo / y van seguidos de una especificación que determina el modo de calcular su
valor.
Ejemplo
En el mundo real, muchos objetos están vinculados entre sí. Dichos vínculos corresponden
a una asociación existente entre los objetos.
Ejemplos
En UML, estos vínculos se describen mediante asociaciones, de igual modo que los objetos
se describen mediante clases. Un vínculo es un elemento de una asociación. Por
consiguiente, una asociación vincula a las clases. Los elementos de la asociación vinculan
entre sí las instancias de las clases.
Las asociaciones tienen un nombre y, como ocurre con las clases, éste es un reflejo de los
elementos de la asociación.
Ejemplos
Las asociaciones que hemos estudiado hasta el momento a título de ejemplo establecen un
vínculo entre dos clases. Estas asociaciones reciben el nombre de asociaciones binarias. Las
asociaciones que vinculan tres clases se denomina asociaciones ternarias y aquellas que
vinculan n clases reciben el nombre de asociaciones n-arias. En la práctica, la gran mayoría
de asociaciones son binarias y las asociaciones cuaternarias y superiores prácticamente no
se usan.
2. Representación de las asociaciones entre clases
La representación gráfica de una asociación binaria consiste en una línea continua que une
las dos clases cuyas instancias se vinculan. Las clases se sitúan en los extremos de la
asociación.
Para señalar el sentido de lectura del nombre de la asociación con respecto al nombre de las
clases, éste puede precederse del signo < o seguirse del signo >. Si la asociación se sitúa en
un eje vertical, el nombre puede ir precedido de ˆ o de v.
Los extremos de una asociación también pueden recibir un nombre. Dicho nombre es
representativo de la función que desempeñan en la asociación las instancias de la clase
correspondiente. Una función tiene la misma naturaleza que un atributo cuyo tipo sería la
clase situada en el otro extremo. Por consiguiente, puede ser pública o estar encapsulada de
manera privada, protegida o para empaquetado. Cuando se especifican las funciones,
muchas veces no es preciso indicar el nombre de la asociación, ya que éste suele ser el
mismo que el de una de las funciones.
La figura 6.14 ilustra la representación de una asociación binaria mostrando las funciones.
Ejemplo
Ejemplo
La asociación familia que vincula las clases Semental, Yegua y Descendiente se presenta en
la figura 6.17. Cada uno de los elementos constituye un triplete (padre, madre, potro).
Especificación Cardinalidades
0..1 cero o una vez
1 únicamente una vez
* de cero a varias veces
1..* de una a varias veces
M..N entre M y N veces
N N veces
Ejemplo
En la figura 6.18, retomamos los ejemplos y les agregamos las cardinalidades mínimas y
máximas de cada asociación. Un criadero de caballos puede tener varios propietarios y una
persona puede ser propietario de varios criaderos.
Para ilustrar la lectura, indicamos cómo debe leerse la primera asociación: un descendiente
posee un solo padre. Un semental puede tener de cero a varios potros o crías.
4. Navegación
Por defecto, las asociaciones tienen una navegación bidireccional, es decir, es posible
determinar los vínculos de la asociación desde una instancia de cada clase de origen. Las
navegaciones bidireccionales resultan más complejas de realizar para los desarrolladores y,
en la medida de lo posible, conviene evitarlas.
Para especificar el único sentido útil de navegación durante las fases de modelado cercanas
al paso al desarrollo se dibuja la asociación en forma de flecha.
Ejemplo
En el contexto concreto de un criadero, resulta útil conocer los caballos que posee dicho
criadero, pero lo contrario no es necesario.
Cuando encontramos una misma clase en los dos extremos de una asociación, hablamos de
asociaciones reflexivas que unen entre sí las instancias de una misma clase.
En estos casos, resulta preferible asignar un nombre a la función desempeñada por la clase
en cada extremo de la asociación.
Como veremos en los ejemplos, las asociaciones reflexivas sirven principalmente para
describir dentro del conjunto de instancias de una clase:
Grupos de instancias.
Una jerarquía dentro de las instancias.
Para los lectores expertos diremos que, en el primer caso, se trata de una asociación que
representa una relación de equivalencia, y en el segundo, una asociación que representa una
relación de orden.
Ejemplo
Para poder superar las pruebas de selección de un concurso hípico internacional, es preciso
que los caballos hayan ganado otros concursos previos. Podemos crear, por consiguiente,
una asociación entre el concurso internacional y los concursos celebrados previamente a él.
La figura 6.20 muestra dicha asociación, que crea una jerarquía dentro de los concursos.
Ejemplo
La cardinalidad para los ascendentes es 2, ya que cualquier caballo tiene un padre y una
madre.
Ejemplo
La figura 6.22 muestra la asociación entre los caballos que se encuentran en el mismo
criadero. Esta asociación crea grupos dentro del conjunto de instancias de la clase Caballo,
ya que cada grupo corresponde a un criadero.
Figura 6.22 - Asociación reflexiva que vincula los caballos de un mismo criadero
6. Las clases-asociaciones
Los vínculos entre las instancias de las clases pueden llevar informaciones. Éstas son
específicas a cada vínculo.
En esos casos, la asociación que describe los vínculos recibe el estatus de clase y sus
instancias son elementos de la asociación.
Al igual que el resto, estas clases pueden estar dotadas de atributos y operaciones y estar
vinculadas a otras clases a través de asociaciones.
Ejemplo
Ejemplo
Una tabla está formada por elementos. La figura 6.26 describe dos posibilidades de
modelado en UML. La primera no recurre a la calificación, mientras que en la segunda el
calificador índice permite encontrar un único elemento de la tabla. Por consiguiente, la
cardinalidad máxima pasa a uno.
Figura 6.26 - Calificación de los elementos de una tabla
Ejemplo
En las carreras de caballos, todos los caballos poseen un número. La figura 6.27 muestra a
los participantes en una carrera calificándolos por su número.
Las especificaciones escritas en OCL se expresan sobre el valor de los atributos y de las
funciones (extremos de las asociaciones). Las especificaciones deben tener un valor lógico
(verdadero o falso).
Para construir una especificación se utilizan todos los operadores aplicables al valor de los
atributos en función de su tipo (comparación de enteros, suma de enteros, comparación de
cadenas, etc.). En las condiciones pueden emplearse los métodos de los objetos. Para los
valores de conjunto (colecciones de objetos), OCL propone un juego de operadores: union,
intersection, "-" (diferencia).
Para las colecciones de objetos, OCL propone sobre todo los operadores siguientes: collect,
includes, includesAll, asSet, exists, forAll.
Para designar un atributo o un método en una expresión OCL, hay que elaborar una
expresión de ruta que empiece por self. A continuación, se designa directamente el atributo
o el método por su nombre o se recorre una asociación utilizando el nombre de la función.
Es conveniente entonces designar un atributo o un método de la clase situada en el otro
extremo de la asociación, o bien designar de nuevo una función para recorrer otra
asociación hasta elegir un atributo o un método.
self.método
En el presente manual, ofrecemos únicamente una breve introducción al lenguaje OCL. Los
lectores interesados en obtener más información pueden consultar la obra "The Object
Constraint Language: Getting Your Models ready for MDA, Second Edition" de Jos
Warmer y Anneke Kleppe, Addisson-Wesley, 2003.
Ejemplo
paja;
minerales;
heno o gránulos.
La figura 6.28 ilustra la comida y sus diferentes componentes. Que contenga heno o bien
gránulos es una especificación enunciada por el operador o. Este operador expresa la
exclusión entre ambas asociaciones.
Ejemplo
Un hipódromo hace correr a varios caballos. Los jockeys que ha contratado deben
participar en las carreras montando una parte de los caballos. Esto puede reformularse así:
el conjunto de jockeys empleados por el hipódromo debe estar incluido en el conjunto de
jockeys que montan los caballos participantes en las carreras del hipódromo.
En OCL, esta especificación se escribe así:
Existen dos formas de composición, fuerte o débil, que vamos a examinar a continuación.
Ejemplo
Un caballo está compuesto, entre otras cosas, por un cerebro. El cerebro no se comparte. La
muerte del caballo comporta la muerte del cerebro. Se trata, por tanto, de una asociación de
composición, ilustrada en la figura 6.31.
Ejemplo
Una carrera hípica está constituida por premios. Los premios no se comparten con otras
carreras (un premio es específico de una carrera). Si la carrera no se organiza, los premios
no se atribuyen y desaparecen. Se trata de una relación de composición, ilustrada en la
figura 6.32.
Figura 6.32 - Asociación de composición entre una carrera hípica y los premios que forman
parte de ella
Ejemplo
Un caballo enjaezado está compuesto, entre otras cosas, por una silla. Una silla está
compuesta por una cincha, estribos y una manta de montura. Esta composición es una
muestra de agregación (ver figura 6.33). En efecto, la pérdida del caballo no acarrea la
pérdida de los objetos y la pérdida de la silla no acarrea la pérdida de sus componentes.
Ejemplo
Ejemplo
Hilando más fino, un caballo puede pertenecer a varios propietarios. En ese caso, la
cardinalidad a nivel de la colección del propietario ya no es 1, sino 1..* para expresar la
multiplicidad. El caballo puede entonces ser compartido varias veces en una misma
agregación (ver figura 6.35).
Agregación Composición
rombo
Representación rombo negro
transparente
Varias asociaciones comparten los
sí no
componentes
Destrucción de los componentes al destruir el
no sí
compuesto
Cardinalidad a nivel del compuesto cualquiera 0..1 ó 1
Relación de generalización/especialización
entre clases
1. Clases más específicas y clases más generales
Una clase es más específica que otra si todas las instancias que la componen son a su vez
instancias de la otra clase. La clase más especifica es una subclase de la otra clase. Esta
última, más general, recibe el nombre de superclase.
Ejemplo
El caballo es una especialización del équido, que a su vez es una especialización del
animal. La zebra es otra especialización del équido. El resultado es la minijerarquía
presentada en la figura 6.37.
2. La herencia
Las instancias de una clase son también instancias de su superclase o superclases. Por
consiguiente, aprovechan los atributos y métodos definidos en la superclase, además de los
atributos y métodos introducidos en la clase.
Esta facultad se conoce como herencia, es decir, una clase hereda los atributos y métodos
de las superclases para que sus instancias se beneficien de ellos.
Recordemos que los atributos y métodos privados de una superclase se heredan en sus
subclases, pero no son visibles en ellas.
En la herencia, los métodos pueden redefinirse en la subclase. A continuación, veremos que
esta redefinición se aplica principalmente a la herencia de las clases abstractas.
Ejemplo
Tal y como se muestra en la figura 6.38, los atributos y métodos de la clase Caballo se
heredan en sus dos subclases.
La herencia significa que, al igual que un caballo de tiro, un caballo de carreras posee un
nombre, un peso, una edad y puede caminar y comer.
La figura 6.39 muestra la existencia de dos tipos de clases en la herencia: las clases
concretas Caballo y Lobo, que aparecen en la parte más baja de la jerarquía, y la clase
abstracta Animal.
Una clase concreta posee instancias y constituye un modelo completo de objeto (todos los
atributos y métodos se describen completamente).
Por el contrario, una clase abstracta no puede poseer una instancia directa ya que no
proporciona una descripción completa. Su finalidad es poseer subclases concretas y sirve
para factorizar los atributos y métodos comunes a las subclases.
Ejemplo
Los animales pueden dormir o comer, pero lo hacen de manera distinta de acuerdo con la
naturaleza del animal. Estos métodos poseen su firma como única descripción a nivel de la
clase Animal. Se trata de métodos abstractos.
La figura 6.39 muestra estos métodos abstractos dentro de la clase abstracta Animal y
presenta la redefinición para hacerlos concretos (es decir, la atribución de código) en las
clases Caballo y Lobo. En efecto, los caballos duermen de pie mientras que los lobos
duermen tumbados. Tampoco comen de la misma manera: los lobos son carnívoros y los
caballos herbívoros.
Recordemos que la firma se compone de un conjunto formado por el nombre del método,
los parámetros con el nombre y el tipo, y el tipo del resultado, a excepción del código del
método.
Cualquier clase que posea al menos un método abstracto se considera una clase abstracta.
La presencia de un solo método incompleto (el código no está) implica que la clase no es
una descripción completa de objetos.
UML ofrece cuatro especificaciones sobre la relación de herencia entre una superclase y
sus subclases:
Ejemplo
La figura 6.40 ilustra una relación de herencia entre la superclase Équido y dos subclases:
los caballos y los burros. Estas dos subclases no cubren la clase de los équidos (existen
otras subclases, como las cebras). Además, también están las mulas, que derivan de un
cruce y son a la vez caballos y burros. Por ese motivo, la figura presenta las
especificaciones {incomplete} y {overlapping}.
La figura 6.41 muestra otra relación de herencia entre la superclase Caballo y dos
subclases: los caballos macho y los caballos hembra. Estas dos subclases cubren la clase de
los caballos. No existe ningún caballo que sea a la vez macho y hembra. Por ello, la figura
presenta las especificaciones {complete} y {disjoint}.
5. La herencia múltiple
La herencia múltiple en UML consiste en que una subclase hereda de varias superclases.
Esto plantea un solo problema: cuando un mismo método, es decir, un método con la
misma firma, se hereda varias veces en la subclase se crea un conflicto. Al recibir un
mensaje de llamada al método, es preciso definir un criterio para elegir un método entre
todos los heredados.
En tales casos, una solución consiste en redefinir el método en la subclase para suprimir el
conflicto.
Ejemplo
La figura 6.42 retoma las dos subclases Caballo y Burro e introduce una subclase común,
las mulas.
La figura 6.42 muestra también el método trotar, abstracto en la clase Équido y concreto en
las subclases inmediatas y redefinido en la subclase fruto de su herencia múltiple. Cuando
el jinete pide a la mula que trote, ésta responde con reacciones de caballo y de burro a la
vez. Puede ser peligrosa como un caballo e irritante como un burro.
Hemos visto que las clases abstractas sirven para factorizar los atributos y métodos de
varias subclases. A veces también, es posible factorizar el extremo de una asociación en
una superclase con el fin de hacer más simple el diagrama.
Ejemplo
Al igual que los lobos, los caballos poseen dos ojos y una nariz (ver figura 6.43).
La figura 6.44 muestra que, una vez creada, la clase abstracta Mamífero es una superclase
de las clases Caballo y Lobo, las dos asociaciones de composición se factorizan.
7. Interfaz
Una interfaz es una clase totalmente abstracta, es decir, no tiene atributo y todos sus
métodos son abstractos y públicos. Estas clases no contienen ningún elemento de
implantación de los métodos. Gráficamente se representan como una clase con el
estereotipo «interface».
La implantación de los métodos se realiza mediante una o varias clases concretas, subclases
de la interfaz. En ese caso, la relación de herencia existente entre la interfaz y la subclase de
implantación se conoce como relación de realización. En las relaciones de herencia entre
dos clases, se representa gráficamente mediante una línea discontinua en lugar de mediante
una línea completa.
Ejemplo
La figura 6.45 puede también representarse con un lollipop (un lollipop es un símbolo en
forma de piruleta) (ver figura 6.47).
Una misma clase puede realizar varias interfaces. Se trata de un caso particular de herencia
múltiple. No puede darse ningún conflicto, ya que en la clase de realización sólo se heredan
las firmas de los métodos. Si hay varias interfaces con la misma firma, ésta se implanta en
la clase común de realización mediante un solo método.
Las clases también pueden depender de una interfaz para realizar sus operaciones. La
interfaz se emplea entonces como tipo dentro de la clase (atributo, parámetro o variable
local de uno de los métodos).
Decimos que una clase que depende de una interfaz es cliente de ella.
La figura 6.48 muestra la asociación de dependencia entre una clase y una interfaz
retomando la representación de la figura 6.45 y la representación lollipop de la interfaz.
La relación de dependencia también existe entre dos clases. En efecto, para realizar estas
operaciones, una clase puede depender de otra y no sólo de una interfaz.
Ejemplo
Para poder organizar una carrera se necesitan caballos. La clase Carrera depende por tanto
de la interfaz CaballoCarrera (ver figura 6.49).
nombreInstancia : nombreClase
nombreAtributo = valorAtributo
Por último, los vínculos entre instancias se representan mediante simples líneas continuas.
Recordemos que dichos vínculos son los elementos de las relaciones interobjetos.
Ejemplo
La figura 6.50 muestra un ejemplo de diagramas de objetos. El diagrama de clases del que
éste deriva se representa en la parte superior.
Ejemplo
Figura 6.54 - Diagrama de clases del objeto compuesto Automóvil con los semiárboles
En la figura 6.55 se han introducido también dos partes correspondientes a cada semiárbol.
Entre cada parte correspondiente a una rueda delantera y cada parte correspondiente a un
semiárbol, un conector representa la asociación vinculada. Los conectores sirven para unir
dos partes. Están tipificados por una asociación interobjetos, del mismo modo que una parte
está tipificada por una clase.
Si existen varios conectores entre dos partes y éstos están tipificados por la misma
asociación, es posible distinguirlos atribuyéndoles nombres de función al modo de los
nombres de función de las partes.
Los conectores pueden también vincular las partes entre ellas a través de puertos. Un puerto
es un punto de interacción. Posee una interfaz que constituye su tipo y define el conjunto de
interacciones posibles. Las interacciones definidas por un puerto se hacen con los otros
puertos vinculados a él mediante un conector.
Los puertos también pueden introducirse en los clasificadores. En ese caso, el objetivo de
los puertos es servir de pasarela entre las partes internas del clasificador y los objetos
externos a éste (su entorno).
Una parte puede poseer varios puertos, cada uno de ellos dotado de su propia interfaz.
Varios puertos de una misma parte pueden tipificarse con la misma interfaz. En esos casos
es posible distinguirlos asignándoles nombres de función diferentes, a la manera de lo que
se hace con las partes y los conectores.
La figura 6.56 muestra la misma descomposición en partes del objeto Automóvil que en el
último ejemplo. Entre el motor y los semiárboles de transmisión se han agregado algunos
conectores. Los conectores entre las partes están unidos a través de un puerto representado
en forma de cuadrado blanco. También se ha añadido un puerto en el clasificador, que está
tipificado por la interfaz Orden y conectado a un puerto del motor igualmente tipificado por
esa interfaz.
Que la clase Automóvil puede interactuar con el exterior para recibir órdenes
destinadas al motor y que le son transmitidas.
Que el motor se comunica con los semiárboles (transmisión de movimiento).
Que cada semiárbol se comunica con las ruedas (transmisión de movimiento).
2. Colaboración
Las colaboraciones describen un conjunto de objetos que interactúan entre sí con el fin de
ilustrar la funcionalidad de un sistema. Cada objeto participa en esa funcionalidad
efectuando un papel concreto.
En las colaboraciones, los objetos se describen como en un clasificador, con los mismos
elementos: partes, conectores, puertos, etc.
Las colaboraciones pueden usarse para describir los patrones de diseño (Design Patterns)
utilizados en la programación con objetos.
La figura 6.57 muestra el diagrama de clases de uno de esos patrones; a saber, el patrón
Composite.
Conclusión
En el presente capítulo hemos estudiado los diagramas de clases. Las clases describen los
atributos y los métodos de sus instancias, así como los atributos y métodos de clase.
Las asociaciones entre objetos son obligatorias al elaborar un diagrama de clases. Dichas
asociaciones constituyen la base de la interacción de las instancias a través del envío de
mensajes cuando el sistema está activo.
Las relaciones de herencia entre clases son, asimismo, indispensables, ya que favorecen la
factorización de elementos comunes, permitiendo así reducir el tamaño del diagrama.
Ejercicios
1. La jerarquía de los caballos
Tenemos las clases Yegua, Semental, Potro, Potranca, Caballo, Caballo macho y Caballo
hembra, así como las asociaciones padre y madre. Establezca la jerarquía de las clases
haciendo figurar en ella ambas asociaciones.
Introduzca la clase Manada. Establezca la asociación de composición entre esta clase y las
clases ya introducidas.
Modele los aspectos estáticos del texto siguiente en forma de diagrama de clases.
Una central de caballos vende diferentes tipos de productos para caballos: productos de
mantenimiento, alimentación, equipamiento (para montar el caballo), herraje.
Un pedido contiene una serie de productos y especifica la cantidad de cada uno de ellos. En
caso necesario, se puede elaborar un presupuesto antes de pasar el pedido. Si alguno de los
productos no está en stock, a petición del cliente el pedido puede dividirse en varias
entregas. Cada entrega da lugar a una factura.
Introducción
UML 2 describe los empaquetados gracias a un diagrama específico. Un empaquetado es
una agrupación de elementos de modelado: clases, componentes, casos de uso, otros
empaquetados, etc.
Ejemplo
La figura 7.2 muestra el empaquetado que representa los diferentes elementos de modelado
de un criadero de caballos.
Figura 7.3 - Ejemplo del diagrama de empaquetado que representa un criadero de caballos
Ejemplo
La figura 7.4 muestra el empaquetado ”Criadero de caballos” para el cual ha sido precisa la
encapsulación.
Para que un empaquetado pueda utilizar los elementos de otro, existen dos tipos de
asociación:
Las dos asociaciones pueden aplicarse también a los empaquetados completos: importan o
acceden a todos los elementos del empaquetado de origen definidos como visibles.
Ejemplo
Conclusión
Los empaquetados son útiles para estructurar el modelado de sistemas importantes. Los
empaquetados sistema contienen empaquetados de mayor nivel que, a su vez, albergan
otros empaquetados y así sucesivamente hasta llegar a los elementos básicos del modelado,
como las clases o los casos de uso.
Una de las ventajas de esta estructuración del modelado es que forma parte de la notación
UML y, por consiguiente, está estandarizada.
Introducción
Una vez estudiadas las interacciones y los aspectos estáticos de los objetos del sistema,
procederemos a abordar su ciclo de vida. El ciclo de vida de un objeto representa las
diferentes etapas o estados por los que pasa para llegar, dentro del sistema, a realizar un
objetivo. Un estado corresponde a un momento de actividad o de inactividad del objeto. La
inactividad se produce cuando el objeto espera a que otros objetos concluyan una actividad.
Estudiaremos la noción de evento, señal que hace que el objeto cambie de estado. El
cambio de estado consiste en traspasar una transición.
Por último, presentaremos el diagrama de timing, diagrama que describe los cambios de
estado de un objeto cuando éstos se producen exclusivamente en función del tiempo.
La noción de estado
El estado de un objeto corresponde a un momento de su ciclo de vida. Mientras se
encuentran en un estado, los objetos se limitan a esperar una señal procedente de otros
objetos. Cuando ocurre esto decimos que están inactivos. Sin embargo, también pueden
estar activos y realizar actividades. Una actividad es la ejecución de una serie de métodos y
de interacciones con otros objetos. Está vinculada a un objetivo. En el capítulo siguiente,
estudiaremos detalladamente su descripción con ayuda de los diagramas de actividades.
Ejemplo
Cuando saltan un obstáculo, los caballos están en un estado activo que concluye al acabar
de saltar el obstáculo.
Esta nota esta dirigida, sobre todo, a los desarrolladores que utilizan lenguajes de objetos
como Java o C++: con dichos lenguajes la mayoría de programas funcionan en monothread,
es decir, en monotarea. En ese caso, decimos que un objeto está inactivo cuando no tiene
ningún método activado y que se vuelve activo al activar uno de sus métodos. La activación
corresponde a la recepción de una señal en UML.
Los estados del ciclo de vida de un objeto contienen un estado inicial -que corresponde al
estado del objeto justo después de su creación- y uno o varios estados finales, que
corresponden a la fase de destrucción del objeto. También puede ocurrir que no exista
estado final, ya que es posible que un objeto no sea nunca destruido.
El cambio de estado
1. Noción de evento y de señal
Un evento es un hecho que activa el cambio de estado. Está condicionado a que el objeto
reciba una señal. La recepción de dicha señal equivale a la recepción de un mensaje.
Tratamos el tema de los envíos y recepciones de mensajes en el capítulo Modelado de la
dinámica, dedicado a las interacciones.
La señal puede ser emitida por cualquier objeto, incluso por el propio objeto que está a la
espera de la señal para cambiar de estado.
UML propone describir las señales mediante clases. Las señales emitidas y recibidas son
entonces instancias de una clase de señales. Para distinguirlas del resto de clases, las clases
de señales se describen con el estereotipo «señal». Los atributos de los objetos de esas
clases son los parámetros de mensaje. La descripción mediante clases conduce a la
organización de las señales jerárquicas.
UML no obliga a describir de forma precisa los eventos. En una primera fase de modelado,
los eventos pueden especificarse sólo con su nombre.
Ejemplo
La figura 8.1 muestra la jerarquía de señales que pueden recibir el jinete y su caballo. Son
señales emitidas por el juez o bien por uno de los obstáculos.
Consideramos que un obstáculo puede emitir señales al mismo título que el juez. No hay
que olvidar que en modelado mediante objetos, todos los objetos deben interactuar unos
con otros, aunque en el mundo real sean pasivos.
2. La transición
Una transición es un vínculo orientado entre dos estados que expresa que el objeto puede
pasar del estado inicial de la transición al estado de destino. Cuando el objeto realiza este
paso del estado inicial al estado de destino, decimos que se ha traspasado la transición.
Ejemplo
Cuando el jinete y el caballo reciben la orden de salida del juez pasan del estado de espera
al estado de carrera.
Ejemplo
Una transición reflexiva posee el mismo estado inicial y final. Si la transición está asociada
a un evento, la recepción de éste no hace cambiar el estado. Si la transición es reflexiva y
automática resulta útil para realizar una actividad en bucle.
Si un evento asociado a una transición reflexiva no hace cambiar el estado del objeto, su
recepción puede provocar reacciones como la llamada a un método del objeto o el envío de
una señal a otros objetos.
Ejemplo
Describe los estados, las transiciones que los vinculan y los eventos que provocan el
traspaso de las transiciones.
Este tipo de diagramas sólo resulta útil para los objetos que tienen un ciclo de vida. Otros
objetos, simplemente portadores de información, no cambian de estado a lo largo de su vida
y, por tanto, resulta inútil crear un diagrama de estados-transiciones para ellos.
Un estado final se representa con un punto negro rodeado de un círculo (ver figura 8.4).
Una transición entre dos estados se representa mediante una línea negra con una flecha en
un extremo que une ambos estados (ver figura 8.5). El evento que determina el traspaso de
la transición se indica al lado de la transición. Si la transición es automática no se indica
ningún evento.
Una transición reflexiva posee el mismo estado inicial y final (ver figura 8.6).
Ejemplo
En un concurso de obstáculos, la prueba consiste en que cada participante salte dos o tres
obstáculos diferentes. A veces, ocurre que el caballo se niega a saltar el obstáculo, entonces
el jinete vuelve a intentar el salto. La figura 8.7 representa el diagrama de estados-
transiciones que describe la prueba del objeto ”participante en la prueba”. Los obstáculos
son el muro y la barrera respectivamente. El diagrama contiene transiciones reflexivas y
automáticas.
2. Condiciones de guarda
Ejemplo
En caso de que el caballo se niegue a saltar un obstáculo, el participante tiene derecho a
intentarlo de nuevo dos veces. Queda descalificado, por tanto, tras la tercera tentativa
fallida.
La figura 8.9 muestra cómo tener en cuenta el número máximo de intentos fallidos
retomando el ejemplo de la figura 8.6 (sólo se muestra el primer obstáculo).
durante el estado;
al traspasar la transición;
en la entrada y en la salida del estado;
dentro del estado, al recibir un evento.
Una actividad es una serie de acciones. Una acción consiste en asignar un valor a un
atributo, crear o destruir un objeto, efectuar una operación, enviar una señal a otro objeto o
a sí mismo, etc. El otro objeto se designará con su nombre, al igual que que en los
diagramas de interacción estudiados en el capítulo Modelado de la dinámica.
Ejemplo
4. Estados compuestos
El propio estado puede ser descrito con un diagrama de estados-transiciones. Este tipo de
estados se conoce como estados compuestos. Los estados que lo componen reciben el
nombre de subestados.
Un subestado puede estar compuesto a su vez de otros subestados. En ese caso, existen dos
subestados de memoria H y H*. El primero permite volver al subestado que se encuentra en
el nivel más elevado mientras que el segundo facilita el regreso al subestado anidado.
Ejemplo
Una vez dada la orden de salida, y hasta el último salto, los participantes se encuentran en
el estado Concurso. Pueden ser descalificados en cualquier momento, pero la
descalificación deberá ser confirmada (en caso de polémica, por ejemplo). Si se anula, la
prueba vuelve a iniciarse en el estado en el que quedó en el momento de su interrupción.
La figura 8.14 muestra dicho funcionamiento utilizando un subestado de memoria para
volver al último subestado del concurso en caso de anularse una descalificación.
Ejemplo
El diagrama de timing
El diagrama de timing se introdujo en UML 2 para mostrar los cambios de estado de un
objeto cuando éstos dependen exclusivamente del tiempo. El diagrama indica entonces la
duración mínima y máxima de cada estado con ayuda de especificaciones temporales.
Ejemplo
Conclusión
El diagrama de estados-transiciones describe el ciclo de vida de los objetos encargados de
asegurar la dinámica del sistema. La descripción del ciclo de vida se realiza de forma
separada para cada uno de los objetos.
Este modelado es muy importante para asegurar que los objetos respondan a las
interacciones descritas en los diagramas de secuencia y comunicación estudiados en el
capítulo Modelado de la dinámica.
Ejercicios
1. El ticket de apuesta trifecta
2. La carrera de caballos
3. El tiovivo de madera
Una actividad es una serie de acciones. Una acción consiste en asignar un valor a un
atributo, crear o destruir un objeto, efectuar una operación, enviar una señal a otro objeto o
a uno mismo, etc.
Ejemplo
Retomamos el ejemplo del capítulo Modelado de los requisitos referente a la compra de una
yegua. Tanto la elección de la yegua como la comprobación de las vacunas son ejemplos de
actividad.
La actividad final se representa con un punto negro rodeado de un círculo (ver figura 9.3).
Puede ser simple, es decir, vincular sólo dos actividades. La figura 9.4 muestra su
representación gráfica.
Ejemplo
Las condiciones de guarda expresan las diferentes alternativas. Es conveniente anotar dos
actividades finales, una correspondiente a la renuncia a la compra y otra correspondiente a
una compra exitosa.
Para ello el diagrama se divide en particiones o calles. A cada calle corresponde el objeto
responsable de la realización de todas las actividades contenidas en esa calle o partición.
Ejemplo
La figura 9.10 representa el ejemplo de compra de una yegua en el que se describen las
actividades relativas al comprador y a la granja de cría.
Ejemplo
La figura 9.13 representa la gestión del pago de una yegua integrando la negociación del
precio. La gestión se incluye en el diagrama general de compra de la figura 9.14 en tanto
que actividad compuesta y se representa con una horquilla.
Conclusión
El diagrama de actividades representa las actividades realizadas por uno o varios objetos.
Puede corresponder a la descripción detallada de una actividad del diagrama de estados-
transiciones o a la descripción de un método. También puede describir la actividad de un
sistema o subsistema asignando las responsabilidades a los actores. El diagrama de
actividades constituye también una buena opción para describir casos de uso.
Ejercicios
1. El espectáculo ecuestre
2. La apuesta trifecta
Introducción
En el presente capítulo, abordaremos las posibilidades de UML para modelar la
arquitectura del sistema. Dicho modelado presenta dos aspectos:
Los componentes también pueden depender de otros componentes para llevar a cabo los
servicios que ofrecen. Esta dependencia se expresa en forma de una interfaz necesaria que
describe los servicios deseados.
El diagrama de componentes
1. Los componentes
Un componente es una unidad de software que ofrece una serie de servicios a través de una
o varias interfaces. Se trata de una caja negra cuyo contenido queda fuera del interés de los
clientes. Está completamente encapsulado. La definición de los componentes recuerda a la
definición de clases que implantan una o varias interfaces, como vimos en el capítulo
Modelado de objetos. Una clase que implanta una o varias interfaces es un componente. Por
el contrario, un componente no es necesariamente una clase. Las interfaces pueden
implantarse dentro de los componentes con lenguajes de programación no orientados a
objetos, como puede ser el lenguaje C.
La tecnología es otro de los aspectos de los componentes. Hoy en día existen muchas
tecnologías de componentes. Una tecnología de componentes define, entre otras cosas, el
lenguaje de programación de los clientes, el entorno de ejecución y la integración en la
plataforma de software subyacente (Windows, Java, etc.). Los componentes que usan una
tecnología se benefician de un estándar y, por tanto, se convierten en comercializables:
podemos encontrarlos en los estantes de las tiendas.
En UML 1, la noción de componente era muy amplia: los archivos ejecutables, las
bibliotecas compartidas o los scripts se consideraban componentes. En UML 2, la
definición se ha reducido a los componentes que ofrecen servicios a través de una o varias
interfaces.
Los componentes pueden depender de otros componentes para realizar operaciones
internas. En ese caso se convierten en clientes de esos otros componentes. Como cualquier
cliente de un componente, no conocen su estructura interna. Por tanto, sólo dependen de las
interfaces de los componentes de los cuales son clientes. Estas interfaces reciben el nombre
de interfaces necesarias del componente cliente. Las interfaces que describen los servicios
ofrecidos por un componente se denominan interfaces suministradas.
Ejemplo
Ejemplo
El sistema de información de un criadero de caballos está formado por un compendio de
componentes. La figura 10.4 muestra el diagrama de componentes de dicho sistema. Los
componentes VentanaGestiónCaballos y VentanaGestiónVentas administran en la pantalla
una ventana dedicada a la gestión de los caballos y otra dedicada a la gestión de las ventas
de caballos, respectivamente. El componente SistemaBaseDatos, como su nombre indica,
es un sistema de base de datos.
El diagrama de despliegue
El diagrama de despliegue describe la arquitectura física del sistema. Está compuesto de
nodos. Un nodo es una unidad material capaz de recibir y de ejecutar software. La mayoría
de nodos son ordenadores. Los vínculos físicos entre nodos también pueden describirse en
el diagrama de despliegue, corresponden a las ramas de la red.
Los nodos contienen software en su forma física, conocida como artefact. Los archivos
ejecutables, las bibliotecas compartidas y los scripts son ejemplos de formas físicas de
software.
Los componentes que constituyen la arquitectura del software del sistema se representan en
el diagrama de despliegue mediante un artefacto que, con frecuencia, es un ejecutable o una
biblioteca compartida.
La representación gráfica de los nodos, sus vínculos y los artefactos que contienen se
muestra en la figura 10.5.
Ejemplo
Conclusión
El diagrama de componentes y el diagrama de despliegue poseen menos elementos que los
diagramas estudiados en los capítulos precedentes. No obstante, resultan útiles para el
ensamblaje y el despliegue del sistema.
Introducción
En este capítulo estudiaremos la noción de perfil, que es un soporte para enriquecer las
capacidades de modelado de UML, especialmente en lo que respecta a la semántica, con el
objetivo de adaptar UML:
Los metamodelos contienen todas las construcciones que describen los elementos UML y,
en particular, aquellos que hemos estudiado en los capítulos precedentes. Un ejemplo de
estas construcciones es la clase Class que describe las clases o incluso la clase Interface que
describe las interfaces. Las clases son instancias de la clase Class, mientras que las
interfaces son instancias de la clase Interface. Las clases del metamodelo se conocen como
metaclases.
Los perfiles se describen mediante diagramas de perfiles, que forman parte de los
diagramas de estructura de UML. Introducen un tipo específico de empaquetado. Hemos
tratado los empaquetados en el capítulo relativo a la estructuración de los elementos de
modelado.
Para ser preciso, los perfiles no se reservan a extender únicamente el metamodelo de UML,
sino cualquier metamodelo. El MOF (meta-Object Facility) es un meta-meta-modelo
definido por la OMG para describir metamodelos. No obstante, ese tema sobrepasa el
marco de la presente obra y nosotros nos contentaremos escribiendo perfiles que extienden
el metamodelo de UML.
Los estereotipos
1. Las metaclases
Los estereotipos se definen como extensiones de una metaclase. Es conveniente, por tanto,
que en un primer momento estudiemos la noción de metaclase. A pesar de que las
especificaciones oficiales de UML no definan explícitamente esta noción, podemos decir
que una metaclase es una clase cuyas instancias son elementos de UML que a su vez
poseen instancias. Citemos, a título de ejemplo, la metaclase Class cuyas instancias son
clases, la metaclase Interface, cuyas instancias son interfaces y la metaclase Association,
cuyas instancias son asociaciones entre dos clases.
Una metaclase está representada en el metamodelo como una clase dotada del estereotipo
«Metaclase». La figura 11.1 muestra la representación simplificada de la metaclase Class
en UML, es decir, sin sus atributos, métodos y asociaciones.
Metaclase Descripción
Association Metaclase concreta que describe las asociaciones entre dos instancias
de la metaclase Class.
Class Metaclase concreta que describe las clases. Class es una subclase de
la metaclase Classifier. Introduce la descripción de las operaciones y
de las propiedades (llamadas atributos o roles).
Classifier Metaclase abstracta que describe elementos que pueden ser
especializados (introducción de la relación de
especialización/generalización).
Element Metaclase abstracta situada en la parte superior de la jerarquía de las
metaclases del metamodelo UML.
Interface Metaclase concreta que describe las interfaces que sólo poseen
operaciones. Interface es una subclase de la metaclase Classifier.
Operation Metaclase concreta que describe la firma de un método.
Package Metaclase concreta que describe un conjunto de instancias de
subclases concretas de la metaclase Element (empaquetado).
Property Metaclase concreta que describe un atributo o un extremo de
asociación (rol) con uno o varios valores caracterizados.
2. Las nociones de estereotipo y de asociación de extensión
a. Las nociones de base
Los estereotipos son clases que extienden metaclases del metamodelo de UML dentro de un
perfil. Introducen la terminología específica de una plataforma o de un dominio específico.
Un estereotipo no puede utilizarse solo: existe únicamente si está asociado al menos a una
metaclase. Esta asociación específica se conoce como asociación de extensión y se
representa mediante una flecha que parte del estereotipo y señala hacia la metaclase
extendida. La punta de la flecha es un triángulo negro completo, como se ilustra en el
diagrama de perfil de la figura 11.2.
En esta figura el estereotipo se representa en forma de clase llamada UnEstereotipo que está
provista del estereotipo «estereotipo». La metaclase extendida que se encuentra en el otro
extremo de la asociación de extensión es Class. Las cardinalidades de esta asociación son:
De esta forma, cada instancia del estereotipo está vinculada a una instancia de la metaclase.
Cada instancia de la metaclase está vinculada o no a una instancia del estereotipo.
Los estereotipos pueden ser requeridos por las metaclases. En ese caso, cada instancia de la
metaclase debe estar asociada a una instancia del estereotipo. Para establecer esta
modalidad, es preciso agregar la obligación {required} en el extremo de la asociación de
extensión situada del lado del estereotipo, tal y como se muestra en la figura 11.4.
Una vez aplicado el diagrama de perfil de la figura 11.4, todas las nuevas clases aparecerán
provistas sistemáticamente del estereotipo «CaballoDeTiro». Siempre es posible crear otros
estereotipos, como se ilustra en la figura 11.5.
Un estereotipo puede extender varias metaclases. Puede aplicarse entonces a las instancias
de cada una de esas metaclases. La figura 11.7 ilustra esa extensión.
Los estereotipos pueden ser abstractos o concretos. Un estereotipo concreto puede ser
instanciado y, por tanto, puede aplicarse a un elemento. Un estereotipo abstracto no se
puede instanciar: su finalidad es ser especializado para dar lugar a uno o varios estereotipos
concretos.
El deporte equino se declina de dos formas: el deporte consagrado a las carreras de trote y
galope y el deporte ecuestre consagrado a las demás formas de deporte equino cuya
finalidad no es ganar una carrera. El estereotipo «DeporteEquino» se introduce como un
estereotipo abstracto especializado por dos estereotipos concretos que corresponden a las
dos formas descritas anteriormente. Sólo esos dos estereotipos pueden aplicarse a una clase
que describa un deporte equino para cualificarla como deporte hípico o como deporte
ecuestre.
Como los atributos, los tag poseen un tipo. Sólo los tipos introducidos en el metamodelo (y,
como más adelante veremos, en el perfil) pueden utilizarse para caracterizar un tag.
Conviene bien señalar que la asociación vincula dos clases: Trote y TrotadorFrancés, y no
las instancias de esas clases. Efectivamente, la asociación no es específica de estas clases,
sino de los estereotipos que pone en conexión.
Por último, el tag javaStrictfp sirve para indicar si la palabra clave strictfp ha sido
especificada o no al definir la clase.
La presencia de la palabra clave strictfp provoca la utilización de tipos reales IEEE con los
métodos de cálculo asociados. Si la palabra clave no está, Java utiliza las operaciones de
cálculo real presentes en algunos procesadores.
Los perfiles también pueden introducir clases, tipos de datos (DataType), tipos primitivos y
enumeraciones. Esos tipos sólo pueden utilizarse dentro del perfil ya que se introducen a
nivel del metamodelo y no del modelo. Para usarlos a la vez en el perfil y en un diagrama
de clases a nivel del modelo, es conveniente introducir los tipos en un empaquetado distinto
que se puede importar al perfil y al diagrama de clases a la vez.
Un tipo de datos es un tipo en el que la igualdad entre dos instancias reposa en la igualdad
entre cada atributo de ambas instancias. Para las instancias de ese tipo no existe noción de
identidad como la propia de los objetos. Un tipo primitivo es un tipo de dato cuyo valor es
atómico, como los enteros, los reales y los boleanos.
Los perfiles
1. La representación de un perfil
El primer caso, donde todas las metaclases del metamodelo UML aparecen implícitamente
importadas por el perfil Caballos, puede verse en la figura 11.15.
El segundo caso, donde sólo se importan explícitamente en el perfil Caballos las dos
metaclases Class e Interface del metamodelo UML, se ilustra en la figura 11.16. Las demás
metaclases del metamodelo UML no son visibles. Las dos importaciones explícitas
sobrecargan la importación explícita.
Es posible aplicar varios perfiles a un mismo empaquetado. En caso de conflicto entre los
nombres, es conveniente usar el nombre del empaquetado como prefijo del nombre de los
estereotipos.
La figura 11.8 ilustra la aplicación del perfil CaballosDeporte al empaquetado
CriaderoCaballos. La clase TrotadorFrancés de ese empaquetado está provista del
estereotipo «CaballoDeporte» introducido en el perfil CaballosDeporte.
1. El perfil
2. El modelo
El modelo se presenta en las figuras 11.20 y 11.21 bajo la forma de dos diagramas de
clases. El diagrama de la figura 11.20 introduce varias clases entre las que se encuentran las
clases ComidaVegetal y Équido. Estas dos clases están vinculadas por una asociación inter-
objetos provista del estereotipo «Alimentación».
Introducción
En este anexo, y dentro del contexto del MDA, procederemos a presentar DB-MAIN, una
herramienta CASE (Computer Aided Software Engineering o ingeniería de software
asistida por ordenador) orientada a objetos y destinada a concebir sistemas de información
y, más concretamente, bases de datos relacionales. DB-MAIN se desarrolló en la
Universidad de Namur. Actualmente está comercializado por la sociedad REVER de
Charleroi.
DB-MAIN presenta otras características como pueden ser la técnica retroactiva o reverse
engineering (análisis de un esquema en el ámbito físico), la migración, la integración de
bases de datos o la tolerancia de XML. Le invitamos a que consulte la Web de DB-MAIN,
que podrá encontrar en la siguiente dirección: www.db-main.be
Transformación del modelo objeto en
modelo relacional
1. Transformación de las clases
En DB-MAIN es posible especificar que uno o varios atributos de una clase constituyan
una clave primaria, es decir, un identificador único de las instancias. Dos instancias
distintas de una clase no pueden presentar los mismos valores para ese atributo o conjunto
de atributos. Al producirse la transformación, los atributos constituyen la clave primaria de
la tabla generada.
Los métodos no se tienen en cuenta ya que se trata de una transformación a un PSM que
únicamente gestiona datos.
La figura A.1 muestra un diagrama de clases en DB-MAIN. Los atributos que forman la
clave primaria aparecen subrayados. La figura A.2 muestra el diagrama transformado en
esquema relacional, donde las claves aparecen con el prefijo id. El prefijo acc, por su parte,
significa que las claves primarias sirven para acceder a las líneas de la tabla.
El término instancia se reserva a las clases. El término utilizado para las tablas es fila (row
en inglés), o n-uplet (tuple en inglés) en las exposiciones teóricas.
En el modelo relacional, las claves primarias se usan como soporte para construir las
asociaciones. Para que una línea de una tabla A pueda hacer referencia a una línea de una
tabla B, se introduce una clave extranjera en la tabla A. Esta clave extranjera está formada
por atributos que toman los mismos valores que los atributos de la clave primaria de la tabla
B. El valor de la clave extranjera debe corresponder con uno de los valores de la clave
primaria para una de las líneas de la tabla B.
La figura A.3 muestra esta transformación. El prefijo ref sirve para especificar las claves
extranjeras.
c. Otras asociaciones
Las demás asociaciones (con cardinalidad máxima en los dos extremos superior a uno)
precisan de la creación de una tabla suplementaria para ser transformadas en el esquema
relacional.
Ésta está formada por dos claves extranjeras, cada una de ellas correspondiente a la clave
primaria de las tablas situadas en los extremos.
Dado que hay dos atributos que se designan con la palabra nombre, DB-MAIN ha agregado
automáticamente un prefijo al atributo introducido en la clase Caballo.
Una instancia de una subclase da lugar a una línea de la tabla derivada de dicha subclase.
La línea hace referencia a la línea que le corresponde en la tabla de su superclase. Las
tablas proponen tantas claves extranjeras de ese tipo como superclases posean. Para
recuperar el conjunto de los valores de la instancia, es preciso recurrir a una operación de
unión. Por ese motivo, la transformación no resulta demasiado práctica en las jerarquías
complejas.
En el capítulo Modelado de objetos vimos que dentro de las subclases pueden expresarse
cuatro especificaciones:
{incomplete}
ninguna especificación en DB-MAIN ausencia de símbolo
{overlapping}
{incomplete}
disyunción símbolo: D
{disjoint}
{complete}
cobertura símbolo: C
{overlapping}
{complete}
partición símbolo: P
{disjoint}
Para gestionar las especificaciones, DB-MAIN introduce una serie de atributos que sirven
de vínculo entre la superclase y las subclases. Luego agrega una especificación en el
vínculo para expresar la especificación entre subclases:
En SQL, el generador estándar produce código que exige al programador de aplicación una
gestión explícita de los atributos en función de la configuración de las subclases. El
generador paramétrico (hasta ahora para Oracle) produce los componentes (views, triggers,
check) que asumen plenamente las especificaciones y las operaciones de mutación (es
decir, de cambio de clase de una instancia).
4. Conclusión
Un club ecuestre pone a disposición de los clientes establos para guardar los caballos y
ofrece cursos de equitación y paseos. Sólo los socios tienen acceso a los cursos y a los
servicios de establo. Los demás clientes tienen la posibilidad de participar en los paseos y
de convertirse en socios.
Un tiovivo de caballos de madera ofrece a sus clientes la posibilidad de dar una vuelta en él
previo pago de una cantidad de dinero.
Construya el diagrama de secuencia de compra de una entrada para una carrera de caballos.
La taquilla y la impresora.
El diagrama de secuencia no incluye la entrega. Ésta puede ser objeto de otro diagrama de
secuencia.
Tenemos las clases Yegua, Semental, Potro, Potranca, Caballo, Cabalo macho y Caballo
hembra, así como las asociaciones padre y madre. Establezca la jerarquía de clases
haciendo figurar en ella ambas asociaciones.
Introduzca la clase Manada. Establezca la asociación de composición entre esta clase y las
clases ya introducidas.
Las clases Semental y Potro no cubren la clase CaballoMacho, ya que existen los caballos
castrados.
Modele los aspectos estáticos del texto siguiente en forma de diagrama de clases.
Una central de caballos vende diferentes tipos de productos para caballos: productos de
mantenimiento, alimentación, equipamiento (para montar el caballo), herraje.
Un pedido contiene una serie de productos y especifica la cantidad de cada uno de ellos. En
caso necesario se puede elaborar un presupuesto antes de pasar el pedido. Si alguno de los
productos no está en stock, a petición del cliente, el pedido puede dividirse en varias
entregas. Cada entrega da lugar a una factura.
Los estados de una carrera de caballos pueden ser: A la espera de los caballos, A la espera
de la salida, Carrera en curso, Llegada, Anulada.
3. El tiovivo de madera
2. La apuesta trifecta
Glosario
Actividad
Una actividad es una serie de acciones. Una acción consiste en asignar un valor a un
atributo, crear o destruir un objeto, efectuar una operación, enviar una señal a otro objeto o
a sí mismo, etc.
Actividad compuesta
Actor
Los actores primarios, para los cuales el objetivo del caso de uso es esencial.
Los actores secundarios, que interactúan con el caso de uso, pero cuyo objetivo no
es esencial.
Alternativa
Artefacto
Un artefacto está constituido por la forma física de un software. Un archivo ejecutable, una
biblioteca compartida o un script son ejemplos de formas físicas de software.
Asociación reflexiva
Atributo calculado
El valor del un atributo calculado viene dado por una función basada en el valor de otros
atributos.
Atributo de clase
Un atributo de clase está vinculado a la clase misma y no a cada una de las instancias. Estos
atributos son compartidos por todas las instancias de la clase.
Bucle
Calificación
Calle (o partición)
Una calle agrupa todas las actividades bajo responsabilidad de un mismo objeto.
Caso de uso
En los casos de uso con objetivo usuario, esta serie de interacciones está vinculada a un
objetivo funcional del usuario.
En los casos de uso de subfunción, la serie de interacciones está destinada a ser incluida en
otro caso de uso.
Ciclo de vida
El ciclo de vida de un objeto es el conjunto de sus estados y de las transiciones que los
unen.
Clase
Las clases están formadas por conjuntos de objetos similares con los mismos atributos y
métodos. Esta representación común se define en común en el ámbito de la clase.
Las clases abstractas definen modelos abstractos y no poseen instancias directas. Estas
clases, en tanto que superclases, sirven para factorizar atributos y métodos comunes de
varias clases concretas.
Las clases-asociaciones son a la vez asociaciones y clases cuyas instancias son los
elementos de la asociación. De esta forma, los elementos pueden estar dotados de atributos
o de operaciones.
Componente
Un componente es una unidad de software que ofrece servicios a través de una o varias
interfaces. Es una caja negra cuyo contenido no interesa a sus clientes.
Composición
Diagrama de actividades
Este tipo de diagrama describe las actividades de uno o de varios objetos así como sus
encadenamientos.
Diagrama de clases
Diagrama de componentes
Diagrama de comunicación
Describe las interacciones entre un conjunto de objetos mostrando, de manera espacial, los
envíos de mensajes que se producen entre ellos.
Diagrama de despliegue
Diagrama de empaquetado
Diagrama de estados-transiciones
Muestra el conjunto de estados del ciclo de vida de un objeto separados por transiciones.
Diagrama de objetos
Describe las interacciones entre un conjunto de objetos mostrando los envíos de mensajes
que se producen entre ellos de manera secuencial.
Diagrama de timing
El diagrama de timing muestra los cambios de estado de un objeto en función del tiempo.
Un elemento de una asociación es un vínculo entre las instancias de las clases situadas en
los extremos de la misma.
Empaquetado
Encadenamiento de actividades
Encapsulación
Envío de mensajes
Véase Mensaje.
Escenario
Un escenario es una instancia de un caso de uso con todas las alternativas establecidas.
Especialización
La especialización es la relación que vincula a una superclase con una de sus subclases.
Existen cuatro especificaciones sobre la relación de herencia entre una superclase y sus
subclases:
Estado
Estereotipo
Generalización
La generalización es la relación que une a una subclase con su superclase (o con una de las
superclases, en caso de herencia múltiple).
Granulado
Herencia
La herencia es la propiedad que hace que una subclase se beneficie de la estructura y del
comportamiento de su superclase.
Interfaz
Una interfaz es una clase abstracta que sólo contiene las firmas de métodos. La firma de un
método está formada por su nombre y sus parámetros.
Una interfaz suministrada describe los servicios ofrecidos por un componente. Una interfaz
necesaria describe los servicios que un componente espera de otro componente del cual es
cliente.
Línea de vida
Marco de interacción
Un marco de interacción es una parte del diagrama de secuencia asociada a una etiqueta
con un operador que determina la modalidad de ejecución. Las principales modalidades son
la bifurcación condicional y el bucle.
MDA
MDA (Model Driven Architecture o arquitectura dirigida por modelos) es una propuesta de
la OMG cuyo objetivo es diseñar sistemas basados sólo en el modelado del dominio,
independientemente de la plataforma.
Mensaje
Los mensajes se envían a los objetos para activarlos y provocar la ejecución del método del
mismo nombre. Los envíos de mensajes son llamadas al método.
Los mensajes pueden enviarse de manera asincrónica. En ese caso, el que realiza la llamada
espera a que concluya la ejecución del método del objeto receptor para continuar su
ejecución.
También pueden enviarse de manera sincrónica. En ese caso el que realiza la llamada
continúa la ejecución inmediatamente después del envío del mensaje.
Método
Los métodos son conjuntos de instrucciones que toman valores en la entrada y modifican
los valores de los atributos o producen un resultado.
El conjunto de métodos de una clase describe el comportamiento de las instancias de la
misma.
Método de clase
Los métodos de clase están vinculados a la propia clase y no a una instancia. Se invocan a
través de la clase y no a través de una de sus instancias.
Navegación
Nodo
Objeto
Los objetos son entidades identificables del mundo real. En el modelo UML, los objetos
son instancias de una clase.
OCL
OMG
El OMG o Object Management Group es un consorcio formado por más de 800 sociedades
y universidades cuyo objetivo es promover las tecnologías orientadas a objetos.
Partición
Véase Calle.
PIM
Polimorfismo
Proceso unificado
PSM
Relación de comunicación
Relación de extensión
Relación de inclusión
Relación de realización
Esta relación existe asimismo entre una interfaz y un componente que implanta sus
métodos.
Tipo
El tipo puede ser una clase o un tipo estándar. Los tipos estándar se designan como sigue:
Una transición es un vínculo orientado entre dos estados que expresa el hecho de que el
objeto puede pasar del estado inicial de la transición al estado final.
UML
Léxico Español-inglés
Abstracto abstract
Actividad activity
Actividad compuesta composite activity
Actor actor
aggregation (or weak
Agregación (o composición débil)
composition)
Alternativa choice
Artefacto artifact
Asociación reflexiva reflexive association
Atributo calculado derived attribute
Atributo de clase class attribute
Boleano boolean
Bucle loop
Cadena de caracteres string
Calificación qualification
Calificador qualifier
Calle o partición swimlane
Cardinalidad mínima, máxima minimal, maximal multiplicity
Caso de uso use case
Ciclo de vida lifecycle
Clase class
Columna column
Componente component
Composición (fuerte) (strong) composition
Condición de guarda guard condition
Dependencia dependency
Diagrama de actividades activity diagram
Diagrama de caso de uso use case diagram
Diagrama de clases class diagram
Diagrama de componentes component diagram
Diagrama de comunicación communication diagram
Diagrama de despliegue deployment diagram
Diagrama de empaquetado package diagram
statechart diagram or state
Diagrama de estados-transiciones
diagram
Diagrama de estructura compuesta composite structure diagram
Diagrama de interacción interaction diagram
Diagrama de objetos object diagram
Diagrama de perfil profile diagram
Diagrama de secuencia sequence diagram
Diagrama de timing timing diagram
Diagrama de vista de conjunto de las
interaction overview diagram
interacciones
Empaquetado package
Encadenamiento de actividades activity edge
Encapsulación encapsulation
Entero encapsulation
Envío de mensaje message sending
Escenario scenario
Especialización specialisation
inheritance relationship
Especificación de la relación de herencia
constraint
Estado state
Estereotipo stereotype
Falso false
Fila row
Generalización generalisation
Granulado granularity
Herencia inheritance
Instancia instance
Interfaz interface
Lenguaje de especificaciones orientadas a Object Constraint Language
objetos (OCL) (OCL)
Unified Modeling Language
Lenguaje unificado de modelado (UML)
(UML)
Línea de vida lifeline
Marco de interacción interaction fragment
MDA (Model Driven
MDA (Arquitectura guiada por modelos)
Architecture)
Mensaje message
Método method
Método de clase class method
Modelo específico de la plataforma (PSM) Platform Specific Model (PSM)
Platform Independent Model
Modelo independiente de la plataforma (PIM)
(PIM)
Navegación navigation
Nodo node
Objeto object
Perfil profile
Polimorfismo polymorphism
Proceso process
Proceso Unificado Unified Process (UP)
Relación de comunicación communication relationship
Relación de extensión extension relationship
Relación de inclusión inclusion relationship
Relación de realización realisation relationship
Si if
Si no else
Sistema system
Tipo type
Transición transition
Verdadero true
Vínculo (entre objetos) link (between objects)
Léxico Inglés-español
Abstract abstracto
Activity actividad
Activity diagram diagrama de actividades
Activity edge encadenamiento de actividades
Actor actor
Aggregation (or weak composition) agregación (o composición débil)
Artifact artefacto
Boolean boleano
Choice alternativa
Class clase
Class attribute atributo de clase
Class diagram diagrama de clases
Class method método de clase
Column columna
Communication diagram diagrama de comunicación
Communication relationship relación de comunicación
Component componente
Component diagram diagrama de componentes
Composite activity actividad compuesta
Composite Structure Diagram diagrama de estructura compuesta
Composition (strong composition) composición (fuerte)
Dependency dependencia
Deployment diagram diagrama de despliegue
Derived attribute atributo calculado
Else si no
Encapsulation encapsulación
Extension relationship relación de extensión
False falso
Generalisation generalización
Granularity granulado
Guard condition condición de guarda
If si
Inclusion relationship relación de inclusión
Inheritance herencia
Inheritance relationship constraint especificación de la relación de herencia
Instance instancia
Integer entero
Interaction diagram diagrama de interacción
Interaction fragment marco de interacción
diagrama de vista de conjunto de las
Interaction overview diagram
interacciones
Interface interfaz
Lifecycle ciclo de vida
Lifeline línea de vida
Link (between objects) vínculo (entre objetos)
Loop bucle
MDA (Model Driven Architecture) MDA (Arquitectura guiada por modelos)
Message mensaje
Message sending envío de mensaje
Method método
Multiplicity (minimal, maximal
cardinalidad mínima, máxima
multiplicity)
Navigation navegación
Node nodo
Object objeto
lenguaje de especificaciones orientadas a
Object Constraint Language (OCL)
objetos (OCL)
Object diagram diagrama de objetos
Package empaquetado
Package diagram diagrama de empaquetado
modelo independiente de la
Platform Independent Model (PIM)
plataforma (PIM)
Platform Specific Model (PSM) modelo específico de la plataforma (PSM)
Polymorphism polimorfismo
Process proceso
Profile
perfil
Notación gráfica
Diagrama de actividades
Diagrama de clases
Diagrama de comunicación
Diagrama de componentes
Diagrama de despliegue
Diagrama de estados-transiciones
Diagrama de secuencia
Bibliografía
Alistair Cockburn, Rédiger des cas d’utilisation efficaces, Eyrolles, 1999
Anneke Kleppe, Jos Warmer, Wim Bast, MDA Explained: The Model Driven
Architecture - Practice and Promise, Addison-Wesley, 2003
Jos Warmer, Anneke Kleppe, The Object Constraint Language: Getting Your Models ready
for MDA, Second Edition, Addisson-Wesley, 2003
Stephen J. Mellor, Kendall Scott, Axel Uhl, Dirk Weise, MDA Distilled, Addisson-Wesley,
2004
Stephen J. Mellor, Marc J. Balcer, Stephen Mellor, Marc Balcer, Executable UML: A
Foundation for Model Driven Architecture, Addison-Wesley, 2002
Tim Weilkiens and Bernd Oestereich, UML 2 Certification Guide: Fundamental &
Intermediate Exams, The MK/OMG Press, 2006