Diagramas de clases de UML: Instrucciones
En Visual Studio Ultimate, puede utilizar un diagrama de clases de UML para describir los tipos de datos y sus relaciones con independencia de su implementación. El diagrama se utiliza para que la atención se centre en los aspectos lógicos de las clases en lugar de en su implementación.
Para crear un diagrama de clases de UML, en el menú Arquitectura, elija Nuevo diagrama.
Nota
En este tema se analizan los diagramas de clases de UML.Existe otro tipo de diagrama de clases, que se crea y utiliza para visualizar el código del programa.Vea el tema sobre cómo diseñar y ver clases y tipos.
En este tema
Usar diagramas de clases de UML
Pasos básicos para dibujar diagramas de clases
Usar clases, interfaces y enumeraciones
Atributos y operaciones
Dibujar y utilizar asociaciones
Herencia
Tipos de plantilla
Definir los espacios de nombres con paquetes
Generar código a partir de diagramas de clases de UML
Usar diagramas de clases de UML
Los diagramas de clases de UML pueden utilizarse para una gran variedad de propósitos:
Para proporcionar una descripción de los tipos que se utilizan en un sistema y se pasan entre sus componentes que no tenga nada que ver con su implementación.
Por ejemplo, en el código .NET, el tipo Pedido de menú podría implementarse en la capa del negocio; en XML, en las interfaces entre los componentes; en SQL, en la base de datos, y en HTML, en la interfaz de usuario. Aunque estas implementaciones tengan un nivel de detalle diferente, la relación entre el tipo Pedido de menú y otros tipos, como Menú y Pago, es siempre la misma. El diagrama de clases de UML permite analizar estas relaciones con independencia de las implementaciones.
Para clarificar el glosario de términos que se utiliza en la comunicación entre la aplicación y los usuarios y en las descripciones de las necesidades de los usuarios. Vea Crear modelos de los requisitos de los usuarios.
Por ejemplo, piense en los casos de usuario, los casos de uso y otras descripciones de los requisitos de la aplicación de un restaurante. En este tipo de descripción, encontrará términos como Menú, Pedido, Comida, Precio, Pago, etc. Puede dibujar un diagrama de clases de UML en el que se definan las relaciones entre estos términos. De este modo, se reducirá el riesgo de inconsistencias en las descripciones de los requisitos, así como en la interfaz de usuario y los documentos de ayuda.
Relación con otros diagramas
Un diagrama de clases de UML normalmente se crea junto con otros diagramas de modelado para proporcionar descripciones de los tipos que utilizan. En cada caso, la representación física de los tipos no está implícita en ninguno de los diagramas.
Si dibujó: |
Utilice un diagrama de clases de UML para describir: |
---|---|
Diagrama de actividades |
Tipos de datos que pasan por un nodo de objeto. Tipos de terminales de entrada (Input Pin) y de salida (Output Pin) de nodos de parámetros de actividad. |
Diagrama de secuencia |
Tipos de parámetros y valores devueltos de mensajes. Tipos de líneas de vida. La clase de una línea de vida debe incluir las operaciones de todos los mensajes que puede recibir. |
Diagrama de componentes |
Interfaces de componentes, con un listado de sus operaciones. |
Diagrama de casos de uso |
Tipos mencionados en las descripciones de los objetivos y los pasos de un caso de uso. |
Pasos básicos para dibujar diagramas de clases
Para obtener más información de referencia sobre los elementos de los diagramas de clases de UML, vea Diagramas de clases de UML: Referencia.
Nota
En Editar modelos y diagramas UML se describen en detalle los pasos para crear diagramas de modelado.
Para crear un diagrama de clases de UML
En el menú Arquitectura, elija Nuevo diagrama.
En Plantillas, elija Diagrama de clases UML.
Especifique un nombre para el diagrama.
En Agregar a proyecto de modelado, seleccione un proyecto de modelado existente de la solución o Crear un nuevo proyecto de modelado y, a continuación, elija Aceptar.
En el cuadro de herramientas Diagrama de clases UML aparece un nuevo diagrama de clases. El cuadro de herramientas contiene las relaciones y elementos necesarios.
Para dibujar un diagrama de clases de UML
Para crear un tipo, elija la herramienta Clase, Interfaz o Enumeración del cuadro de herramientas y, a continuación, haga clic en un espacio en blanco del diagrama. (Si no puede ver el cuadro de herramientas, presione CTRL+ALT+X).
También puede crear tipos basados en los tipos del código. Puede arrastrar tipos del Explorador de soluciones, el Explorador de arquitectura o los gráficos de dependencia hasta el diagrama. Vea Crear diagramas de clases UML a partir del código.
Para agregar atributos u operaciones a los tipos o agregar literales a una enumeración, elija el título Atributos, Operaciones o Literales del tipo y presione ENTRAR.
Puede escribir una firma, como por ejemplo f(x:Boolean):Integer. Consulte Atributos y operaciones.
Para agregar rápidamente varios elementos, presione ENTRAR dos veces al final de cada elemento. Puede utilizar las teclas de dirección para subir y bajar la lista.
Para expandir o contraer un tipo, elija el icono de botón de contenido adicional situado en la parte superior izquierda. También puede expandir y contraer la sección Atributos y Operaciones de una clase o interfaz.
Para dibujar vínculos de asociación, herencia o dependencia entre los tipos, haga clic en la herramienta adecuada, a continuación, en el tipo de origen y, por último, en el tipo de destino.
Para crear tipos en un paquete, cree un paquete mediante la herramienta Paquete y, a continuación, cree los tipos y paquetes nuevos en el paquete. También puede copiarlos con el comando Copiar y pegarlos después en un paquete.
Cada diagrama es una vista de un modelo que comparten otros diagramas del mismo proyecto. Para ver una vista de árbol del modelo completo, elija Ver, Otras ventanas, Explorador de modelos UML.
Usar clases, interfaces y enumeraciones
Hay tres tipos estándar de clasificadores disponibles en el cuadro de herramientas. En este documento, se les denomina tipos.
Utilice las clases (1) para representar datos o tipos de objetos para la mayor parte de los propósitos.
Utilice las interfaces (2) en contextos en los que es necesario diferenciar entre interfaces puras y clases concretas que tienen implementaciones internas. Esta diferencia resulta útil cuando el propósito del diagrama es describir una implementación de software. Resulta menos útil, sin embargo, cuando se modelan datos pasivos o cuando se definen contextos que se utilizan para describir los requisitos del usuario.
Utilice una enumeración (3) para representar un tipo que tiene un número limitado de valores literales, por ejemplo Stop y Go.
Agregue los valores literales a la enumeración. Asigne a cada uno un nombre diferente.
Si lo desea, también puede proporcionar un valor numérico para cada valor literal. Abra el menú contextual del literal de la enumeración, elija Propiedades y, a continuación, escriba un número en el campo Valor de la ventana Propiedades.
Asigne un nombre único a cada tipo.
Obtener tipos de otros diagramas
Puede hacer que los tipos de otro diagrama aparezcan en su diagrama de clases de UML.
Otro tipo de diagrama |
Cómo obtener tipos del otro diagrama |
---|---|
Diagrama de clases de UML |
Puede hacer que una clase aparezca en varios diagramas de clases de UML. Cuando haya creado una clase en un diagrama, arrastre la clase del Explorador de modelos UML al otro diagrama. Esto resulta útil si desea que cada diagrama se concentre en un grupo de relaciones determinado. Por ejemplo, puede mostrar las asociaciones entre un Pedido de menú y el Menú del restaurante en un diagrama y las asociaciones entre Pedido de menú y Pago en otro diagrama. |
Diagrama de componentes |
Si ha definido interfaces en los componentes de un diagrama de componentes, puede arrastrar una interfaz del Explorador de modelos UML al diagrama de clases. En el diagrama de clases, puede definir los métodos que la interfaz incluye. |
Diagrama de secuencia de UML |
Puede crear clases e interfaces a partir de las líneas de vida de un diagrama de secuencia y, a continuación, arrastrar la clase del Explorador de modelos UML a un diagrama de clases de UML. Cada línea de vida de un diagrama de secuencia representa una instancia de un objeto, componente o actor. Para crear una clase a partir de una línea de vida, abra el menú contextual de la línea de vida y elija Crear clase o Crear interfaz. Vea Diagramas de secuencia de UML: Instrucciones. |
Código de programa |
Puede representar tipos del código en el modelo. Arrastre clases, interfaces o enumeraciones del Explorador de arquitectura o de los gráficos de dependencias hasta un diagrama de clases UML. Los tipos que arrastra aparecerán en el diagrama. También se agregarán tipos dependientes al modelo. Cuando un tipo UML se ha creado de esta manera, puede hacer doble clic en este para abrir el código fuente. Vea Crear diagramas de clases UML a partir del código. Nota El código y el modelo no se mantienen sincronizados.Puede actualizar el diagrama para discutir las propuestas de cambio sin afectar al código.Los cambios siguientes en el código no afectarán automáticamente al diagrama a menos que arrastre de nuevo los tipos al diagrama. |
Atributos y operaciones
Un atributo (4) es un valor con nombre que todas las instancias de un tipo pueden tener. Cuando se obtiene acceso a un atributo, no se modifica el estado de la instancia.
Una operación (5) es un método o función que las instancias del tipo pueden realizar. Puede devolver un valor. Si su propiedad isQuery es true, no se puede modificar el estado de la instancia.
Para agregar un atributo u operación a un tipo, abra el menú contextual del tipo, elija Agregar y, a continuación, elija Atributo u Operación.
Para ver sus propiedades, abra el menú contextual del atributo u operación, y elija Propiedades. Las propiedades aparecen en la ventana Propiedades.
Para ver las propiedades de los parámetros de una operación, en la propiedad Parameters, elija [...]. Aparece un nuevo cuadro de diálogo Propiedades.
Para obtener información detallada sobre todas las propiedades que puede establecer, consulte:
Tipos de atributos y operaciones
Los tipos de atributo u operación y los tipos de parámetro pueden ser uno de los que se detallan a continuación:
(ninguno): un tipo puede dejarse sin especificar en la firma omitiendo el signo de dos puntos anterior (:).
Uno de los tipos primitivos estándar: Booleano, Entero, Cadena.
Un tipo que esté definido en el modelo.
Un valor parametrizado de un tipo de plantilla, con el formato Plantilla<Parámetro>. Vea Tipos de plantilla.
También puede escribir el nombre de un tipo que aún no haya definido en el modelo. El nombre aparecerá en Tipos sin especificar en el Explorador de modelos UML.
Nota
Si posteriormente define una clase o interfaz con ese nombre en el modelo, los atributos y operaciones anteriores todavía harán referencia al elemento en Tipos sin especificar.Si desea cambiarlos para que hagan referencia a la nueva clase, deberá visitar cada atributo u operación y restablecer el tipo, seleccionando la nueva clase en el menú desplegable.
Tipos múltiples
Puede establecer la multiplicidad de cualquier tipo de parámetro, atributo u operación.
Los valores permitidos son los siguientes:
Multiplicidad |
El atributo, parámetro o valor devuelto contiene: |
---|---|
[1] |
Un valor del tipo especificado. Este es el valor predeterminado. |
[0..1] |
Null o un valor del tipo especificado. |
[*] |
Una colección con un número de instancias del tipo especificado. |
[1..*] |
Una colección de al menos una instancia del tipo especificado. |
[n..m] |
Una colección de entre n y m instancias del tipo especificado. |
Si la multiplicidad es mayor que 1, también puede establecer estas propiedades:
IsOrdered: si es true, la colección tiene un orden definido.
IsUnique: si es true, no hay ningún valor duplicado en la colección.
Visibilidad
La visibilidad indica si se puede obtener acceso al atributo u operación fuera de la definición de clase. Los valores permitidos son los siguientes:
Nombre |
Forma abreviada |
Significado |
---|---|---|
Public |
+ |
Accesible desde todos los demás tipos. |
Private |
- |
Solamente se puede obtener acceso a la definición interna de este tipo. |
Package |
~ |
Solamente se puede obtener acceso dentro del paquete que contiene este tipo y en los paquetes que lo importan explícitamente. Vea Definir espacios de nombres y paquetes. |
Protected |
# |
Solamente se puede obtener acceso a este tipo y sus tipos heredados. Vea Herencia. |
Establecer la firma de un atributo u operación
La firma de un atributo u operación es una colección de propiedades entre las que se incluyen la visibilidad, el nombre, los parámetros (en las operaciones) y el tipo.
Puede escribir directamente una firma en el diagrama. Haga clic en el atributo u operación para seleccionarlo y, a continuación, vuelva a hacer clic.
Escriba la firma con el formato:
visibility attribute-name : Type
O bien
visibility operation-name (parameter1 : Type1, ...) : Type
Por ejemplo:
+ AddItem (item : MenuItem, quantity : Integer) : Boolean
Utilice la forma abreviada de visibilidad. El valor predeterminado es + (public).
Los tipos pueden ser tipos definidos en el modelo, tipos estándar, como Entero o Cadena, o el nombre de un nuevo tipo que no se haya definido todavía.
Nota
Si escribe un nombre sin tipo en una lista de parámetros, especificará el nombre del parámetro, en lugar de su tipo.En este ejemplo, MenuItem e Integer resultan ser los nombres de dos parámetros con tipos no especificados:
AddItem(MenuItem, Integer) /* parameter names, not types! */
Para establecer la multiplicidad de un tipo en una firma, escriba la multiplicidad entre corchetes tras el nombre de tipo, por ejemplo:
+ AddItems (items : MenuItem [1..*])
+ MenuContent : MenuItem [*]
Si el atributo u operación es estático, su nombre aparecerá subrayado en la firma. Si es abstracto, el nombre aparecerá en cursiva.
Sin embargo, las propiedades Is Static e Is Abstract solo pueden establecerse en la ventana Propiedades.
Firma completa
Al modificar la firma de un atributo u operación, algunas propiedades adicionales pueden aparecer al final de la línea y después de cada parámetro. Aparecen entre llaves {...}. Puede editar o agregar estas propiedades. Por ejemplo:
+ AddItems (items: MenuItem [1..*] {unique, ordered})
+ GetItems (filter: String) : MenuItem [*] {ordered, query}
Estas propiedades son las siguientes:
En la firma |
Propiedad |
Significado |
---|---|---|
unique |
Is Unique |
No hay valores duplicados en la colección. Se aplica a tipos cuya multiplicidad es mayor que 1. |
ordered |
Is Ordered |
La colección es una secuencia. Si es false, no está definido el primer elemento. Se aplica a tipos cuya multiplicidad es mayor que 1. |
query |
Is Query |
La operación no cambia el estado de la instancia. Solo se aplica a las operaciones. |
/ |
Is Derived |
El atributo se calcula a partir de los valores de otros atributos o asociaciones. "/" precede al nombre de un atributo. Por ejemplo:
|
Normalmente, la firma completa solamente aparece en el diagrama mientras se está editando. Al finalizar la edición, las propiedades adicionales quedan ocultas. Si desea ver la firma completa en todo momento, abra el menú contextual del tipo y, a continuación, elija Mostrar signatura completa.
Dibujar y utilizar asociaciones
Utilice una asociación para representar cualquier tipo de vinculación entre dos elementos, con independencia del modo en que esta vinculación se implemente en el software. Puede utilizar, por ejemplo, una asociación para representar un puntero en C#, una relación de una base de datos o una referencia cruzada que asocie una parte de un archivo XML con otra. Puede representar una asociación entre objetos en el mundo real, como la tierra y el sol. La asociación no indica cómo se representa el vínculo, solo que existe la información.
Propiedades de una asociación
Después de crear una asociación, establezca sus propiedades. Abra el menú contextual de la asociación y, a continuación, elija Propiedades.
Además de las propiedades de toda la asociación, cada rol, es decir, cada extremo de la asociación, tiene algunas propiedades específicas. Para verlas, expanda las propiedades First Role y Second Role.
Algunas propiedades de cada uno de los roles pueden verse directamente en el diagrama. Son las siguientes:
El nombre del rol. Aparece en el extremo correspondiente de la asociación del diagrama. Se puede especificar en el diagrama o en la ventana Propiedades.
Multiplicity, cuyo valor predeterminado es 1. También aparece en el diagrama situado junto al extremo correspondiente de la asociación.
Aggregation. Aparece en un extremo del conector y tiene forma de diamante. Puede utilizarse para indicar que las instancias del rol que se están agregando poseen o contienen instancias del otro rol.
Is Navigable. Si es true solamente en uno de los roles, aparece una flecha en la dirección navegable. Puede utilizarse para indicar la navegabilidad de vínculos y relaciones de base de datos en el software.
Para obtener todos los detalles sobre estas y otras propiedades, vea Propiedades de las asociaciones de diagramas de clases de UML.
Navegabilidad
Cuando se dibuja una asociación, tiene una flecha en un extremo, lo que significa que la asociación es navegable en esa dirección. Esto resulta útil si el diagrama de clases representa las clases de software y las asociaciones representan punteros o referencias. Sin embargo, cuando se usa un diagrama de clases para representar entidades y relaciones o conceptos de negocio, es menos pertinente representar la navegabilidad. En este caso, podría ser preferible dibujar las asociaciones sin flechas. Puede hacerlo si establece la propiedad Is Navigable en ambos extremos de la asociación en true. Para que sea más fácil, puede descargar el ejemplo de código de modelado de dominio UML.
Atributos y asociaciones
Una asociación es una manera gráfica de mostrar un atributo. Por ejemplo, en lugar de crear una clase Restaurante con un atributo de tipo Menú, puede dibujar una asociación entre Restaurante y Menú.
Cada nombre de atributo se transforma en un nombre de rol. Aparece en el extremo opuesto al tipo propietario de la asociación. Observe, por ejemplo, myMenu en la ilustración.
Por lo general, resulta más conveniente utilizar los atributos solo en aquellos tipos que no se van a dibujar en el diagrama, como los tipos primitivos.
Herencia
Utilice la herramienta Herencia para crear las relaciones siguientes:
Una relación de generalización entre un tipo especializado y un tipo general.
O bien
Una relación de realización entre una clase y una interfaz que implementa.
No se pueden crear bucles en las relaciones de herencia.
Generalización
La generalización significa que el tipo que se especializa o el tipo derivado heredan los atributos, las operaciones y las asociaciones del tipo general o tipo base.
El tipo general aparece en el extremo de la relación con la punta de flecha.
Las operaciones y atributos heredados no suelen mostrarse en los tipos especializados. Sin embargo, pueden agregarse operaciones heredadas a la lista de operaciones del tipo especializado. Esto resulta útil si desea invalidar algunas de las propiedades de una operación en el tipo especializado o si desea indicar que el código que se va a implementar debería hacerlo.
Para invalidar la definición de una operación en un tipo especializado
Haga clic en la relación de generalización.
Aparecerá resaltada junto a una etiqueta de acción.
Haga clic en la etiqueta de acción y, a continuación, en Invalidar operaciones.
Aparece el cuadro de diálogo Invalidar operaciones.
Seleccione las operaciones que desea que aparezcan en el tipo especializado y, a continuación, haga clic en Aceptar.
Las operaciones que seleccionó aparecen ahora en el tipo especializado.
Realización
La realización significa que una clase implementa los atributos y operaciones especificados por la interfaz. La interfaz se encuentra en el extremo del conector que tiene la flecha.
Al crear un conector de realización, las operaciones de la interfaz se replican automáticamente en la clase que se realiza. Si se agregan nuevas operaciones a una interfaz, estas operaciones se replicarán en las clases que se realizan.
Después de crear una relación de realización, puede transformarla en una notación circular. Haga clic con el botón secundario del mouse en la relación y elija Mostrar como círculo.
De este modo, puede mostrar las interfaces que una clase implementa sin llenar los diagramas de clases con vínculos de realización. También puede mostrar la interfaz y las clases que la realizan en diagramas independientes.
Tipos de plantilla
Puede definir un tipo genérico o un tipo de plantilla que otros tipos o valores puedan parametrizar.
Por ejemplo, puede crear un Diccionario genérico parametrizado por tipos de valor y clave:
Para crear un tipo de plantilla
Cree una clase o interfaz. Este objeto pasará a ser el tipo de plantilla. Asígnele el nombre apropiado, por ejemplo Dictionary.
Abra el menú contextual del nuevo tipo y, a continuación, elija Propiedades.
En la ventana Propiedades, en el campo Template Parameters, haga clic en [...].
Aparecerá el cuadro de diálogo Editor de colecciones de parámetros de plantillas.
Elija Agregar.
Establezca la propiedad de nombre en el nombre de un parámetro del tipo de plantilla, por ejemplo, Key.
Establezca Tipo de parámetro. El valor predeterminado es Clase.
Si desea que el parámetro acepte solamente clases derivadas de una clase base determinada, establezca Valor restringido en la clase base que desee.
Agregue tantos parámetros como necesite y, a continuación, elija Aceptar.
Agregue atributos y operaciones al tipo de plantilla del mismo modo que lo haría en otras clases.
Puede utilizar parámetros cuyo tipo sea Clase, Interfaz o Enumeración en la definición de atributos y operaciones. Por ejemplo, si utiliza las clases de parámetros Key y Value, puede definir esta operación en Dictionary:
Get(k : Key) : Value
Puede utilizar un parámetro cuyo tipo Entero sea un límite de multiplicidad. Por ejemplo, el valor entero máximo de un parámetro podría utilizarse para definir la multiplicidad de un atributo como [0..max].
Una vez creados los tipos de plantilla, puede utilizarlos para definir los enlaces de la plantilla:
Para utilizar un tipo de plantilla
Cree un nuevo tipo, por ejemplo, AddressTable.
Abra el menú contextual del nuevo tipo y, a continuación, elija Propiedades.
En la propiedad Template Binding, seleccione el tipo de plantilla, por ejemplo Dictionary, en la lista desplegable.
Expanda la propiedad Template Binding.
Aparecerá una fila para cada parámetro del tipo de plantilla.
Establezca cada parámetro en un valor apropiado. Por ejemplo, establezca el parámetro Key en una clase denominada Name.
Paquetes
Puede ver los paquetes en un diagrama de clases de UML. Un paquete es un contenedor de otros elementos del modelo. Puede crear cualquier elemento dentro de un paquete. En el diagrama, los elementos incluidos en el paquete se desplazarán al mover el paquete.
Puede utilizar el control de expandir y contraer para ocultar o mostrar el contenido del paquete.
Vea Definir espacios de nombres y paquetes.
Generar código a partir de diagramas de clases de UML
Para iniciar la implementación de las clases en un diagrama de clases UML, puede generar código C# o personalizar plantillas para la generación de código. Para iniciar la generación de código usando las plantillas de C# proporcionadas:
Abra el menú contextual del diagrama o un elemento, elija Generar código y establezca las propiedades necesarias.
Para obtener más información sobre cómo establecer estas propiedades y personalizar las plantillas proporcionadas, consulte Generar código a partir de diagramas de clases UML.
Vea también
Referencia
Diagramas de secuencia UML: Referencia
Conceptos
Editar modelos y diagramas UML
Diagramas de clases de UML: Referencia
Crear modelos de los requisitos de los usuarios
Diagramas de componentes de UML: Referencia