2. Elementos Básicos de un Diagrama de Clases
Los diagramas de clases UML se componen de varios elementos fundamentales que permiten representar la estructura estática de un sistema. Conocer estos elementos es esencial para crear y comprender diagramas efectivos.
2.1. Clases (atributos y métodos)
Section titled “2.1. Clases (atributos y métodos)”La clase es el elemento central de un diagrama de clases y representa un conjunto de objetos que comparten una estructura y comportamiento comunes.
Representación gráfica de una clase
Section titled “Representación gráfica de una clase”Una clase se representa como un rectángulo dividido en tres secciones:
+----------------------------+| Nombre Clase |+----------------------------+| - atributo1: tipo || # atributo2: tipo || + atributo3: tipo |+----------------------------+| - metodo1(param): tipoRet || # metodo2(param): tipoRet || + metodo3(param): tipoRet |+----------------------------+Atributos
Section titled “Atributos”Los atributos son las propiedades o características que definen a una clase. Representan los datos que almacenan los objetos de esa clase.
[visibilidad] nombre: tipo [= valorInicial] [{propiedades}]Donde:
- visibilidad: + (público), - (privado), # (protegido), ~ (paquete)
- nombre: identificador del atributo
- tipo: tipo de dato del atributo
- valorInicial: valor por defecto (opcional)
- propiedades: características adicionales como {readonly} (opcional)
- nombre: String+ edad: Integer = 0# saldo: Double {readonly}- fechaNacimiento: Date+ activo: Boolean = trueMétodos
Section titled “Métodos”Los métodos representan el comportamiento de una clase, es decir, las operaciones que pueden realizar los objetos de esa clase.
[visibilidad] nombre(parametro1: tipo1, ..., parametroN: tipoN): tipoRetornoDonde:
- visibilidad: + (público), - (privado), # (protegido), ~ (paquete)
- nombre: identificador del método
- parametros: lista de parámetros con sus tipos (opcional)
- tipoRetorno: tipo de dato que devuelve el método
+ calcularEdad(): Integer- validarDatos(usuario: String, clave: String): Boolean# actualizarSaldo(monto: Double): void+ obtenerInformacion(): String- procesarPago(tarjeta: TarjetaCredito, monto: Double): BooleanLos constructores y destructores son métodos especiales:
-
Constructor: Se representa con el mismo nombre de la clase
Constructor en UML + NombreClase(parametros): void -
Destructor: Se representa con el mismo nombre de la clase precedido por un tilde (~)
Destructor en UML + ~NombreClase(): void
2.2. Objetos vs. Clases
Section titled “2.2. Objetos vs. Clases”Entender la diferencia entre clases y objetos es fundamental en el modelado orientado a objetos.
- Definición: Plantilla o plano que define atributos y comportamientos comunes
- Naturaleza: Concepto abstracto, existe en tiempo de diseño
- Representación: Rectángulo con tres secciones (nombre, atributos, métodos)
- Ejemplo: La clase “Persona” define la estructura para todas las personas
- Creación: Se define una vez en el código
- Definición: Instancia concreta de una clase
- Naturaleza: Entidad real, existe en tiempo de ejecución
- Representación: Rectángulo con nombre subrayado (formato: nombreObjeto:NombreClase)
- Ejemplo: “juan:Persona” es un objeto específico de la clase Persona
- Creación: Se pueden crear múltiples objetos de una misma clase
Representación de objetos en UML
Section titled “Representación de objetos en UML”Aunque los objetos se representan principalmente en los diagramas de objetos, a veces aparecen en diagramas de clases para ilustrar instancias específicas:
+------------------------+| juan:Persona | (subrayado)+------------------------+| nombre = "Juan Pérez" || edad = 30 |+------------------------+2.3. Visibilidad (público, privado, protegido)
Section titled “2.3. Visibilidad (público, privado, protegido)”La visibilidad define el nivel de acceso a los atributos y métodos de una clase desde otras clases del sistema.
Tipos de visibilidad
Section titled “Tipos de visibilidad” | Símbolo | Visibilidad | Descripción | |:--------:|:--------------:|:--------------------------------------------------:| | + | Público | Accesible desde cualquier clase del sistema | | - | Privado | Accesible solo desde la propia clase | | # | Protegido | Accesible desde la propia clase y todas sus subclases | | ~ | Paquete | Accesible desde clases del mismo paquete o módulo |class Persona { + nombre: String // Accesible desde cualquier clase - DNI: String // Solo accesible dentro de Persona # edad: Integer // Accesible en Persona y sus subclases ~ direccion: String // Accesible en clases del mismo paquete
+ getNombre(): String // Método público - validarDNI(): Boolean // Método privado }Implicaciones de la visibilidad
Section titled “Implicaciones de la visibilidad”La elección adecuada de la visibilidad es crucial para el principio de encapsulamiento en la programación orientada a objetos:
Visibilidad pública (+)
- Permite acceso desde cualquier parte del sistema
- Adecuada para interfaces y servicios que deben ser accesibles ampliamente
- Ejemplo: métodos getter/setter, APIs públicas
Visibilidad privada (-)
- Restringe el acceso solo a la propia clase
- Oculta detalles de implementación
- Protege la integridad de los datos
- Ejemplo: atributos internos, métodos auxiliares
Visibilidad protegida (#)
- Permite acceso desde la clase y sus subclases
- Facilita la herencia y extensibilidad
- Ejemplo: métodos que deben ser sobrescritos por subclases
Visibilidad de paquete (~)
- Restringe el acceso a clases del mismo paquete
- Útil para componentes que colaboran estrechamente
- Ejemplo: clases auxiliares dentro de un mismo módulo
Buenas prácticas de visibilidad
Section titled “Buenas prácticas de visibilidad”- Hacer los atributos privados o protegidos y proporcionar métodos públicos (getters/setters) para acceder a ellos cuando sea necesario
- Usar visibilidad protegida para métodos que deben ser sobrescritos por subclases
- Limitar la interfaz pública a lo estrictamente necesario
- Documentar claramente el propósito de los miembros públicos y protegidos