Los diagramas de clases son diagramas es­tru­c­tu­ra­les del lenguaje unificado de modelado o UML (unified modeling language). Este lenguaje de modelado visual es un estándar ISO para vi­sua­li­zar los sistemas de la pro­gra­ma­ción orientada a objetos, aunque también permite vi­sua­li­zar procesos de negocio. Con ayuda de elementos gráficos, UML muestra los estados de los sistemas y describe las in­ter­ac­cio­nes entre los elementos que lo componen. Para poder hacerlo, la notación UML define las formas y las líneas para 14 tipos de diagrama.

Los diagramas de clases UML

Este lenguaje de me­ta­mo­de­la­do describe tanto a los elementos del lenguaje como al lenguaje mismo, de­fi­nie­n­do unidades li­n­güí­s­ti­cas para di­fe­re­n­tes niveles. Una de estas unidades en este lenguaje visual es, por ejemplo, el co­m­po­r­ta­mie­n­to, que describe al mismo tiempo a una metaclase y a una de­no­mi­na­ción genérica para todos los factores dinámicos dentro de un sistema. Otra de estas unidades es el objeto, el elemento fu­n­da­me­n­tal de la pro­gra­ma­ción orientada a objetos. Los diagramas de clases UML modelan los objetos como in­s­ta­n­cias de clases. Esto convierte a los diagramas de clases en uno de los diagramas UML más uti­li­za­dos y de mayor im­po­r­ta­n­cia.

Según su función, los diagramas se dividen en dos grandes ca­te­go­rías: los de co­m­po­r­ta­mie­n­to (dinámicos) y los es­tru­c­tu­ra­les (estáticos). Los diagramas de co­m­po­r­ta­mie­n­to vi­sua­li­zan procesos dinámicos. El diagrama de ac­ti­vi­da­des, por ejemplo, muestra grá­fi­ca­me­n­te cómo in­ter­ac­túan las diversas acciones co­n­te­ni­das en un proceso. Por el contrario, los diagramas es­tru­c­tu­ra­les muestran estados estáticos, ilustran los elementos que integran un sistema y qué de­pe­n­de­n­cias tienen entre sí.

Entre los diagramas de co­m­po­r­ta­mie­n­to, los diagramas de in­ter­ac­ción no se limitan a modelar el co­m­po­r­ta­mie­n­to general de un sistema, sino que centran su atención en los flujos de in­fo­r­ma­ción entre los objetos durante la ejecución de un proceso. Aquí se incluyen, por ejemplo, los diagramas de secuencia, que modelan la secuencia cro­no­ló­gi­ca de los mensajes que in­te­r­ca­m­bian los objetos en un caso de uso.

El más utilizado entre los es­tru­c­tu­ra­les o estáticos, el diagrama de clases asigna clases a las in­s­ta­n­cias de objeto en función de sus pro­pie­da­des, lo que implica una cierta de­pe­n­de­n­cia je­rá­r­qui­ca. Al mismo tiempo existen re­la­cio­nes entre las di­fe­re­n­tes clases o entre objetos.

Áreas de apli­ca­ción de los diagramas de clases UML

Los diagramas de clases utilizan elementos de sistemas para re­pre­se­n­tar estados grá­fi­ca­me­n­te y, al desglosar las es­tru­c­tu­ras hasta la instancia más pequeña, son idóneos para vi­sua­li­zar ar­qui­te­c­tu­ras de software de­ta­lla­das de las que pueden derivarse pasos concretos de pro­gra­ma­ción. Algunos entornos de pro­gra­ma­ción asistidos por software co­n­vie­r­ten los diagramas UML en marcos de código. Gracias a apli­ca­cio­nes de team sharing, los de­sa­rro­lla­do­res pueden co­mu­ni­car­se entre sí dentro de la misma empresa o con otros re­s­po­n­sa­bles. Para los profanos, un diagrama UML pro­po­r­cio­na una vista general de las es­tru­c­tu­ras y los procesos que se han pla­ni­fi­ca­do. También pueden fo­r­mu­lar­se re­qui­si­tos de sistema para que los im­ple­me­n­ten los de­sa­rro­lla­do­res. Los expertos de TI pueden modelar y modificar los diagramas sin tener que programar entornos o procesos complejos ya en la fase de pla­ni­fi­ca­ción.

¿Cuáles son las áreas de apli­ca­ción de los diagramas de clases?

  • Describen tipos dentro de un sistema. El aspecto visual no está vinculado a la apli­ca­ción que vaya a uti­li­zar­se en el futuro, sino que puede im­ple­me­n­tar­se con di­fe­re­n­tes lenguajes de pro­gra­ma­ción y entornos.
  • Modelan ar­qui­te­c­tu­ras de software que ya existen. Si se han de montar más co­m­po­ne­n­tes, los diagramas muestran las es­tru­c­tu­ras donde podrían in­te­grar­se. Para los elementos de sistema futuros, los diagramas de clases crean una guía para el código de programa, que puede ser más o menos detallada según se requiera.
  • Re­pre­se­n­tan vi­sua­l­me­n­te modelos de datos. Son adecuados para sistemas de diferente co­m­ple­ji­dad.
  • En apli­ca­cio­nes con muchas ani­da­cio­nes, la do­cu­me­n­ta­ción y el ma­n­te­ni­mie­n­to pueden ser muy complejos. Los diagramas de clases muestran una vista general del esquema.
  • Re­pre­se­n­tan los re­qui­si­tos de un software. Pueden enviarse como archivo de imagen en canales internos, pe­r­mi­tie­n­do a los expertos de de­pa­r­ta­me­n­tos di­fe­re­n­tes comentar e in­te­r­ca­m­biar opiniones sobre la ar­qui­te­c­tu­ra.
  • El estándar UML utiliza diagramas de clases para re­pre­se­n­tar vi­sua­l­me­n­te su propia notación.

Diagramas de clases: notación según UML

Los diagramas de clases UML se componen de clases, in­s­ta­n­cias (objetos) e in­te­r­fa­ces y vi­sua­li­zan re­la­cio­nes je­rá­r­qui­cas, así como las aso­cia­cio­nes entre estos elementos. La notación de este tipo de diagrama es la base para la mayor parte del resto de diagramas es­tru­c­tu­ra­les.

UML 2 define a los diagramas de es­tru­c­tu­ra como cla­si­fi­ca­do­res. Dentro del me­ta­mo­de­la­do UML, los diagramas de paquetes, de co­m­po­ne­n­tes, etc., son subclases del diagrama de es­tru­c­tu­ra, pero este mismo no se modela, puesto que se trata de una clase abstracta.

El diagrama de clases está indicado sobre todo como ejemplo para un diagrama de es­tru­c­tu­ra. Otros diagramas de esta categoría utilizan co­m­po­ne­n­tes mo­di­fi­ca­dos del diagrama de clases para su notación.

Hecho

UML considera al cla­si­fi­ca­dor (Cla­s­si­fier) como una metaclase abstracta que sirve para cla­si­fi­car los elementos de un lenguaje de modelado bajo un concepto común. Esto recibe el nombre de ge­ne­ra­li­za­ción y permite formular el estándar de forma general. Si la es­pe­ci­fi­ca­ción aborda un de­te­r­mi­na­do elemento, solo se ha de es­pe­ci­fi­car esta pa­r­ti­cu­la­ri­dad.

La clase

En los diagramas de clases, la clase es un elemento-modelo y una es­pe­cia­li­za­ción del cla­si­fi­ca­dor en­ca­p­su­la­do (En­ca­p­su­la­te­d­Cla­s­si­fier) y del cla­si­fi­ca­dor de co­m­po­r­ta­mie­n­to (Beha­vio­re­d­Cla­s­si­fier). Comprende un conjunto de in­s­ta­n­cias. Las in­s­ta­n­cias-objeto dentro de una clase comparten las mismas pro­pie­da­des (At­tri­bu­tes) y co­m­po­r­ta­mie­n­tos (Methods), así como la misma semántica, es decir, utilizan los mismos ca­ra­c­te­res con el mismo si­g­ni­fi­ca­do. Esto convierte a la clase en una especie de plantilla para sus objetos, “in­s­ta­n­cia­n­do” los objetos y de­fi­nie­n­do su conducta en el sistema.

Hecho

La instancia es una ma­ni­fe­s­ta­ción concreta de un elemento abstracto. Ejecuta un co­m­po­r­ta­mie­n­to prescrito dentro de los pa­rá­me­tros dados. UML designa a muchas in­s­ta­n­cias de forma explícita. Así, el objeto es una instancia designada de la clase. Los atributos de las in­s­ta­n­cias se modelan con diagramas a nivel de las in­s­ta­n­cias. En lugar de un diagrama de clases, se dibuja por ejemplo un diagrama de objetos.

Los cla­si­fi­ca­do­res en­ca­p­su­la­dos amplían a los llamados cla­si­fi­ca­do­res es­tru­c­tu­ra­dos, que tienen la pa­r­ti­cu­la­ri­dad de que pueden pre­s­cri­bir una es­tru­c­tu­ra e in­co­r­po­rar elementos co­ne­c­ta­dos. Estos elementos (metaclase: Co­n­ne­c­ta­bleE­le­me­nts) influyen en el co­m­po­r­ta­mie­n­to de los cla­si­fi­ca­do­res. Cada elemento conectado re­pre­se­n­ta a un pa­r­ti­ci­pa­n­te del co­m­po­r­ta­mie­n­to en el cla­si­fi­ca­dor, por eso se dice que estos elementos asumen un rol. El cla­si­fi­ca­dor en­ca­p­su­la­do posee, por su parte, un puerto (Port), con el que puede aislarse del sistema sin perder la conexión.

Los cla­si­fi­ca­do­res de co­m­po­r­ta­mie­n­to ostentan a menudo una conexión a un punto de contacto, la In­te­r­fa­ce­Rea­li­za­tion o ejecución de la interfaz. So­po­r­ta­n­do todas las funciones de la interfaz, el cla­si­fi­ca­dor acepta de forma implícita sus co­n­di­cio­nes. Para re­pre­se­n­tar grá­fi­ca­me­n­te a la In­te­r­fa­ce­Rea­li­za­tion (también llamada “Lollipop”), se utiliza un círculo vacío que se une a la clase con una línea.

Estas me­ta­cla­ses cla­si­fi­can a los objetos. La clase es la ma­ni­fe­s­ta­ción es­pe­cí­fi­ca de estas me­ta­cla­ses, de­te­r­mi­na­n­do aún más la cla­si­fi­ca­ción y co­n­cre­ti­za­n­do a cada uno de los co­m­po­ne­n­tes que conforman la es­tru­c­tu­ra y el co­m­po­r­ta­mie­n­to de los objetos.

Las clases poseen pro­pie­da­des que las definen tanto a ellas como a sus objetos su­bo­r­di­na­dos, entre ellas:

  • Pro­pie­da­des (Pro­pe­r­ties o At­tri­bu­tes, si pe­r­te­ne­cen a la clase)
  • Ope­ra­cio­nes o métodos (Ope­ra­tio­ns, pueden invocarse para un objeto)
  • Re­ce­p­to­res (Re­ce­p­tio­ns) desde UML 2.0
  • Co­ne­xio­nes (Ports) desde UML 2.0
  • Co­ne­c­to­res (Co­n­ne­c­to­rs)

Cuando se crea un diagrama de clases, estas pro­pie­da­des se añaden a la notación. En UML, las clases se re­pre­se­n­tan como un re­c­tá­n­gu­lo dibujado con línea continua y compuesto por tres filas ho­ri­zo­n­ta­les. Solo es obli­ga­to­rio modelar la superior porque aquí se define el nombre de la clase. Las otras dos, una que contiene a los atributos (in­te­r­me­dio) y una que expresa las ope­ra­cio­nes o los métodos que puede utilizar la clase (inferior) son op­cio­na­les. Añadiendo a los nombres de estos miembros (atributos y métodos) uno de los símbolos que se detallan a co­n­ti­nua­ción (mo­di­fi­ca­do­res de acceso a miembros), se es­pe­ci­fi­ca su vi­si­bi­li­dad:

  • + = pública
  • - = privada
  • # = protegida
  • / = derivada (
  • ~ = paquete
  • * = aleatoria

Pro­pie­da­des

Las pro­pie­da­des son elementos in­te­r­de­pe­n­die­n­tes. Los atributos propios de la clase (ow­ne­dA­t­tri­bu­tes) son siempre roles y se conectan por medio de co­ne­c­to­res. Si poseen la propiedad is­Co­m­po­si­te= true (“está compuesto = verdad”), reciben el nombre de partes (Parts).

La propiedad UML es una ca­ra­c­te­rí­s­ti­ca de las es­tru­c­tu­ras que puede tener apli­ca­cio­nes di­fe­re­n­tes. Además de la función de atributo en una clase, también puede re­pre­se­n­tar los extremos en las re­la­cio­nes de aso­cia­ción.

El tipo de propiedad se deriva del nombre del cla­si­fi­ca­dor, pero también se puede es­pe­ci­fi­car un valor estándar para una propiedad, y los mo­di­fi­ca­do­res pueden concretar cómo se comporta:

  • Ordenado (notación: isOrdered = true)
  • Único (isUnique = true)
  • No único (isUnique = false)
  • Protegido contra escritura (la propiedad solo puede leerse: is­Rea­dO­n­ly = true)
  • Secuencia (la propiedad es una colección ordenada: isUnique = false e isOrdered = true)
  • Aso­cia­ción (derivada de su­b­co­n­ju­n­tos: union)
  • ID (pertenece a la de­no­mi­na­ción de su cla­si­fi­ca­dor, id)
  • Li­mi­ta­ción de propiedad (una li­mi­ta­ción que influye en la propiedad: property-co­n­s­trai­nt)
  • Re­de­fi­ni­ción de una propiedad (redefine a una propiedad heredada: redefines [Me­r­k­ma­l­s­na­me])
  • Su­b­co­n­ju­n­to de la propiedad (simboliza a una propiedad que es un su­b­co­n­ju­n­to de una propiedad: subsets [Me­r­k­ma­l­s­na­me])

Ope­ra­cio­nes

Las ope­ra­cio­nes son funciones de co­m­po­r­ta­mie­n­to y se utilizan en clases, en tipos de datos o en in­te­r­fa­ces. Las ope­ra­cio­nes invocan la instancia de una clase y es­pe­ci­fi­can estos aspectos de una llamada:

  • Nombre
  • Tipo
  • Parámetro
  • Li­mi­ta­cio­nes

La operación pertenece al cla­si­fi­ca­dor al cual se subordina, que podría mo­di­fi­car­la re­de­fi­nie­n­do el tipo o el parámetro.

Antes de que una operación se ejecute, se ha de cumplir una serie de co­n­di­cio­nes previas, pero UML no define cómo se comporta la llamada de co­m­po­r­ta­mie­n­to si no se cumplen las co­n­di­cio­nes previas. Se han de es­pe­ci­fi­car también las co­n­di­cio­nes po­s­te­rio­res que se han de cumplir si la operación finaliza. Las co­n­di­cio­nes de campo re­s­tri­n­gen el valor devuelto a un valor que se calcula a partir de sus es­pe­ci­fi­ca­cio­nes y que ha de cumplir con las co­n­di­cio­nes po­s­te­rio­res. Pero mientras se ejecuta, la operación también puede invocar una excepción. Si esto sucede, pro­ba­ble­me­n­te no pueda cumplir con las co­n­di­cio­nes po­s­te­rio­res.

La notación para diagramas de clases prescribe que las ope­ra­cio­nes se escriban en el cuerpo de la clase. Si bien son datos obli­ga­to­rios según el estándar UML, puede pre­s­ci­n­di­r­se de ellos. Solo el nombre es im­pe­ra­ti­vo.

Re­ce­p­to­res

El receptor muestra que un cla­si­fi­ca­dor está preparado para recibir una señal y define qué tipos de señal aceptan las in­s­ta­n­cias de la clase. El receptor recibe el mismo nombre que su señal. Los datos co­rre­s­po­n­die­n­tes se anotan en el cuerpo de la clase en una fila bajo las ope­ra­cio­nes.

Puertos

Los puertos son co­ne­c­to­res para cla­si­fi­ca­do­res en­ca­p­su­la­dos. Re­pre­se­n­tan el punto en el que los cla­si­fi­ca­do­res in­ter­ac­túan con su entorno. Ex­ce­p­tua­n­do los puertos, los cla­si­fi­ca­do­res en­ca­p­su­la­dos son un sistema cerrado en sí mismo. El hecho de que tanto su es­tru­c­tu­ra como sus elementos de co­m­po­r­ta­mie­n­to estén aislados del sistema restante permite que puedan es­pe­ci­fi­car­se li­bre­me­n­te. Siempre y cuando un sistema cumpla las re­s­tri­c­cio­nes del puerto, el cla­si­fi­ca­dor en­ca­p­su­la­do puede uti­li­zar­se en entornos di­fe­re­n­tes.

UML permite a los cla­si­fi­ca­do­res tener varios puertos. Para cada uno de ellos pueden definirse reglas es­pe­cí­fi­cas. El puerto es una propiedad del cla­si­fi­ca­dor, por lo que las reglas se definen en el campo de las pro­pie­da­des. Entre estas se incluyen los servicios que ofrece el cla­si­fi­ca­dor a su entorno y los que necesita. Para di­fe­re­n­ciar flujos de in­fo­r­ma­ción di­fe­re­n­tes se ha de ide­n­ti­fi­car a los puertos que se han utilizado para ellos.

Los mismos puertos también tienen pro­pie­da­des. Si un puerto ejecuta funciones públicas del cla­si­fi­ca­dor, se indica con la propiedad isService. Si isService = true, el puerto se considera un co­m­po­ne­n­te im­pre­s­ci­n­di­ble de las funciones visibles hacia fuera del cla­si­fi­ca­dor. Si isService = false, el puerto no forma parte de las funciones pri­n­ci­pa­les y, al igual que cualquier otra función interna, puede mo­di­fi­car­se o eli­mi­nar­se.

Los puertos también in­ter­ac­túan con in­te­r­fa­ces, que pueden ser ne­ce­sa­rias o puestas a di­s­po­si­ción (ver apartado In­te­r­fa­ces). La interfaz conectada al puerto es­pe­ci­fi­ca las in­ter­ac­cio­nes que tienen lugar a través del puerto. Como el conector es una propiedad, tiene un tipo. El valor de is­Co­n­ju­ga­ted media entre los tipos y la interfaz del puerto. Si el valor es verdadero, la interfaz requerida puede derivarse del tipo de puerto o del conjunto de in­te­r­fa­ces que realiza el tipo del puerto. La interfaz pro­po­r­cio­na­da se deriva del conjunto de las in­te­r­fa­ces. Si is­Co­n­ju­ga­ted es verdadero, esta interfaz de deriva del tipo.

Si un cla­si­fi­ca­dor en­ca­p­su­la­do genera una instancia, también se crean las in­s­ta­n­cias co­rre­s­po­n­die­n­tes para cada uno de sus puertos. Un puerto mantiene a cada instancia en co­n­co­r­da­n­cia con su tipo y su mu­l­ti­pli­ci­dad (ver más adelante). UML denomina a las in­s­ta­n­cias puntos de in­ter­ac­ción. Cada instancia posee re­fe­re­n­cias únicas que le sirven para di­fe­re­n­ciar las distintas so­li­ci­tu­des para funciones de co­m­po­r­ta­mie­n­to que se dirigen a sus puertos.

Los puertos con la cualidad is­Beha­vior = true envían una petición a la instancia del cla­si­fi­ca­dor. Esta petición asume el co­m­po­r­ta­mie­n­to es­pe­ci­fi­ca­do de la instancia, y es que estos puertos llamados de co­m­po­r­ta­mie­n­to no envían las pe­ti­cio­nes al interior del cla­si­fi­ca­dor. Si en el diagrama de clases no se ha definido ningún co­m­po­r­ta­mie­n­to, los mensajes dirigidos a estos puertos se pierden.

Los puertos se modelan como un pequeño cuadrado en el marco del cla­si­fi­ca­dor al cual pertenece. En el puerto se dibujan las in­te­r­fa­ces ne­ce­sa­rias o puestas a di­s­po­si­ción. Si no es­pe­ci­fi­cas ninguna propiedad especial para el puerto, la interfaz se dibuja sin puerto.

Co­ne­c­to­res

Los co­ne­c­to­res definen co­ne­xio­nes entre dos o más in­s­ta­n­cias. La es­pe­ci­fi­ca­ción permite que se co­mu­ni­quen. Al contrario que las re­la­cio­nes, como la aso­cia­ción, los co­ne­c­to­res no unen cualquier tipo de instancia, sino solo aquellas definidas como elementos de conexión. Los co­ne­c­to­res se modelan como líneas con al menos dos finales que co­rre­s­po­n­den a las in­s­ta­n­cias pa­r­ti­ci­pa­n­tes que asignan un tipo a los elementos su­s­ce­p­ti­bles de co­ne­c­tar­se.

Mu­l­ti­pli­ci­da­des

Este parámetro prescribe cuántas in­s­ta­n­cias puede formar una clase es­tru­c­tu­ra­da y restringe los atributos y las ope­ra­cio­nes. Es una parte de la es­tru­c­tu­ra interna, un elemento prescrito en el cuerpo de la clase, y se escribe detrás de los atributos y las ope­ra­cio­nes. En este campo también se incluye la topología. Para unir los nodos (in­s­ta­n­cias objeto) se utilizan rutas de co­mu­ni­ca­ción (Co­m­mu­ni­ca­tio­n­Pa­ths) a redes de topología.

Las mu­l­ti­pli­ci­da­des se escriben así:

<mu­l­ti­pli­ci­dad> : <re­s­tri­c­ción de mu­l­ti­pli­ci­dad> [<De­no­mi­na­ción de orden> , <De­no­mi­na­ción de unicidad>]

Mediante la re­s­tri­c­ción de mu­l­ti­pli­ci­dad se designa un valor fijo o un rango:

  • 0 = La clase no de­sa­rro­lla in­s­ta­n­cias (poco frecuente)
  • 0..1 = Una o ninguna instancia
  • 1 o 1..1 = Solo una instancia
  • 0..* o * = Ninguna instancia o varias con un valor máximo in­de­fi­ni­do
  • 1..* = Una instancia o más con valor máximo in­de­fi­ni­do

El or­de­na­mie­n­to o el carácter de unicidad puede ex­pre­sar­se como conjunto (set) o con términos separados por coma. En función de si los nodos en el conjunto son únicos o están ordenados, el conjunto obtiene una de­s­cri­p­ción de tipo. En la notación, los conjuntos se describen como ordered/unordered (ordenado / no ordenado) o unique/not unique (único / no único).

Tipo de conjunto Único Ordenado
Secuencia No Sí
Mu­l­ti­co­n­ju­n­to (bolsa) No No
Conjunto ordenado Sí Sí
Conjunto Sí No

Re­s­tri­c­ción

En las versiones antiguas de UML, la re­s­tri­c­ción (Co­n­s­trai­nt) se incluía entre las re­la­cio­nes. En la ac­tua­li­dad, UML la define como un elemento que puede em­pa­que­tar­se, es decir, que puede pe­r­te­ne­cer a un paquete. También establece estas re­la­cio­nes con otros elementos (con clases y atributos), si bien no modifica la notación. La re­s­tri­c­ción re­pre­se­n­ta para su poseedor una condición o un seguro. Puede influir en uno o más elementos.

El elemento pro­pie­ta­rio necesita tener acceso a la re­s­tri­c­ción. Con ello comprueba si es válida y se ha cumplido, aunque de él depende cuándo lo hace. Algunos elementos, como las ope­ra­cio­nes, verifican las re­s­tri­c­cio­nes antes de eje­cu­tar­se, en algún momento in­te­r­me­dio o después. Poseen co­n­di­cio­nes previas, de campo y po­s­te­rio­res. UML denomina Kontext a la es­pe­ci­fi­ca­ción que indica cuándo un elemento comprueba su re­s­tri­c­ción, pero no ha de co­n­fu­n­di­r­se con la es­pe­ci­fi­ca­ción en sí: la es­pe­ci­fi­ca­ción describe qué elemento delimita la re­s­tri­c­ción, qué aspecto evalúa y qué evento espera que se produzca. La es­pe­ci­fi­ca­ción exacta recibe una re­s­tri­c­ción por medio de una es­pe­ci­fi­ca­ción de valor booleana.

La notación se compone de una cadena de texto en esta forma:

<Nombre del elemento re­s­tri­n­gi­do> ::= { <Nombre de la re­s­tri­c­ción> : <Expresión booleana> }

UML no prescribe ningún lenguaje, de modo que el usuario puede escoger la re­s­tri­c­ción y el lenguaje que quiera emplear para crear un diagrama de clases: un lenguaje de pro­gra­ma­ción como Java, una lengua natural o un lenguaje que puedan leer las máquinas como XML. El Objetct Ma­na­ge­me­nt Group (OMG), que es­pe­ci­fi­ca el estándar UML, publica la es­pe­ci­fi­ca­ción del Object Co­n­s­trai­nt Language (OCL), lenguaje que define re­s­tri­c­cio­nes co­m­pa­ti­bles con UML. Su ventaja es que las integra de forma orgánica en la notación.

Algunos elementos re­s­tri­n­gi­dos se escriben en UML como texto, como un atributo de una clase. La re­s­tri­c­ción se escribe entre corchetes detrás del elemento de texto. Si el pro­pie­ta­rio es un elemento re­pre­se­n­ta­do por un símbolo, la re­s­tri­c­ción se coloca lo más cerca posible de este, de modo que quede claro que ambos elementos están re­la­cio­na­dos se­má­n­ti­ca­me­n­te. Aunque si quieres que la conexión quede aún más clara, escribe la re­s­tri­c­ción en un símbolo de nota adhesiva y conéctala a su pro­pie­ta­rio con una línea di­s­co­n­ti­nua.

Si la re­s­tri­c­ción afecta a dos elementos, se enlaza a los dos pro­pie­ta­rios con una línea di­s­co­n­ti­nua y se escribe en ella la re­s­tri­c­ción entre corchetes. Si se dibuja una punta de flecha en un extremo, se señaliza la posición del pro­pie­ta­rio dentro de un conjunto de elementos re­s­tri­n­gi­dos (co­n­s­trai­ne­dE­le­me­nts). La flecha señaliza un mo­vi­mie­n­to que va de la primera posición a la segunda. Si más de dos elementos poseen la re­s­tri­c­ción, debes utilizar el símbolo de la nota adhesiva y conectar a cada elemento con la re­s­tri­c­ción.

Las líneas co­ne­c­to­ras también se incluyen dentro de los elementos que se re­s­tri­n­gen. Si modelas más de dos líneas del mismo tipo, arrastra la línea di­s­co­n­ti­nua a través de todas las líneas que re­pre­se­n­tan a todos los elementos im­pli­ca­dos.

Es­te­reo­ti­pos

Los es­te­reo­ti­pos definen a ex­te­n­sio­nes de las me­ta­cla­ses. Siguiendo la es­pe­ci­fi­ca­ción UML, pe­r­te­ne­cen a los perfiles. Si un es­te­reo­ti­po describe pro­pie­da­des de varias me­ta­cla­ses, solo puede describir las in­s­ta­n­cias de una en una mientras se ejecuta. Entre las me­ta­cla­ses, el es­te­reo­ti­po siempre asume un papel de­te­r­mi­na­do porque nunca puede estar solo. Los es­te­reo­ti­pos se modelan siempre en relación con el cla­si­fi­ca­dor al que amplía. La metaclase se conecta con el es­te­reo­ti­po modelando una extensión (Extension).

Nota

Desde UML 2.4 la es­pe­ci­fi­ca­ción establece escribir la etiqueta de un es­te­reo­ti­po con mayúscula inicial, como <<Type>>. Otras etiquetas, p. ej., para las pro­pie­da­des en los extremos de las aso­cia­cio­nes, se escriben en mi­nú­s­cu­las.

Se di­fe­re­n­cian dos tipos de relación entre la (meta)clase y el es­te­reo­ti­po:

  • La extensión requerida (is­Re­qui­red = true) define que un es­te­reo­ti­po entra en relación con cada instancia de la metaclase en el diagrama de clases.
  • La extensión no requerida (is­Re­qui­red = false) permite conectar li­bre­me­n­te in­s­ta­n­cias de la metaclase con un es­te­reo­ti­po. También puede borrarse el es­te­reo­ti­po. Aunque durante la ejecución una instancia solo puede co­ne­c­tar­se una vez con un de­te­r­mi­na­do es­te­reo­ti­po.

Para borrar un es­te­reo­ti­po, se borra el perfil que lo define de la sección de perfiles aplicados (ap­plie­d­pro­fi­les) en el paquete superior. Op­cio­na­l­me­n­te puede borrarse la instancia a la que amplía.

UML define algunos es­te­reo­ti­pos de clase que amplían un diagrama de clases. Seis son co­n­si­de­ra­dos estándar, pero hay tres que, sin ser estándar, se usan mucho, y con los que puede im­ple­me­n­tar­se el modelo “Model-View-Co­n­tro­ller” (MVC) en UML. Son estos:

  • Entidad (<>): el es­te­reo­ti­po Entity define a una clase o a un objeto. Cada instancia re­pre­se­n­ta a una colección de datos, a menudo datos de sistema que se han de guardar durante mucho tiempo. La entidad asume el rol del modelo del patrón MVC. UML conoce este es­te­reo­ti­po, pero lo asigna por defecto a los diagramas de co­m­po­ne­n­tes. En la es­pe­ci­fi­ca­ción no se re­pre­se­n­ta a esta habitual notación. La entidad se modela como un círculo que descansa sobre una línea corta.
  • Frontera (<>): la Frontera es un es­te­reo­ti­po para una clase o un objeto. Se co­rre­s­po­n­de apro­xi­ma­da­me­n­te con el elemento View del modelo MVC. La Frontera modela los límites de tu sistema, p. ej., una interfaz de usuario. Suele re­pre­se­n­tar­se grá­fi­ca­me­n­te como un círculo de cuyo lado izquierdo sale una línea que acaba en una línea vertical.
  • Control (<>): el elemento de Control re­pre­se­n­ta el Co­n­tro­ller en MVC. Las clases o los objetos con este es­te­reo­ti­po modelan elementos que de­te­r­mi­nan el co­m­po­r­ta­mie­n­to del sistema o los flujos de control. En el estándar UML el es­te­reo­ti­po <> asume tareas similares. La instancia de control se dibuja como un círculo con una flecha encima de la línea.

Los tres es­te­reo­ti­pos pueden dibujarse como clases. En los re­c­tá­n­gu­los se escribe el nombre del es­te­reo­ti­po. Los mo­de­la­do­res aplican estas formas pri­n­ci­pa­l­me­n­te en diagramas de secuencia. Lee nuestro artículo sobre diagramas de secuencia con UML si quieres pro­fu­n­di­zar en los diagramas de entidad-frontera-control.

Los es­te­reo­ti­pos es­ta­n­da­ri­za­dos para diagramas de clases son:

  • Foco (<>)
  • Auxiliar (<>)
  • Tipo (<>)
  • Clase de im­ple­me­n­ta­ción (<>)
  • Metaclase (<>)
  • Utilidad (<>)

Foco

La clase foco define la lógica de negocio fu­n­da­me­n­tal o el flujo de control de las clases au­xi­lia­res. Estas apoyan a la clase foco que conecta a uno o más au­xi­lia­res. Define a la clase a la que ayuda de forma implícita iniciando una relación de de­pe­n­de­n­cia (ver más adelante “La relación dirigida”). Si usa clases au­xi­lia­res, las define de forma explícita. El estándar UML re­co­mie­n­da este es­te­reo­ti­po para la fase de diseño en la que se re­pre­se­n­tan los flujos de control entre los co­m­po­ne­n­tes o se determina la lógica de negocio básica.

Hecho

La lógica de negocio, también llamada lógica de apli­ca­ción, describe la lógica de un sistema dedicado a la ejecución de re­qui­si­tos de negocio reales di­fe­re­n­ciá­n­do­se, así, de la lógica que prescribe la ejecución técnica. En la pro­gra­ma­ción orientada a objetos, la lógica de negocio generó el concepto del objeto de negocio, el cual modela procesos concretos y valores reales en un sistema de in­fo­r­ma­ción.

Auxiliar

La clase auxiliar suele co­m­bi­nar­se con la clase foco y asiste por lo general a clases con una posición si­g­ni­fi­ca­ti­va para el sistema. Para ello ejecuta flujos de control en un segundo plano y define lógicas su­b­si­dia­rias. Si asiste a una clase foco, la de­fi­ni­ción es explícita; si hay una relación de de­pe­n­de­n­cia, define a la clase a la que asiste de forma implícita.

Tipo

La clase tipo es­pe­ci­fi­ca una región para objetos de negocio y es­pe­ci­fi­ca los ope­ra­do­res de estos objetos. El es­te­reo­ti­po de tipo puede ostentar atributos y aso­cia­cio­nes, pero no describe la ejecución física del objeto.

Clase apli­ca­ción

Algunos lenguajes de pro­gra­ma­ción (Java o C++) solo permiten una instancia por clase, pero con UML una instancia puede asignarse a varias clases. La clase apli­ca­ción lanza un puente entre estos dos mundos. Este es­te­reo­ti­po restringe a la clase UML, de­te­r­mi­na­n­do que, bajo él, una instancia solo puede realizar a una clase. La clase apli­ca­ción puede im­ple­me­n­tar tipos di­fe­re­n­tes. Para ejecutar con éxito un cla­si­fi­ca­dor su­bo­r­di­na­do a ella ha de cumplir con dos co­n­di­cio­nes: ha de su­mi­ni­s­trar todas las ope­ra­cio­nes del cla­si­fi­ca­dor y estas han de mostrar el co­m­po­r­ta­mie­n­to que se definió para el cla­si­fi­ca­dor. Los atributos y aso­cia­cio­nes de carácter físico, sin embargo, no han de coincidir.

Metaclase

Como las formas de clase y metaclase no se di­fe­re­n­cian, la etiqueta Metaclass señala que se trata del es­te­reo­ti­po Metaclase. Las in­s­ta­n­cias de esta clase son clases también. Con este es­te­reo­ti­po se trabaja a un nivel superior de ab­s­tra­c­ción.

Utilidad

La clase utilidad no posee in­s­ta­n­cias. Solo etiqueta a una colección de atributos y ope­ra­cio­nes, que son siempre estáticos. Los atributos estáticos no cambian cuando se les llama. Las ope­ra­cio­nes estáticas se aplican en entidades o tipos entidad. Si utilizas la clase utilidad, has de indicar ya al principio los co­rre­s­po­n­die­n­tes valores y ope­ra­cio­nes porque ya no cambiarán. Para señalizar a estos elementos, se subrayan.

Nota

UML es­pe­ci­fi­ca algunos es­te­reo­ti­pos estándar más para otros tipos de diagrama. Su ámbito de apli­ca­ción y su notación se encuentra en la es­pe­ci­fi­ca­ción UML 2.5.1, capítulo 22: Standard profile, tabla 22.1 (pág. 680).

In­te­r­fa­ces

Las in­te­r­fa­ces son cla­si­fi­ca­do­res. Su notación se parece a la de las clases, aunque no son clases sino de­cla­ra­cio­nes, es decir, declaran un conjunto de funciones y obli­ga­cio­nes abiertas e in­ter­re­la­cio­na­das de forma lógica. Para ello utilizan un contrato. Si una instancia ejecuta la interfaz, ha de cumplir con el contrato. Aquí se habla entonces de que una instancia ofrece un servicio según contrato. En su rol de de­cla­ra­ción, no configura in­s­ta­n­cias por sí misma.

En su lugar lo hace la clase, porque puede in­s­ta­n­ciar. Su instancia utiliza es­pe­ci­fi­ca­cio­nes de in­te­r­fa­ces, para lo que ha de cumplir el contrato de la interfaz. Como co­n­tra­pa­r­ti­da, utiliza la interfaz como escenario público. Un cla­si­fi­ca­dor puede im­ple­me­n­tar varias in­te­r­fa­ces y a la inversa, una interfaz puede servir a varios cla­si­fi­ca­do­res. En el diagrama de clases UML las no­ta­cio­nes de interfaz y clase son similares: un cuadrado que puede se­c­cio­nar­se en tres partes op­cio­na­l­me­n­te.

Para mostrar que una clase utiliza una interfaz se utiliza la notación In­te­r­fa­ce­Rea­li­za­tion (que conocemos por los cla­si­fi­ca­do­res de co­m­po­r­ta­mie­n­to). Esta re­pre­se­n­ta a una interfaz su­mi­ni­s­tra­da (Provided Interface), una interfaz que ejecuta di­re­c­ta­me­n­te a una instancia. Esto se aplica también a clases su­pe­rio­res como los co­m­po­ne­n­tes. Si la clase tiene un puerto público, es este el que pro­po­r­cio­na la interfaz. Para dibujar una In­te­r­fa­ce­Rea­li­za­tion se utiliza un círculo que se une al cla­si­fi­ca­dor por medio de una línea.

También están las in­te­r­fa­ces re­que­ri­das (Required In­te­r­fa­ces), que vi­sua­li­zan una relación de de­pe­n­de­n­cia (ver en “Re­la­cio­nes”). Aquí un elemento necesita a otro elemento para ejecutar todo el potencial de sus funciones propias. En este caso un cla­si­fi­ca­dor (o una de sus in­s­ta­n­cias) necesita una interfaz. La In­te­r­fa­ceU­sa­ge (uso de la interfaz) es­pe­ci­fi­ca qué exi­ge­n­cias se plantean a la interfaz. Para ello una línea une al cla­si­fi­ca­dor con un medio círculo que simboliza a la interfaz. El nombre de la interfaz se escribe en ambos re­pre­se­n­ta­n­tes debajo del círculo o el medio círculo.

Si una clase lega una interfaz a una clase inferior, se ha de modelar la conexión de la interfaz a la clase o instancia su­bo­r­di­na­da. La relación je­rá­r­qui­ca se muestra con el acento ci­r­cu­n­fle­jo (^), p. ej., ^interfaz 1.

Si empleas la notación cuadrada de las in­te­r­fa­ces, dibuja una línea entre los dos nodos. En los diagramas de clases, las líneas modelan las re­la­cio­nes entre clases, in­s­ta­n­cias o co­m­po­ne­n­tes. UML prescribe di­fe­re­n­tes líneas y flechas para funciones y re­la­cio­nes diversas. En este caso, para unir a una clase con la interfaz requerida se utiliza una flecha di­s­co­n­ti­nua con punta abierta. Añade la etiqueta <<use>> a la flecha. Para unir a una interfaz requerida con una clase se utiliza una flecha di­s­co­n­ti­nua con punta cerrada, sin rellenar. La flecha apunta siempre en dirección a la interfaz.

Tipos datos

Los tipos datos asocian a un conjunto de objetos con sus ope­ra­cio­nes uti­li­za­n­do rangos concretos de valores y agru­pá­n­do­los con sus ope­ra­cio­nes es­pe­cia­les. Los objetos pueden tener varios tipos. Sus valores abarcan desde los tipos pri­mi­ti­vos a las enu­me­ra­cio­nes de cierta longitud.

Los tipos datos son cla­si­fi­ca­do­res y solo es posible ide­n­ti­fi­car sus in­s­ta­n­cias a partir de su valor. Con los tipos datos se vi­sua­li­zan en los diagramas de clases UML tipos valor, tipos pri­mi­ti­vos y tipos es­tru­c­tu­ra­dos. Si copias una instancia tipo dato o modelas dos in­s­ta­n­cias del mismo tipo dato con el mismo valor, se co­n­si­de­ran como in­s­ta­n­cias iguales.

Si el tipo dato posee atributos, UML lo clasifica como tipo dato es­tru­c­tu­ra­do. Sus in­s­ta­n­cias solo se co­n­si­de­ran iguales si su es­tru­c­tu­ra y los valores de sus atributos son iguales.

Los tipos pri­mi­ti­vos no muestran es­tru­c­tu­ras su­bo­r­di­na­das, sino que co­n­s­ti­tu­yen valores de datos atómicos. En los diagramas de clases también en­cue­n­tran apli­ca­ción en re­s­tri­c­cio­nes. Más allá de la es­pe­ci­fi­ca­ción UML, estos tipos ostentan una semántica compleja. En UML, sin embargo, no tienen identidad, por lo cual, en caso de tener el mismo valor, no pueden di­fe­re­n­ciar­se. Algunos de los tipos pri­mi­ti­vos en UML son:

  • Booleanos (variables booleanas)
  • Íntegros
  • Un­li­mi­te­d­Na­tu­ral (cifra natural, ilimitada)
  • Real (cifra real)
  • String (secuencia de ca­ra­c­te­res)

Los tipos pri­mi­ti­vos se notan con la etiqueta <<primitive>> sobre el nombre del tipo dato.

La enu­me­ra­ción es un tipo dato. Re­pre­se­n­tan el valor de la enu­me­ra­ción con un símbolo ti­po­grá­fi­co. Como en la imagen de arriba, se trata se­n­ci­lla­me­n­te de un nombre que re­pre­se­n­ta si­m­bó­li­ca­me­n­te a un valor de­te­r­mi­na­do. Este nombre lo elige el usuario. En la lista “clases de rosa” el nombre “rosa de té” re­pre­se­n­ta al número de rosas de té que tiene una flo­ri­s­te­ría. En el diagrama de clases se dibuja a este cla­si­fi­ca­dor con el símbolo para la clase, un cuadrado. En la parte superior se incluye la etiqueta <<enu­me­ra­tion>>. Esta parte se separa del cuerpo en de­pa­r­ta­me­n­tos con líneas ho­ri­zo­n­ta­les.

Como en otras clases, la enu­me­ra­ción reserva los campos su­pe­rio­res para atributos y ope­ra­cio­nes. Si quedan vacíos, estas secciones se eliminan. En la parte inferior escribe los símbolos para la enu­me­ra­ción. En el caso de una tienda de flores, la enu­me­ra­ción se llamaría “clases de rosas” y en el cuerpo se escribe la lista: rosas de té, rosas Noisette, rosas gallica, rosas Bourbon, rosa majalis.

Re­la­cio­nes

Los diagramas de clases re­pre­se­n­tan re­la­cio­nes entre elementos de sistema con el fin de que el ob­se­r­va­dor vea qué co­m­po­ne­n­tes necesita el sistema y cómo influyen los unos en los otros. El elemento relación es una clase abstracta y re­pre­se­n­ta a la idea de una relación entre co­m­po­ne­n­tes en el sistema. De este modo no posee una notación especial, pero sus ma­ni­fe­s­ta­cio­nes muestran detalles es­pe­cí­fi­cos que las di­fe­re­n­cian.

En UML las re­la­cio­nes se entienden como líneas entre nodos, así que se modelan ge­ne­ra­l­me­n­te como líneas que pueden ofrecer va­ria­cio­nes (flechas).

La de­fi­ni­ción de las subclases de relación y las in­s­ta­n­cias ha cambiado de UML 1 a UML 2, en parte drá­s­ti­ca­me­n­te. Ori­gi­na­ria­me­n­te había re­la­cio­nes se­má­n­ti­cas, es­tru­c­tu­ra­les y dirigidas. UML cla­si­fi­ca­ba tres re­la­cio­nes (aso­cia­ción, re­s­tri­c­ción y de­pe­n­de­n­cia) entre las re­la­cio­nes se­má­n­ti­cas. En UML 2 las re­s­tri­c­cio­nes ya son elementos em­pa­que­ta­bles, las aso­cia­cio­nes definen algunas fuentes como relación es­tru­c­tu­ral y semántica. La de­pe­n­de­n­cia se clasifica en las re­la­cio­nes di­re­c­cio­na­les.

Queda esperar cómo se verá mo­di­fi­ca­do el estándar en el futuro. Se­gui­da­me­n­te ex­pli­ca­mos los diagramas de clases según UML 2.5, que establece dos subclases para la metaclase relación: la relación de dirección y la aso­cia­ción.

La aso­cia­ción

La aso­cia­ción es una relación que conecta tuplas. En in­fo­r­má­ti­ca, las tuplas son co­le­c­cio­nes de datos ordenadas. Al contrario que en los conjuntos, aquí in­te­r­vie­nen co­ne­xio­nes y se­cue­n­cias lógicas. Por eso, no sería erróneo asignar también un co­m­po­ne­n­te es­tru­c­tu­ral a la aso­cia­ción que se sume al título oficial de relación semántica. La aso­cia­ción es una conexión entre cla­si­fi­ca­do­res. Los elementos de esta relación tienen una pro­xi­mi­dad lógica o física. En función de la cantidad de miembros, la aso­cia­ción se llama binaria (dos in­s­ta­n­cias), ternaria (tres in­s­ta­n­cias) o n-aria (a partir de cuatro in­s­ta­n­cias).

Los extremos de una aso­cia­ción en los diagramas de clases UML conectan aso­cia­cio­nes con in­s­ta­n­cias. El extremo tiene un nombre que expresa el rol de la instancia en cada relación. Pensemos en un es­tu­dia­n­te que graba varias versiones de un co­r­to­me­tra­je para un seminario de cine. El rol del es­tu­dia­n­te en relación con el film sería el de “creador”. El rol de la película sería “trabajo de seminario”. Estos dos nombres se escriben bajo la línea que los une, junto al símbolo de la instancia que describen. El extremo pertenece a la aso­cia­ción misma o al cla­si­fi­ca­dor. En el caso de tratarse de más de dos extremos, el rol pertenece a la aso­cia­ción.

La flecha junto al nombre de la aso­cia­ción en el diagrama de clases de arriba indica la dirección de la relación. En el diagrama inferior el punto en la instancia “Film” señaliza que el extremo “Seminar work” pertenece a la instancia “Film student”. Como el extremo “Creator” no tiene esta marca, pertenece a la aso­cia­ción misma. La mu­l­ti­pli­ci­dad “1” muestra que existe una sola instancia “Film student”, mientras que la instancia “Film” tiene por lo menos tres ma­ni­fe­s­ta­cio­nes.

La na­ve­ga­bi­li­dad es una propiedad final (End Property) que muestra si puede accederse a una instancia en este final de la aso­cia­ción desde el otro final de la aso­cia­ción. Si la instancia B es accesible para instancia A, se dibuja una punta abierta de flecha en la línea de la aso­cia­ción en dirección a instancia B exac­ta­me­n­te en el símbolo de la instancia B. Si la instancia C no puede acceder a la instancia D, se dibuja una X en la línea en la instancia D. Si no quieres indicar na­ve­ga­bi­li­dad, no se escribe nada en especial.

Hay dos variantes de la aso­cia­ción: el enlace (link) y la agre­ga­ción.

  • El enlace es una instancia de la aso­cia­ción. Dispone de al menos dos extremos con una mu­l­ti­pli­ci­dad cada uno. Este valor ha de ser una instancia del tipo datos de la te­r­mi­na­ción. En nuestro ejemplo un es­tu­dia­n­te rueda tres películas mientras estudia. El valor para la instancia “es­tu­dia­n­te” es “1”; para la instancia “Película”, “3”. La conexión se modela como línea continua entre los pa­r­ti­ci­pa­n­tes. Al contrario que la aso­cia­ción, el enlace conecta in­s­ta­n­cias, pero no cla­si­fi­ca­do­res.
  • La agre­ga­ción es una aso­cia­ción binaria: tiene siempre dos pa­r­ti­ci­pa­n­tes. Al contrario que el enlace, la agre­ga­ción no crea ninguna relación en el mismo nivel, sino que muestra re­la­cio­nes entre una parte y el todo. La agre­ga­ción se re­pre­se­n­ta por una propiedad en el extremo de la aso­cia­ción en forma de rombo junto a la instancia que re­pre­se­n­ta el todo.

La su­b­e­s­pe­cie co­m­po­si­ción (Composite Ag­gre­ga­tion) describe la relación entre un conjunto de partes y una parte de este todo. Si el sistema elimina el todo (la co­m­po­si­ción o conjunto de partes) también destruye todas las partes, p. ej., si un árbol es el todo, una hoja es una parte, y si el árbol cae víctima de un incendio, este incendio también destruye a las hojas. Para re­pre­se­n­tar a esta relación en un diagrama de clases se dibuja una línea continua entre las in­s­ta­n­cias y se modela un rombo negro en el lado de la co­m­po­si­ción (en nuestro ejemplo, la instancia “árbol”). A este lado se le llama también extremo de la agre­ga­ción.

La segunda su­b­e­s­pe­cie de la agre­ga­ción es la agre­ga­ción co­m­pa­r­ti­da (o agre­ga­ción a secas). Esta relación asi­mé­tri­ca existe entre una propiedad (Property) y una instancia que re­pre­se­n­ta a un conjunto de in­s­ta­n­cias. La relación debería ser directa porque si no una instancia co­m­po­si­ción podría in­te­r­pre­tar­se como parte de sí misma. Esto podría pasar si se modela la relación de de­pe­n­de­n­cia de forma cíclica. La propiedad co­m­pa­r­ti­da puede pe­r­te­ne­cer a varias co­m­po­si­cio­nes. Al mismo tiempo, su instancia puede existir de forma in­de­pe­n­die­n­te a la co­m­po­si­ción. Si el sistema borra a una co­m­po­si­ción (o a todas) la instancia parte puede seguir exi­s­tie­n­do, por eso esta relación se considera débil en co­m­pa­ra­ción con la co­m­po­si­ción.

La aso­cia­ción presenta otra pa­r­ti­cu­la­ri­dad: la clase aso­cia­ción, clase y relación al mismo tiempo. Esto hace que puedan asignarse atributos a la clase aso­cia­ción en el diagrama de clases.

La relación de dirección

La relación de dirección es una clase abstracta que define re­la­cio­nes entre un origen y un destino. Los extremos pueden presentar varios elementos. Como la aso­cia­ción, la relación de dirección tampoco tiene una notación definida. Sus subclases co­n­fi­gu­ran formas es­pe­cí­fi­cas que se basan en una línea desde el origen al objetivo. Las si­guie­n­tes in­s­ta­n­cias ca­ra­c­te­ri­zan a esta relación:

  • Ge­ne­ra­li­za­ción (Ge­ne­ra­li­za­tion)
  • De­pe­n­de­n­cia (De­pe­n­de­n­cy)
  • Unión de pla­n­ti­llas (Template Binding)
  • Incluir (Include): pertenece a la notación para diagramas de caso de uso
  • Extender (Extend): pertenece a la notación para diagramas de caso de uso

La ge­ne­ra­li­za­ción es una relación binaria entre clases y va de una subclase a una su­pe­r­cla­se, es decir, de una clase concreta a una más general. La clase concreta (dalia) posee la ge­ne­ra­li­za­ción. Una flecha con punta cerrada, pero en blanco, señala un mo­vi­mie­n­to del origen al destino. El destino es la clase general (p. ej., las as­te­rá­ceas).

La subclase es­pe­ci­fi­ca la clase general. Esto también significa que la subclase comparte algunas pro­pie­da­des (internas y es­tru­c­tu­ra­les) con la su­pe­r­cla­se, no­r­ma­l­me­n­te los elementos fu­n­da­me­n­ta­les. A este estado se le conoce como herencia. Así, la clase dalia del ejemplo comparte con la su­pe­r­cla­se as­te­rá­ceas la in­flo­re­s­ce­n­cia en forma de cesto. Una cualidad es­pe­cí­fi­ca del género dalia son sus ocho pares de cro­mo­so­mas (otras plantas tienen por lo general solo dos pares de cro­mo­so­mas). Las diversas especies de dalia presentan por ende cua­li­da­des mucho más variadas.

Hecho

A nivel coloquial, las ge­ne­ra­li­za­cio­nes también se denominan como re­la­cio­nes “es un…”. Así, puede decirse “una dalia es una asterácea”.

De forma implícita, UML permite la herencia múltiple de modo que pueden modelarse varias subclases, que presentan su­pe­r­cla­ses comunes y di­fe­re­n­tes. Como al­te­r­na­ti­va, también existen varias capas de la ge­ne­ra­li­za­ción. Estas re­la­cio­nes pueden re­pre­se­n­tar­se con la notación de flecha o anidando las subclases en sus su­pe­r­cla­ses. Para ello se modelan todas las subclases pe­r­te­ne­cie­n­tes en el cuerpo de la su­pe­r­cla­se.

El set de ge­ne­ra­li­za­ción (Ge­ne­ra­li­za­tion Set) puede ayudarte a mantener la vista general del diagrama de clases. Este set es un elemento em­pa­que­ta­ble. En UML, los paquetes son co­n­te­ne­do­res para elementos me­n­cio­na­dos que tienen semejanza semántica y podrían mo­di­fi­car­se juntos. Un paquete es un espacio de nombres, pero no una clase. El set de ge­ne­ra­li­za­ción puede asociarse con un cla­si­fi­ca­dor. Este recibe el nombre de Powertype.

El Powertype se modela como cadena en la línea de la ge­ne­ra­li­za­ción de esta forma: {[is­Co­ve­ri­ng Property] , [is­Di­s­joi­nt Property]} : [Nombre del Powertype]. La propiedad is­Co­ve­ri­ng describe si el set está completo. Los valores pueden ser complete (completos) o in­co­m­ple­te (in­co­m­ple­tos). La propiedad is­Di­s­joi­nt declara si el cla­si­fi­ca­dor tiene in­s­ta­n­cias en común. Los valores pueden ser disjoint (no se solapan) o ove­r­la­p­pi­ng (se solapan).

Nota

El estándar UML 2.5 da poca in­fo­r­ma­ción sobre la herencia, pero es posible orie­n­tar­se por las versiones an­te­rio­res: UML 2 aclara que las clases es­pe­cia­li­za­das adoptan las pro­pie­da­des y re­s­tri­c­cio­nes de sus su­pe­r­cla­ses; UML 1.4 concretó que los atributos de­cla­ra­dos en una subclase so­bre­s­cri­ben los atributos heredados.

La de­pe­n­de­n­cia (De­pe­n­de­n­cy) es una relación entre el “proveedor” y el “cliente” (supplier-client-re­la­tio­n­ship). Esta relación dirigida describe que un elemento depende de otro. Puede tratase también de un conjunto de elementos. El cliente necesita un elemento diferente para una es­pe­ci­fi­ca­ción mayor o para ejecutar su tarea. Sin el proveedor el cliente carece de un co­m­po­ne­n­te es­tru­c­tu­ral o semántico. Por eso es muy probable que los cambios en el proveedor tengan un efecto en el cliente. Según UML 2.5 la semántica siempre influye en el elemento me­n­cio­na­do, pero no en sus in­s­ta­n­cias. Las de­pe­n­de­n­cias no solo de­sem­pe­ñan un rol en el diagrama de clases UML, sino también en otros diagramas de es­tru­c­tu­ra como el de co­m­po­ne­n­tes o el de di­s­po­si­ción.

La de­pe­n­de­n­cia tiene tres su­b­ca­te­go­rías:

  • Ab­s­tra­c­ción (Ab­s­tra­c­tion)
  • Di­s­po­si­ción (De­plo­y­me­nt)
  • Uso (Usage)

La ab­s­tra­c­ción conecta elementos de capas di­fe­re­n­tes. También puede mostrar pe­r­s­pe­c­ti­vas di­fe­re­n­tes. Los elementos me­n­cio­na­dos en esta relación de de­pe­n­de­n­cia re­pre­se­n­tan al mismo concepto. Según el estándar UML el elemento más es­pe­cí­fi­co es el cliente, que depende del proveedor, el elemento más abstracto. El final de la flecha debería estar en la subclase y la punta en la su­pe­r­cla­se. Pero UML autoriza también una notación inversa. Si es más co­n­ve­nie­n­te que el elemento abstracto depende de su subclase la punta de la flecha se dibuja en el elemento más es­pe­cí­fi­co.

La ab­s­tra­c­ción tiene dos subclases: la rea­li­za­ción (Rea­li­za­tion) y la ma­ni­fe­s­ta­ción (Ma­ni­fe­s­ta­tion).

La rea­li­za­ción se ha me­n­cio­na­do ya en relación con las in­te­r­fa­ces. La rea­li­za­ción de in­te­r­fa­ces (In­te­r­fa­ce­Rea­li­za­tion) es una es­pe­ci­fi­ca­ción de la rea­li­za­ción y describe una relación entre el cla­si­fi­ca­dor y la interfaz. El cla­si­fi­ca­dor utiliza la interfaz para ofrecer un servicio a su cliente. La interfaz ejecuta este servicio, pero para ello el cla­si­fi­ca­dor ha de cumplir el contrato que fija la interfaz. La notación para in­te­r­fa­ces di­s­pue­s­tas y re­que­ri­das se encuentra en el apartado “In­te­r­fa­ces”.

La su­b­s­ti­tu­ción (Su­b­s­ti­tu­tion) es otra relación que es­pe­ci­fi­ca la rea­li­za­ción. Está compuesta por un cla­si­fi­ca­dor su­b­s­ti­tu­to y un contrato su­b­s­ti­tu­to. El cla­si­fi­ca­dor su­b­s­ti­tu­to satisface el contrato del otro cla­si­fi­ca­dor. Durante la ejecución, las in­s­ta­n­cias del cla­si­fi­ca­dor su­b­s­ti­tu­to su­b­s­ti­tu­yen a in­s­ta­n­cias po­te­n­cia­les del contrato su­b­s­ti­tu­to. A di­fe­re­n­cia de la es­pe­cia­li­za­ción, no hay semejanza es­tru­c­tu­ral entre elementos de la su­b­s­ti­tu­ción. En el diagrama de clases, la su­b­s­ti­tu­ción se escribe como una unión de de­pe­n­de­n­cia (línea di­s­co­n­ti­nua con punta abierta) añadiendo la palabra clave <<su­b­s­ti­tu­te>> sobre la línea.

La ma­ni­fe­s­ta­ción, elemento del diagrama de de­s­plie­gue en el que no nos ex­te­n­de­re­mos, describe a una relación entre un artefacto y uno o más elementos de modelado. UML define a los ar­te­fa­c­tos como cla­si­fi­ca­do­res. Si­m­bo­li­zan in­s­ta­n­cias concretas y físicas como carpetas de archivo. La ma­ni­fe­s­ta­ción indica que un artefacto ejecuta a un elemento vinculado, pero, a la inversa, puede si­m­bo­li­zar que hay elementos im­pli­ca­dos en la creación de un artefacto. Tienen la misma notación que las su­b­s­ti­tu­cio­nes y se escribe como <<manifest>>.

La ab­s­tra­c­ción también define a algunos es­te­reo­ti­pos. Estos se incluyen en los perfiles de UML, que se definen cada vez que una metaclase que ya existe se ha de ampliar para un proyecto. La clase es­te­reo­ti­po se utiliza siempre en co­m­bi­na­ción con la metaclase, porque un perfil solo puede modificar lo que ya existe o añadir te­r­mi­no­lo­gía. Desde el estándar UML 2.4.1, los es­te­reo­ti­pos se escriben con mayúscula inicial. Los es­te­reo­ti­pos estándar para una ab­s­tra­c­ción son:

  • Derivar (<<Derive>>): un elemento se deriva de otro elemento diferente que ge­ne­ra­l­me­n­te es del mismo tipo.
  • Refinar (<<Refine>>): un elemento pro­po­r­cio­na datos de­ta­lla­dos de una clase que también existe en otro elemento. Estos dos elementos se en­cue­n­tran en capas de ab­s­tra­c­ción di­fe­re­n­tes. Por ejemplo, un modelo en un nivel ejecutivo podría refinar su clase “empleado” en relación con la clase “empleado” en la capa de diseño.
  • Rastrear (<<Trace>>): di­fe­re­n­tes modelos ma­ni­fie­s­tan aspectos di­fe­re­n­tes de un sistema. Con métodos de rastreo (mapping o tracing) se localizan elementos que re­pre­se­n­tan el mismo concepto en modelos di­fe­re­n­tes, lo que permite entender los cambios en los elementos o en las in­s­tru­c­cio­nes.
Nota

Con ayuda de estos es­te­reo­ti­pos de ab­s­tra­c­ción puede ra­s­trear­se la relación entre cliente y proveedor. Este proceso puede tener lugar de forma uni­la­te­ral o bilateral y formal o in­fo­r­ma­l­me­n­te. El cliente y el proveedor se han de encontrar en diagramas di­fe­re­n­tes, p. ej., en un diagrama de clases y en uno de casos de uso.

El de­s­plie­gue muestra la relación entre un artefacto y su objetivo operativo. En un diagrama UML la línea de de­s­plie­gue parte de uno o más ar­te­fa­c­tos hacia el objetivo (De­plo­y­me­nt Target) y se ide­n­ti­fi­ca con la etiqueta <<deploy>>. Esta de­pe­n­de­n­cia también puede aplicarse en el nivel de las in­s­ta­n­cias. Op­cio­na­l­me­n­te, puede modelarse el artefacto en el cuerpo del objetivo operativo bien dibujando el artefacto como símbolo o enu­me­ra­n­do los ar­te­fa­c­tos de­s­ple­ga­dos. Esta de­pe­n­de­n­cia es una parte de la notación para diagramas de de­s­plie­gue.

El uso describe una relación en la cual el cliente necesita al proveedor para cumplir con todas sus tareas o ejecutar ope­ra­cio­nes. Haciendo esto, el uso pone en práctica la de­pe­n­de­n­cia general como instancia. Esta de­pe­n­de­n­cia ma­ni­fie­s­ta algunas re­la­cio­nes concretas:

  • Usar (<<use>>): un elemento utiliza a otro elemento, aunque no está definido del todo cuáles son los pa­r­ti­ci­pa­n­tes de esta relación ni cuál es su utilidad.
  • Crear (<<create>>): un cla­si­fi­ca­dor cliente o uno de sus elementos de co­m­po­r­ta­mie­n­to o es­tru­c­tu­ra crea una o más in­s­ta­n­cias del cla­si­fi­ca­dor proveedor.
  • Llamar (<<call>>): una operación llama a otra operación. El objetivo puede ser cualquier operación en el entorno de la operación fuente, incluso de cla­si­fi­ca­do­res su­pe­rio­res.
  • Enviar (<<send>>): una operación es la fuente, esto es, el cliente. Su objetivo es una señal. La de­pe­n­de­n­cia modela así que la operación envía la señal objetivo.
  • Interfaz requerida (Required Interface ----C): la interfaz requerida no existe, al contrario que la de­s­ple­ga­da, en el cla­si­fi­ca­dor. Determina los servicios que necesita un cla­si­fi­ca­dor para ejecutar sus funciones para sus clientes. La de­pe­n­de­n­cia se da entre los cla­si­fi­ca­do­res y las in­te­r­fa­ces (ver apartado “In­te­r­fa­ces”).

Vincular pla­n­ti­llas (Template binding) es la última relación dirigida que encuentra apli­ca­ción en los diagramas de clases. Al crear un diagrama de clases, puede resultar útil elaborar pla­n­ti­llas para las clases. Estas pla­n­ti­llas constan de pa­rá­me­tros, que se incluyen en la firma de la plantilla. La firma es­pe­ci­fi­ca el conjunto ordenado de pa­rá­me­tros dentro de una plantilla. Si modelas clases que no han de ostentar pro­pie­da­des in­di­vi­dua­les, el trabajo es más eficiente si se utilizan pla­n­ti­llas, pero si una clase ha de contener pa­rá­me­tros fijos, se utiliza el template binding. La relación se da entre un elemento conectado y la firma en una plantilla objetivo.

El elemento conectado es te­m­pla­tea­ble, es decir, que puede co­n­ve­r­ti­r­se en una plantilla o co­ne­c­tar­se a otras pla­n­ti­llas. El elemento está conectado porque consta de una conexión a una plantilla. Esta unión describe la es­tru­c­tu­ra del elemento al sustituir pa­rá­me­tros formales de la plantilla por pa­rá­me­tros de calidad.

Resumen

El diagrama de clases es uno de los diagramas UML más populares porque re­pre­se­n­ta es­tru­c­tu­ras de sistemas tanto de forma detallada como general. Como diagrama de es­tru­c­tu­ras, muestra un sistema en estado estático de modo que el ob­se­r­va­dor obtiene una pe­r­s­pe­c­ti­va general de los elementos im­pre­s­ci­n­di­bles de un sistema, pero también vi­sua­li­zan las re­la­cio­nes entre los co­m­po­ne­n­tes de esta ar­qui­te­c­tu­ra. Con un diagrama de clases UML se modelan desde objetos reales a clases ab­s­tra­c­tas con perfiles am­plia­bles en cualquier lenguaje de pro­gra­ma­ción. Con ellos se facilita la co­mu­ni­ca­ción entre de­pa­r­ta­me­n­tos es­pe­cia­li­za­dos en la rea­li­za­ción de un proyecto.

Ir al menú principal