Relaciones entre clases en UML¶
Agregación¶
La agregación representa una relación “todo–parte” débil entre objetos. El compuesto existe sin necesidad de que existan todas sus partes, pero las partes sí dependen del todo para tener sentido dentro del modelo.
classDiagram
class Cuadro
class Marco
class Cristal
class Lamina
Cuadro "1" o-- "1" Marco
Cuadro "1" o-- "1" Cristal
Cuadro "1" o-- "1" Lamina
classDiagram
class Plato
class Ingrediente
Plato "1" o-- "1..*" Ingrediente : seElaboraCon
Composición¶
La composición es una forma fuerte de agregación. Las partes no pueden existir sin el todo y solo pertenecen a un compuesto.
classDiagram
class PlanDeEstudios
class Asignatura
PlanDeEstudios "1" *-- "1..*" Asignatura
classDiagram
class Ventana
class Panel
class Cabecera
class BarraDesplazamiento
Ventana "1" *-- "1" Panel
Ventana "1" *-- "0..1" Cabecera
Ventana "1" *-- "2" BarraDesplazamiento
Generalización y Especialización¶
Representa jerarquías donde una superclase contiene atributos/métodos comunes y las subclases amplían su comportamiento.
classDiagram
class Cuenta {
-numeroCuenta
-saldo
}
class CuentaCorriente {
-saldoMedio
}
class CuentaDeAhorro {
-tipoInteres
}
Cuenta <|-- CuentaCorriente
Cuenta <|-- CuentaDeAhorro
Asociación¶
Representa relaciones genéricas entre clases.
Asociación reflexiva¶
classDiagram
class Empleado {
nombre
}
Empleado "0..*" --> "0..1" Empleado : jefe
Asociación binaria¶
classDiagram
class Cliente
class Pedido
Cliente "1" --> "1..*" Pedido
Asociación ternaria con clase asociativa¶
classDiagram
class Atleta
class Prueba
class Fecha
class Participacion {
resultado : String
}
Atleta "0..*" -- "0..*" Prueba
Prueba "0..*" -- "0..*" Fecha
Atleta "0..*" -- "0..*" Fecha
Participacion .. Atleta
Participacion .. Prueba
Participacion .. Fecha
Clase Asociativa¶
Usada cuando la relación necesita almacenar datos adicionales.
classDiagram
class Pedido {
referencia
fecha
}
class Articulo {
codigo
descripcion
pvp
}
class LineaPedido {
cantidad
}
Pedido "1" --> "0..*" LineaPedido
Articulo "1" --> "0..*" LineaPedido
Realización (Interfaces)¶
Indica que una clase implementa una interfaz.
Se usa en lenguajes como Java para simular herencia múltiple.
classDiagram
class Comparar {
<<interface>>
esMayorQue()
}
class Figura
class Rectangulo
class Triangulo
class Circulo
class Fraccion
Comparar <|.. Figura
Comparar <|.. Fraccion
Figura <|-- Rectangulo
Figura <|-- Triangulo
Figura <|-- Circulo
Actividades¶
-
AC 411 (RA5 / / IC1 / 3p). Escribe una clase con el nombre Calculadora. La clase debe tener dos campos o atributos (variable miembro) con los nombres primerNumero y segundoNumero, ambos de tipo double. Codifica los siguientes métodos:
-
Getters:
- Método llamado getPrimerNumero sin ningún parámetro, debe devolver el valor del campo primerNumero.
- Método llamado getSegundoNumero sin ningún parámetro, debe devolver el valor del campo segundoNumero.
-
Setters:
- Método llamado setPrimerNumero con un parámetro de tipo double, debe establecer el valor del campo primerNumero.
- Método llamado setSegundoNumero con un parámetro de tipo double, debe establecer el valor del campo segundoNumero.
-
Otros métodos:
- Método llamado getResultadoSuma sin ningún parámetro, debe devolver el resultado de sumar los valores de campo de primerNumero y segundoNumero.
- Método llamado getResultadoResta sin ningún parámetro, debe devolver el resultado de restar los valores de campo de segundoNumero del primerNumero.
- Método llamado getMultiplicationResult sin ningún parámetro, debe devolver el resultado de multiplicar los valores de campo de primerNumero y segundoNumero.
- Método llamado getDivisionResult sin ningún parámetro, debe devolver el resultado de dividir los valores de campo de primerNumero por segundoNumero. En caso de que el valor de segundoNumero sea 0, devuelve 0.
Test, código para probar la clase Calculadora. Escribe este código en una clase Main, dentro del método main.Comprueba que realiza correctamente todas las operaciones.
Ayuda. En total debes tener 8 métodos en la clase Calculadora. Los métodos NO deben ser public static, solo public.
Genera un método main donde pruebes todos los métodos. Recuerda que siempre que se puedan pedir datos por teclado, se han de pedir
-
-
AC 412 (RA5 / / IC1 / 3p). Codifica una clase Persona. La clase debe tener tres campos con los nombres nombre, apellido de tipo String y edad de tipo entero. Escribe los siguientes métodos:
-
Getters:
- Método llamado getNombre sin ningún parámetro, debe devolver el valor del campo nombre.
- Método llamado getApellido sin ningún parámetro, debe devolver el valor del campo apellido.
- Método llamado getEdad sin ningún parámetro, debe devolver el valor del campo de edad.
-
Setters:
- Método llamado setNombre con un parámetro de tipo String, debe establecer el valor del campo nombre.
- Método llamado setApellido con un parámetro de tipo String, debe establecer el valor del campo apellido.
- Método llamado setEdad con un parámetro de tipo int, debe establecer el valor del campo de edad. Si el parámetro es menor que 0 o mayor que 100, establece el valor del campo de edad en 0.
-
Otros métodos:
- El método llamado esAdolescente sin ningún parámetro, debe devolver verdadero si el valor del campo de edad es mayor que 12 y menor que 20; de lo contrario, devuelve falso.
- Método llamado getFullName sin ningún parámetro, debe devolver el nombre completo de la persona.
En caso de que los campos nombre y apellido estén vacíos, las cadenas devuelven una cadena vacía. En caso de que apellido sea una cadena vacía, devuelva nombre. En caso de que nombre sea una cadena vacía, devuelve apellido.
Para verificar si un String está vacío, usa el método isEmpty de la clase String. Por ejemplo, nombre.isEmpty() devuelve verdadero si el String está vacío o en otras palabras, cuando el String no contiene ningún carácter.
Recuerda que siempre que se puedan pedir datos por teclado, se han de pedir.
-
-
AC 413 (RA5 / / IC1 / 3p). Define una clase con el nombre Muro. La clase necesita dos campos (variables de instancia) con nombre ancho y alto de tipo double.
La clase debe tener dos constructores. El primer constructor (constructor por defecto sin parámetros). El segundo constructor tiene los parámetros de ancho y alto de tipo double y debe inicializar los campos. En caso de que el ancho sea menor que 0, debe establecer el valor del campo de ancho en 0, en caso de que el parámetro de altura sea menor que 0, debe establezca el valor del campo de altura en 0.
Escribe los siguientes métodos (métodos de instancia):
- Método llamado getAncho sin ningún parámetro, devuelve el valor del campo ancho.
- Método llamado getAlto sin ningún parámetro, devuelve el valor del campo alto.
- Método llamado setAncho con un parámetro de tipo double, establece el valor del campo ancho. Si el parámetro es menor que 0, establece el valor del campo ancho en 0.
- Método llamado setAlto con un parámetro de tipo double, establece el valor del campo alto. Si el parámetro es menor que 0, establece el valor del campo alto en 0.
- Método llamado getArea sin ningún parámetro, devuelve el área del muro.
Genera un método main donde pruebes todos los métodos. Recuerda que siempre que se puedan pedir datos por teclado, se han de pedir.
-
PR 414 (RA5 / / IC1 / 5p).La compañía Mundo Alfombra te ha pedido que escribas una aplicación que calcule el precio de las alfombras para habitaciones rectangulares. Para calcular el precio, se multiplica el área del piso (ancho por largo) por el precio por metro cuadrado de alfombra. Por ejemplo, el área de un piso que mide 12 metros de largo y 10 metros de ancho es 120 metros cuadrados, cubrir el piso con una alfombra que cuesta 8€ por metro cuadrado costaría 960€.
Vamos a crear las siguientes clases con sus constructores y métodos:
-
Codifica una clase con el nombre Suelo. La clase necesita dos campos (variables de instancia) con nombre ancho y largo de tipo double.La clase debe tener un constructor con parámetros ancho y largo de tipo double y debe inicializar los campos. En caso de que el parámetro de ancho sea menor que 0, se establecerá el valor del campo ancho en 0, en caso de que el parámetro largo sea menor que 0, se establecerá el valor del campo largo en 0.Escribe los siguientes métodos (métodos de instancia):
- Método llamado getArea sin ningún parámetro, devuelve el área calculada (ancho * largo).
- Método llamado getArea con un parámetro, devuelve el área calculada (ancho * ancho). Es cuadrada.
-
Desarrolla una clase llamada Alfombra con un campo llamado coste de tipo double. Incluye el constructor de la clase con un parámetro para inicializar el campo coste. En caso de que el parámetro coste sea menor que 0, se establecerá el valor del campo coste en 0. Añade el siguiente método:
- Método llamado getCoste sin ningún parámetro, devuelve el valor del campo coste.
-
Escribe una clase con el nombre Calculadora con dos campos (variables de instancia) suelo de tipo Suelo y alfombra de tipo Alfombra. Codifica el constructor parametrizado con los parámetros de suelo de tipo Suelo y alfombra de tipo Alfombra e inicializa los campos. Añade el siguiente método en la clase:
- Método getCosteTotal sin ningún parámetro, devuelve el coste total calculado para cubrir el piso con una alfombra.
Genera un método main donde pruebes todos los métodos. Recuerda que siempre que se puedan pedir datos por teclado, se han de pedir. Juega con el código y crea situaciones de prueba cuando tenemos ancho y largo con valores negativos. Y cuando nos dan un precio de coste negativo. Muestra las salidas por pantalla.
-
-
AP 415 (RA5 / / IC1 / 5p). Un alumno de DAM quiere organizar mejor todo lo que aprende: tiene apuntes en PDF, snippets de código, pequeñas ideas de proyectos, bugs curiosos que le encuentra a sus prácticas y también trucos que le cuentan sus compañeros o que ve en redes. Se agobia porque lo tiene todo desperdigado entre carpetas, repositorios y notas sueltas.
Te piden que pienses el modelo de clases interno de una herramienta personal que le ayude a capturar, refinar y reutilizar ese conocimiento. No vas a modelar pantallas, ni botones, ni bases de datos: solo la “lógica interna” con clases simples pero bien pensadas.
Debes diseñar como mínimo cinco clases que representen, como mínimo, ideas de este tipo:
- Algo que represente una unidad de conocimiento que el alumno quiere conservar (pero sin llamarla “Nota” o “Apunte”).
- Algo que controle cuánto de útil o maduro es lo que ha guardado (por ejemplo, si es un apunte bruto o ya está pulido y probado).
- Algo que permita registrar contexto: en qué situación descubrió eso, para qué lenguaje o tecnología le sirve, si lo usó en un ejercicio, práctica, proyecto, etc.
- Algo que se encargue de registrar revisiones o mejoras que hace con el tiempo (por ejemplo, cuando vuelve a un snippet y lo refactoriza).
- Algo que le ayude a recordar lo que ya tiene guardado, para que no lo “entierre” y se olvide (por ejemplo, un mecanismo para decidir qué mostrarle de nuevo, sin hablar de alarmas ni notificaciones).