Asociación de Clases en Java V1.0 Febrero 2014 Ferreiras.
Ferreiras
Asociaciones de clases en Java
1
Asociación Es una simple conexión estructural o canal entre las clases y es una relación donde todos los objetos (instancias de dichas clases) tienen su propio ciclo de vida y no hay dueño. Ferreiras
Asociaciones de clases en Java
2
Asociación • Es usad usadaa par paraa con conec ecta tarr dos dos clas clases es.. Una Una línea sólida conecta a las clases asociadas. • Desc Descriribbe una una relación que existirá existirá entre entre las instancias de las clases en tiempo de ejecución . Por ejemplo: A
Ferreiras
B
Asociaciones de clases en Java
3
• Otro ejemplo: Cliente
Factura
-CliCodigo: string - CliNombre: string -CliApellido:string -CliBalance:double
-FacNumero: string - FactFecha: string - CliCodigo: string
Cliente puede saber cuales son sus facturas, pero factura no puede saber cual es su cliente.
Ferreiras
Asociaciones de clases en Java
4
Asociación • Existe una asociación entre dos clases si una instancia de una clase debe saber sobre la instancia de la otra clase con el fin de realizar su trabajo. • Esto es, en una asociación, una instancia de una clase usa una instancia de la otra clase para llevar a cabo una tarea. Por esta razón una asociación es llamada una “relación de uso.” Ferreiras
Asociaciones de clases en Java
5
Asociación • Es representada mediante una línea sólida que conecta a las clases asociadas. • Existirá una asociación entre dos clases si una instancia de una clase debe saber sobre la instancia de la otra clase con el
fin de realizar su trabajo para cumplir con sus responsabilidades. Ferreiras
Asociaciones de clases en Java
6
Por ejemplo: En el contexto de “... Los estudiantes de informática de la UASD realizan sus practicas usando PCs, mediante un permiso ( usuario y contraseña ) que les es asignado por el encargado los laboratorios de informática o aulas LIF-XXX...” Se
generará una asociación entre las clases Estudiante y PCLab como se muestra mas abajo: Permiso Es el nombre de la
asociación
Estudiante
Permiso
PCLab
Esta representación puede ser interpretada como: Estudiante necesita permiso para usar PCLab PCLab requiere de permiso para Estudiante usarla Ferreiras
Asociaciones de clases en Java
7
Asociación En una asociación, una instancia de una clase usa una instancia de la otra clase para llevar a cabo una tarea, sus responsabilidades. Por esta razón una asociación es llamada una “relación de
uso.”
Ferreiras
Asociaciones de clases en Java
8
Asociación Si en la declaración del problema
encontramos términos como “usar a”, “enviar a”, “obtener de”, “depender de”, “solicitar a”, “pedir a”, “requerir de”, o “informar a” o “comunicar a”
estos son indicios, pistas que probablemente indiquen asociaciones de clases. Ferreiras
Asociaciones de clases en Java
9
Asociación • La cantidad de clases participantes podrán ser dos o mas; • Asociaciones binarias Son asociaciones que relacionan dos clases. • Las mas comunes son las asociaciones binarias, porque son las mas fácil de conceptualizar . Ferreiras
Asociaciones de clases en Java
10
Asociación usualmente se relacionan a través de asociaciones. Es por ello que las tarjetas CRC (ClaseResponsabilidad-Colaboración), a ver mas adelante en este curso, son una fuente, también, para identificar asociaciones de clases. Las clases que colaboran
Ferreiras
Asociaciones de clases en Java
11
Elementos en un asociación
• Aclaran la relación representada por la asociación. • Son: • Nombre de la asociación (opcional); • Roles de las clases (opcional); • Multiplicidad; • Veamos su explicación y uso. Ferreiras
Asociaciones de clases en Java
12
Elementos en un asociación
de la asociación, con un símbolo, opcional, que indique el sentido en el cual se debe leer. Por ejemplo: Nombre1
Persona
Empleo
Es el nombre de la asociación.
Empresa
Este símbolo es opcional, apuntando a la dirección en la cual fluye la relación.
defecto de el clases nombre es “tiene”. : Si no esta nombrada, por Ferreiras Asociaciones en Java 1
13
Elementos en un asociación Continuando
con el ejemplo anterior:
Persona
Empresa
Empleo
Claramente, esta asociación representa el hecho de que “Persona es empleada por Empresa ” Y, nunca podrá entenderse como “ Empresa es empleada por Persona ”, porque así lo establece el
símbolo para su lectura. Ferreiras
Asociaciones de clases en Java
14
Elementos en un asociación
de una asociación es elegido de modo que, en combinación con los nombres de las clases relacionadas, se pueda producir una sentencia sensata que describa la relación entre dichas clases conectadas. Como, por ejemplo: El nombre
“Persona es empleada por Empresa ” Ferreiras
Asociaciones de clases en Java
15
Elementos en un asociación
• Algunos “gurúes” Sugieren usar una frase verbal para que el nombre de la asociación refleje el propósito de la relación. • Otros “gurúes” Sugieren usar un simple nombre. En este curso usaremos, preferiblemente, este estilo, democráticamente establecido por el profesor. Ferreiras
Asociaciones de clases en Java
16
Elementos en un asociación Rol o papel que desempeña un
Cada extremo de la asociación pueden ser etiquetado con un nombre del rol o papel que desempeña en ésta, el cual aclara la naturaleza de dicha asociación. extremo
Ferreiras
⇒
Asociaciones de clases en Java
17
Elementos en un asociación Un nombre de un rol
Se elige para
describir cómo se ven los objetos de una clase en un extremo de una asociación desde la perspectiva de los objetos de la clase del otro extremo .
Ferreiras
Asociaciones de clases en Java
18
Elementos en un asociación Por ejemplo, en la asociación ������� rol
Persona
empleado
empleador
Rol: Cada objeto Persona
Rol: Cada objeto Empresa
ve a un objeto Empresa como su “empleador”. Luego, “empleador” seria un nombre apropiado para el rol de cada objeto de la clase Empresa
Ferreiras
Empresa
ve a un objeto Persona como su “empleado”. Luego, “empleado” seria un nombre apropiado para el rol de cada objeto de la clase Persona
Asociaciones de clases en Java
19
Otro ejemplo roles
Cliente -CliCodigo: string - CliNombre: string -CliApellido:string -CliBalance:double
genera
Factura pertenece
-FacNumero: string - FactFecha: string - CliCodigo: string
de las asociaciones mostradas es como sigue: La lectura
CLIENTE genera FACTURA FACTURA pertenece a CLIENTE Ferreiras
Asociaciones de clases en Java
20
Otro ejemplo: roles
Vendedor - VendorCodigo: long - VendorNombre: string - VendorApellido:string - VendorTel: string
Producto suplido
suple
- ProCodigo: long - ProDescripcion: string - ProPrecio: double
Vendedor suple Producto Producto es suplido por Vendedor
Ferreiras
Asociaciones de clases en Java
21
Mas ejemplos
de nombres de roles
Note: One Personal Computer sees the System Unit (the CPU) as your computer brain.
Recuperated from http://www.ts.mah.se/RUP/RationalUnifiedProcess/process/modguide/md_assoc.htm Ferreiras
Asociaciones de clases en Java
22
• Roles, algunos tips de interés • La mayor parte de la información acerca de una asociación se define en sus extremos ( los roles de sus respectivas clases ). • Su uso es opcional, algunos “gurúes” no lo usan para evitar sobrecargar mucho la representación de la asociación. Ferreiras
Asociaciones de clases en Java
23
• Roles, algunos tips de interés • Por Ejemplo: CursoDeMaestria
CursoDeGrado
Requerimiento
Un CursoDeMaestria requiere un CursoDeGrado
Ferreiras
Asociaciones de clases en Java
24
• Roles, algunos tips de interés • En la implementación de la asociación, El nombre del rol Tendrá un papel importante; • En la implementación de la asociación, Es de estilo que el nombre del rol sea el de una variable puntero (C++), o referencia ( Java ) del tipo de la clase en el extremo donde ésta esté. Ferreiras
Asociaciones de clases en Java
25
Cardinality in Associations • An association has two ends • Each end can connect to one or many objects, depending on how the association is defined in the database schema • Objectivity/DB associations support four categories of cardinality: – 1:1 one-to-one – 1:m one-to-many – m:1 many-to-one – n:m many-to-many
Ferreiras
Asociaciones de clases en Java
26
Multiplicidad La multiplicidad de una asociación define el número de instancias de una clase en un extremo de dicha asociación que esta conectado con una instancia de la clase en el otro extremo. Luego, esta multiplicidad puede ser: Uno-A-Uno Uno-A-Mucho Mucho-A-Uno Mucho-A-Mucho Ferreiras
Asociaciones de clases en Java
27
Multiplicidad Para expresar de manera más clara la
multiplicidad de una asociación se pueden usar, solos o combinados, el cero, números naturales y el símbolo de la cerradura de Kleene ( ). ∗
• En esta representación, la multiplicidad proporciona la misma información que las construcciones de conectividad y cardinalidad, en la relación de participación en el modelo ER ( a ver en INF-526 con Ferreiras ) Ferreiras
Asociaciones de clases en Java
28
Las expresiones más comunes son: Multiplicidad
0..1 1 0.. ó 1.. n 0..n 1..n n..m n..m ó z Compleja ∗ ∗
Ferreiras
∗
Significado
Cero ó Uno Uno sólo, exactamente uno, uno Cero ó más, mucho Uno ó más, al menos uno Únicamente n ( Donde n > 1 ) Cero a n ( Donde n > 1 ) Uno a n ( Donde n > 1 ) n a m ( Donde n & m > 1 ) Un numero exacto; p.e.: 3..4 ó 6 Por ejemplo: 0..1, 3..4, 6.. significa cualquier número de objetos que no sean 2 ó 5. ∗
Asociaciones de clases en Java
29
Multiplicidad Por ejemplo, en la asociación ������� Persona
empleado
1
∗
Es la multiplicad de este extremo e indica que “ Cero o mas objetos ������� �������� están conectados, por medio de la asociación Empleo, con un objeto ������� ��������� “ ∗
Ferreiras
empleador
Empresa
1 Es la multiplicidad de este
extremo e indica que “ Un objeto ������� ���������, exactamente uno, esta conectado con un objeto ������� ��������”
Asociaciones de clases en Java
30
Ejemplo: roles
Cliente -CliCodigo: string - CliNombre: string -CliApellido:string -CliBalance:double
Factura pertenece
genera 1
0..
-FacNumero: string - FactFecha: string - CliCodigo: string
∗
multiplicidad
La lectura
de las asociaciones mostradas es
como sigue: un CLIENTE genera cero o mas FACTURA una FACTURA pertenece a un (solo uno) CLIENTE Ferreiras
Asociaciones de clases en Java
31
Ejemplo: roles
Vendedor - VendorCodigo: long - VendorNombre: string - VendorApellido:string - VendorTel: string
Producto -ProCodigo: long - ProDescripcion: string - ProPrecio: double
suplido
suple 1
0..
∗
multiplicidad
un Vendedor suple cero o más Producto un Producto es suplido por un Vendedor
Ferreiras
Asociaciones de clases en Java
32
Representación de asociaciones mucho-A-mucho Estudiante
Asignatura inscrito ∗
selección inscripción
∗
Un Estudiante se inscribe en muchas Asignaturas Una Asignatura es inscripta por muchos Estudiantes
Ferreiras
Asociaciones de clases en Java
33
Representación de asociaciones mucho-A-mucho Factura
Producto listado ∗
vendido ...
1..
∗
Una Factura lista muchos (al menos 1) Productos Un Producto es vendido en cero o mas Facturas
Ferreiras
Asociaciones de clases en Java
34
Multiplicidad ¿ Cómo leer las anotaciones de
Para dar una descripción más completa de la relación que está siendo representada por la asociación, las anotaciones de multiplicidad se pueden leer: multiplicidad ?
⇒
En conjunto con los nombres de los roles de los extremos; O, Con los nombres de las clases asociadas, solamente.
Ferreiras
Asociaciones de clases en Java
35
Multiplicidad Por ejemplo, la asociación ������ Persona
empleado
empleador
1
∗
Empresa
Puede ser leída como : Una Persona empleado trabaja para una Empresa empleador; O,
Una Persona trabaja para una Empresa
Ferreiras
Asociaciones de clases en Java
36
Multiplicidad de las anotaciones de multiplicidad tiene que ver con el número El significado preciso
de conexiones que pueden existir en un momento dado, en tiempo de ejecución . Por ejemplo, considerando la asociación �������� que hemos estado usando,
podemos decir que: Ferreiras
Asociaciones de clases en Java
37
Empleo
Alicia : Persona
SIN : Empresa
Empleo
CNN : Empresa Balbuena : Persona
Son ilegales porque: a) El objeto Persona Alicia trabaja simultáneamente para
dos objetos Empresas; b) El objeto Persona Balbuena no esta conectado a
ningún objeto Empresa. Ferreiras
Asociaciones de clases en Java
38
Multiplicidad En general, la información de multiplicidad
debe ser mostrada en las asociaciones, pero los nombres de la asociación y los nombres de los roles de los extremos son opcionales. Se debe elegir un nivel de detalle necesario para hacer una representación de fácil comprensión. Ferreiras
Asociaciones de clases en Java
39
Multiplicidad entre el mismo par de clases, es necesario algún etiquetado textual para clarificar las asociaciones y asegurar que la multiplicidad correcta es entendida para cada asociación. Si hay mas de una asociación
Por ejemplo:
Ferreiras
Asociaciones de clases en Java
40
Considerando el caso de que una persona pueda ser empleado y a la vez cliente de una empresa. Por ejemplo:
empleado Persona
empleador
∗
cliente
proveedor
∗
1
Empresa
∗
Una Persona es empleado de una Empresa Una Empresa es empleador de cero o mas Persona Una Persona es cliente de cero o mas Empresa Una Empresa es proveedor de cero o mas Persona Ferreiras
Asociaciones de clases en Java
41
Multiplicidad En una asociación reflexiva o unaria,
Esto es, una asociación en la cual ambos extremos conectan a la misma clase, los nombres de los roles de los extremos son muy útiles para distinguirlos entre si y esclarecer lo representado por la asociación. Por ejemplo:
Ferreiras
Asociaciones de clases en Java
42
hijo
Persona 1..
padre
2
∗
D e s c e n d r e a r D e r e c
o r P
Un hijo debe descender de dos padre Un padre debe procrear uno o mas hijo Ferreiras
Asociaciones de clases en Java
43
Otro ejemplo:
supervisor
Empleado
obrero
1
2..10
Un supervisor debe supervisar 2 a 10 obreros OJO: De obrero a supervisor no hay interés Ferreiras
Asociaciones de clases en Java
44
Navegabilidad Muestra la dirección en la cual una asociación puede ser recorrida o consultada,
mediante una punta de flecha en la línea de la asociación. Por ejemplo: Cliente
0..*
1..*
Dirección
Un cliente puede ser consultado acerca de su dirección; pero una dirección no puede ser consultad por su cliente. Ferreiras
Asociaciones de clases en Java
45
En la asociación Cliente – Dirección anterior, Un objeto Cliente debe conocer sus objetos Dirección con los que está asociados, pero un objeto Dirección no tiene conocimiento de los objetos Cliente con los que está asociados. En otras palabras,
Ferreiras
Asociaciones de clases en Java
46
Otro ejemplo
de navegabilidad
Persona
Carro ∗
• Una Persona es propietaria de 0 ó más Carro; • En la representación actual, no hay forma de consultar desde Carro a Persona
Ferreiras
Asociaciones de clases en Java
47
Otro ejemplo
de navegabilidad
Pedido cantidad aplicaITBIS calcularSubtoal calcularPesoTotal
Mercancía 0..*
1..*
peso precio getPrecio getPeso
Un objeto Pedido puede ser consultado acerca de sus objetos Mercancia, pero no a la inversa, esto es, un objeto Mercancía no puede ser consultado acerca de sus objetos Pedido.
Ferreiras
Asociaciones de clases en Java
48
para registrar el hecho de que ciertos conexiones de clases en el sistema sólo se podrían recorrer, o los mensajes enviados, en una dirección. La navegabilidad es indicada por medio de una flecha abierta, que se coloca en el extremo de la línea de asociación junto a la clase de destino. La navegabilidad se utiliza
Ferreiras
Asociaciones de clases en Java
49
Asociación unidireccional, asociación bidireccional Asociación unidireccional Es aquella
asociación cuya navegabilidad es en un solo sentido. Esto significa que la clase de origen tiene una referencia a la clase destino , pero la clase destino no sabe acerca de la clase de origen. Esto último es importante a tener en cuenta para fines de implementación. Los ejemplos anteriores son asociaciones unidireccionales. Ferreiras
Asociaciones de clases en Java
50
Asociación unidireccional, asociación bidireccional Asociación bidireccional Es aquella asociación cuya navegabilidad es en ambos sentidos. Esto Esto signific significaa que ambas ambas clases clases tienen tienen
referencias entre sí. En otras palabras, ambas clases en los extremos de la asociación son, al mismo tiempo, origen y destino. Ambas se pueden consultar entre sí. Por defecto, si no se indica la navegabilidad, la asociación es bidireccional. Ferreiras
Asociaciones de clases en Java
51
propietario
Por ejemplo: Persona
0..*
1..1 propietario
Perro mascota
Representa los mismo que: Persona
0..*
1..1
Perro
propietario
mascota
Un
objeto Persona puede consultar cuantos objetos Perro tiene. Un objeto Perro puede consultar cuál es su único objeto Persona. En la implementación, la clase Persona y la clase Perro tendrán referencias entre sí ( un contenedor de mascota en Persona y una variable propietario en Perro ). Normalmente se implementan dividiéndolas en dos asociaciones
unidireccionales y una tercera clase que las conecta. Ferreiras
Asociaciones de clases en Java
52
Implementación de asociaciones [ Codificando asociaciones ] • Implementar una asociación es codificar en un lenguaje de programación la situación representada. • Normalmente, esto es hecho usando variables punteros ( C++ ) o referencias (Java), inicializándolas en el constructor . Ferreiras
Asociaciones de clases en Java
53
/* Asociacion2.java jdk1.7.0_13 Ferreiras / Java/ Association / 1-M Implementar la asociacion indicada: +---------+ miEscuela miProfesor +--------+ | Escuela |--------------------------------->|Profesor| +---------+ 1..1 1..* +--------+ */
Ferreiras
Asociaciones de clases en Java
54
import java.util.Vector; class Escuela { private String nombre; private Vector
profesores; public Escuela( Vector vp, String no ) { profesores = vp; nombre = no; } public String getNombre() { return nombre; } public void mostrarProfes( ) { for( int i = 0; i < profesores.size(); ++i ) { System.out.println( profesores.get(i).getNombre() ); } } }
Ferreiras
Asociaciones de clases en Java
55
class Profesor { private String nombre; public Profesor( String no ){ nombre = no; } public String getNombre() { return nombre; } }
Ferreiras
Asociaciones de clases en Java
56
public class Asociacion2 { public static void main( String [] fofi ) { Profesor p1 = new Profesor( "Ramon Turey"); Profesor p2 = new Profesor( "Eugenio Santos"); Profesor p3 = new Profesor( "Maria Tutu"); Vector vp = new Vector(); vp.add(p1); vp.add(p2); vp.add(p3); Escuela e1 = new Escuela( vp, "Geografia" ); System.out.println("\n* Los profesores de " + e1.getNombre() + " son:"); e1.mostrarProfes(); } }
Ferreiras
Asociaciones de clases en Java
57
* C:\Archivos de programa\Java\jdk1.7.0_13\bin>javac Asociacion2.java C:\Archivos de programa\Java\jdk1.7.0_13\bin>java Asociacion2 * Los profesores de Geografia son: Ramon Turey Eugenio Santos Maria Tutu C:\Archivos de programa\Java\jdk1.7.0_13\bin> */
Ferreiras
Asociaciones de clases en Java
58
/* Asociacion3.java
jdk1.7.0_13 Ferreiras / Java / Asociacion de clases / M-M En la UASD un Estudiante cursa asignaturas varios Departamentos y un Departamento tiene inscritos varios Estudiantes. * * Estudiante ---------------- Departamento Para implementar esta asociacion: * 1 1 * Estudiante --------------- Curso --------------- Departamento Ver código completo en el grupo.
*/
Ferreiras
Asociaciones de clases en Java
59
C:\Archivos de programa\Java\jdk1.7.0_13\bin>javac Asociacion3.java C:\Archivos de programa\Java\jdk1.7.0_13\bin>java Asociacion3 * El Estudiante Antonio Lopez * Tiene clases en el curso AB-101 * Las asignaturas son Fisica Matematica Informatica * Del departamento Fisica * Tienen clases en el curso AB-101 * Los estudiantes Antonio Lopez Puerta Rota Pedro La Cosa C:\Archivos de programa\Java\jdk1.7.0_13\bin>
Ferreiras
Asociaciones de clases en Java
60
de implementación de interés es el de la siguiente asociación reflexiva: Un ejemplo
Curso ∗
∗
o t i s i u q e r r e r P
Un Curso es prerrequisito de muchos Curso Muchos Curso son prerrequisito de un Curso Ferreiras
Asociaciones de clases en Java
61
Implementada como asociación unidireccional , representará esta situación:
curso7:Curso
curso6:Curso
curso5:Curso
Ferreiras
El objeto Curso9:Curso conoce que los objetos curso2:Curso, curso3:Curso y curso4:Curso son sus prerrequisitos
curso9:Curso
El objeto Curso9:Curso no conoce que los objetos curso7:Curso, curso6:Curso y curso5:Curso lo consideran como uno de sus prerrequisitos, que dependen de el Asociaciones de clases en Java
curso2:Curso
curso3:Curso
curso4:Curso
62
La implementación unidireccional, en Java, de la clase Curso tendría, entre otras cosas, lo siguiente: class Curso { private String codigoCurso; private String nombreCurso; private double costoPorCredito; private Vector prerrequisitos;
//....
Para almacenar los objeto Curso que son su prerrequisito.
}
Ferreiras
Asociaciones de clases en Java
63
Si la implementación bidireccional: class Curso { private String codigoCurso;
Para almacenar los objetos Curso que son su prerrequisito.
private String nombreCurso; private double costoPorCredito; private Vector prerrequisitos; private Vector prerrequisitoDe;
//.... Para almacenar los objeto Curso que lo consideran su prerrequisito.
}
Ferreiras
Asociaciones de clases en Java
64
Asignación para ser entregada cuando
sea requerida formalmente en el grupo: Ahora es su turno Joven: Considere la situación de la vida real
universitaria que usted conoce, esto es, varios profesores imparten clase en una misma aula, obviamente que a diferentes horarios cada uno, es decir, no se juntan dos profesores en una misma aula en un mismo horario, y un profesor puede impartir clase en varias aulas pero, si imparte clase, debe ser en un aula, sin que tenga “choque” de aulas. Un profesor querrá saber las aulas que tiene asignadas y un aula querrá saber los profesor que tiene asignados.
Su trabajo: Hacer la representación y la
implementación en código Java Ferreiras
Asociaciones de clases en Java
65
A
partir de la siguiente información acerca del juego de críquet: Un equipo de críquet tiene 11 jugadores. Uno de ellos es el capitán;
Un jugador sólo puede jugar para un equipo; El capitán lidera a los miembros del equipo;
Construir la asociación correspondiente. Ferreiras
Asociaciones de clases en Java
66
Solución
del problema anterior 1
jugadores 10
0..1
capitán
Jugador
11
miembro-de
Equipo 1
1 capitán
liderea
Su tarea1:
Implementar esta asociación
1: Para su entrega, esperar el requerimiento formar en el grupo.
Esto significa, que usted debe hacerla ya y guardarla a la espera de que sea requerida por el profesor. Ferreiras
Asociaciones de clases en Java
67
EJEMPLOS
INF512_C++_Tema_???_Ejem.zip
Ferreiras
Asociaciones de clases en Java
68
EJERCICIOS
INF512_C++_Tema_???_Ejem.doc
Ferreiras
Asociaciones de clases en Java
69
Pendiente
para una próxima versión:
Clase de asociación (Association Class).
Ferreiras
Asociaciones de clases en Java
70