Saltar al contenido

¿Cómo representar la clase anidada de C ++ en UML?

Solución:

La clase anidada en UML (para cualquier idioma) se puede representar como:

ingrese la descripción de la imagen aquí

Aquí

  1. La clase Inner1 está anidada dentro de la clase externa Outer 1
  2. Clases Las clases Inner2, Inner3, Inner4 están anidadas dentro de Outer2

Referencia tomada de aquí

Pensé que la especificación se alejaba de la notación de cruz y círculo. Entonces, di algunas vueltas en las especificaciones y no pude encontrarlo en 2.0. Tengo que concluir que la especificación 2.0 ya no lo admite. Aunque en realidad está especificado en v1.4, miré a través de la especificación 2.4.1 y no se ve por ningún lado (de hecho, la palabra “ancla” devuelve 0 resultados en una búsqueda de todo el documento). Hice otra mirada a mi alrededor, y esto es lo que puedo reconstruir.

Primero, siempre había entendido que las clases anidadas eran un medio para implementar la composición. Además, UML intenta ser independiente de la implementación y las clases anidadas no lo son. (Puede crear composición de otras formas, y no todos los lenguajes OO admiten clases anidadas). Ahora, la explicación de 1.4 incluye esto:

Si la Clase B está unida a la Clase A mediante una línea de “ancla” con el símbolo de “ancla” en la Clase A, entonces la Clase B se declara dentro del Espacio de nombres de la Clase A. Es decir, la relación entre la Clase A y la Clase B es el espacio de nombres -ownedElement asociación.

Está bien. Ahora UML 2.0 dice esto:

El paquete Kernel representa los conceptos básicos de modelado de UML, incluidas clases, asociaciones y paquetes.

Aquí hay un diagrama del paquete Kernel:

ingrese la descripción de la imagen aquí

Eso es bastante abstruso, pero eche un vistazo a la clase abstracta NamedElement en la parte superior izquierda. (Una clase “NamedElement” es un elemento que tiene un nombre). Observe que el espacio de nombres se deriva de él. Ahora, observe a la derecha, directamente a la derecha de la parte superior de la clase Espacio de nombres, hay otra clase NamedElement. Una de las asociaciones tiene la propiedad {subsets ownElement} y un rombo de composición en el extremo del espacio de nombres. En el extremo del espacio de nombres, está la propiedad {subsets owner}.

Esto significa que NamedElement, cuando está en asociación de composición con el espacio de nombres, es un subconjunto del espacio de nombres. En otras palabras, la relación entre el espacio de nombres y el elemento Named es la asociación del elemento propiedad del espacio de nombres descrita en la especificación 1.4. Por lo tanto, la relación de composición, cuando se adorna con el espacio de nombres y las propiedades ownElement, representa una clase anidada (o interna, o interna, o como lo llame su lenguaje de codificación favorito).

Entonces, voy a decir que esta es la forma 2.0 aceptada de mostrar clases anidadas si está utilizando notación de composición. Como esto:

ingrese la descripción de la imagen aquí

Ahora, otra forma es pegar la clase anidada dentro de la clase contenedora. Los ejemplos de notación en la especificación no muestran este AFAICS, pero lo muestran con otros NamedElements (paquetes, componentes, etc.), así que no veo por qué no puede.

Sin embargo, no veo que la notación de ancla sea actual. El sitio favorito de xmojmr (y también un buen sitio), www.uml-diagrams.org, tiene esto que decir al respecto:

La especificación UML 1.4.2 ahora obsoleta definió la clase anidada como una clase declarada dentro de otra clase y que pertenece al espacio de nombres de la clase declarante. La relación entre esas clases se denominó “asociación de elementos propiedad del espacio de nombres

El clasificador anidado, por ejemplo, clase anidada, interfaz anidada o caso de uso anidado, se puede utilizar como cualquier otro clasificador, pero solo dentro de la clase o interfaz que lo contiene.

Según UML 1.4.2, una clase declarante (anidada) y una clase anidada podrían mostrarse conectadas por una línea, con un icono de “ancla” en el extremo conectado a la clase declarante. Un icono de ancla es una cruz dentro de un círculo.

Las especificaciones de UML 2.x, incluido el reciente UML 2.4.1, describen el anidamiento de clasificadores dentro de clases estructuradas sin proporcionar una notación explícita para el anidamiento. Tenga en cuenta que la notación “ancla” 1.4 de UML todavía se usa en un ejemplo en UML 2.4.x para paquetes como una “notación de membresía alternativa” y sin proporcionar ningún otro detalle o explicación.

No pude encontrar ese diagrama de “un ejemplo”, así que tal vez todavía esté disponible. Pero al menos, la notación parece estar desaprobada. Yo usaría las propiedades, crearía un <<nested>> estereotipo, o poner la clase anidada dentro de la clase propietaria.

Las clases anidadas pueden mostrarse dentro de un compartimento de la clase exterior.

clases-anidadas

La sección 9.2.4.1 de la especificación de la versión 2.5.1 de UML dice:

Si un clasificador tiene miembros propios que son clasificadores, una herramienta conforme puede proporcionar la opción de mostrar los clasificadores propios y las relaciones entre ellos, anidados en forma de diagrama dentro de un compartimento separado del rectángulo del clasificador propietario. (…) Por ejemplo, un compartimento que muestre el contenido de la propiedad nestedClassifier para una clase (véase 11.4.2) se denominará “clasificadores anidados”.

Alternativamente, las clases anidadas se pueden mostrar usando la notación “círculo más”:

cpn

La sección 7.4.4.1 de la especificación UML 2.5.1 dice:

Las herramientas de conformidad pueden permitir opcionalmente que la notación “círculo más” definida en la subcláusula 12.2.4 muestre la pertenencia al paquete para que también se utilice para mostrar la pertenencia a otros tipos de espacios de nombres (por ejemplo, para mostrar clasificadores anidados).

(He copiado la imagen de la respuesta publicada por @stamhaney)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *