Vista previa del material en texto
Ferreiras Asociaciones de clases en Java 1 Asociación de Clases en Java V1.0 Febrero 2014 Ferreiras. 2 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. Asociación Ferreiras Asociaciones de clases en Java 3 Asociación • Es usada para conectar dos clases. Una línea sólida conecta a las clases asociadas. • Describe una relación que existirá entre las instancias de las clases en tiempo de ejecución. Por ejemplo: A B Ferreiras Asociaciones de clases en Java Ferreiras Asociaciones de clases en Java 4 Cliente -CliCodigo: string - CliNombre: string -CliApellido:string -CliBalance:double Factura -FacNumero: string - FactFecha: string - CliCodigo: string Cliente puede saber cuales son sus facturas, pero factura no puede saber cual es su cliente. • Otro ejemplo: 5 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 Ferreiras Asociaciones de clases en Java 6 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 7 Estudiante PCLab Permiso 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 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 8 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 9 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 10 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 11 Asociación ���� Las clases que colaboran usualmente se relacionan a través de asociaciones. Es por ello que las tarjetas CRC (Clase- Responsabilidad-Colaboración), a ver mas adelante en este curso, son una fuente, también, para identificar asociaciones de clases. Ferreiras Asociaciones de clases en Java 12 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 13 ���� Nombre1 de la asociación, con un símbolo, opcional, que indique el sentido en el cual se debe leer. Por ejemplo: Persona Empresa Empleo � 1: Si no esta nombrada, por defecto el nombre es “tiene”. Elementos en un asociación Es el nombre de la asociación. Este símbolo es opcional, apuntando a la dirección en la cual fluye la relación. Ferreiras Asociaciones de clases en Java 14 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. Elementos en un asociación ���� Continuando con el ejemplo anterior: Ferreiras Asociaciones de clases en Java 15 ���� El nombre 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: “Persona es empleada por Empresa” Elementos en un asociación Ferreiras Asociaciones de clases en Java 16 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 17 ���� Rol o papel que desempeña un extremo ⇒⇒⇒⇒ 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. Elementos en un asociación Ferreiras Asociaciones de clases en Java 18 ���� 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. Elementos en un asociación Ferreiras Asociaciones de clases en Java 19 Por ejemplo, en la asociación Empleo: Persona Empresa empleadorempleado Rol: Cada objeto Persona ve a un objeto Empresa como su “empleador”. Luego, “empleador” seria un nombre apropiado para el rol de cada objeto de la clase Empresa Rol: Cada objeto 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 Elementos en un asociación rol Ferreiras Asociaciones de clases en Java 20 Cliente -CliCodigo: string - CliNombre: string -CliApellido:string -CliBalance:double Factura -FacNumero: string - FactFecha: string - CliCodigo: string genera pertenece roles ���� Otro ejemplo CLIENTE genera FACTURA FACTURA pertenece a CLIENTE ���� La lectura de las asociaciones mostradas es como sigue: Ferreiras Asociaciones de clases en Java 21 Vendedor - VendorCodigo: long - VendorNombre: string - VendorApellido:string - VendorTel: string Producto - ProCodigo: long - ProDescripcion: string - ProPrecio: double suple suplido roles ���� Otro ejemplo: Producto es suplido por Vendedor Vendedor suple Producto Ferreiras Asociaciones de clases en Java 22 ���� 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 23 • 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 24 • Roles, algunos tips de interés • Por Ejemplo: CursoDeMaestria CursoDeGrado Requerimiento Un CursoDeMaestria requiere un CursoDeGrado Ferreiras Asociaciones de clases en Java 25 • 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 tipode la clase en el extremo donde ésta esté. 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 26Asociaciones de clases en Java Ferreiras Asociaciones de clases en Java 27 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 28 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 29 ���� Las expresiones más comunes son: Multiplicidad Significado 0..1 Cero ó Uno 1 Uno sólo, exactamente uno, uno 0..∗ ó ∗ Cero ó más, mucho 1..∗ Uno ó más, al menos uno n Únicamente n ( Donde n > 1 ) 0..n Cero a n ( Donde n > 1 ) 1..n Uno a n ( Donde n > 1 ) n..m n a m ( Donde n & m > 1 ) n..m ó z Un numero exacto; p.e.: 3..4 ó 6 Compleja Por ejemplo: 0..1, 3..4, 6..∗ significa cualquier número de objetos que no sean 2 ó 5. Ferreiras Asociaciones de clases en Java 30 Por ejemplo, en la asociación Empleo: Persona Empresa empleadorempleado ∗∗∗∗ Es la multiplicad de este extremo e indica que “ Cero o mas objetos Persona empleado están conectados, por medio de la asociación Empleo, con un objeto Empresa empleador “ 1 Es la multiplicidad de este extremo e indica que “ Un objeto Empresa empleador, exactamente uno, esta conectado con un objeto Persona empleado” ∗∗∗∗ 1 Multiplicidad Ferreiras Asociaciones de clases en Java 31 Cliente -CliCodigo: string - CliNombre: string -CliApellido:string -CliBalance:double Factura -FacNumero: string - FactFecha: string - CliCodigo: string genera pertenece roles 1 0..∗ ���� Ejemplo: un CLIENTE genera cero o mas FACTURA una FACTURA pertenece a un (solo uno) CLIENTE ���� La lectura de las asociaciones mostradas es como sigue: multiplicidad Ferreiras Asociaciones de clases en Java 32 Vendedor - VendorCodigo: long - VendorNombre: string - VendorApellido:string - VendorTel: string Producto -ProCodigo: long - ProDescripcion: string - ProPrecio: double suple suplido roles 1 0..∗ ���� Ejemplo: multiplicidad un Producto es suplido por un Vendedor un Vendedor suple cero o más Producto Ferreiras Asociaciones de clases en Java 33 Representación de asociaciones mucho-A-mucho Un Estudiante se inscribe en muchas Asignaturas Una Asignatura es inscripta por muchos Estudiantes Estudiante Asignatura inscrito selección inscripción ∗ ∗ Ferreiras Asociaciones de clases en Java 34 Representación de asociaciones mucho-A-mucho Una Factura lista muchos (al menos 1) Productos Un Producto es vendido en cero o mas Facturas Factura Producto listado vendido ... ∗ 1..∗ Ferreiras Asociaciones de clases en Java 35 ���� ¿ Cómo leer las anotaciones de multiplicidad ? ⇒⇒⇒⇒ 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: ���� Con los nombres de las clases asociadas, solamente. ���� En conjunto con los nombres de los roles de los extremos; O, Multiplicidad Ferreiras Asociaciones de clases en Java 36 Por ejemplo, la asociación Empleo Persona Empresa empleadorempleado ∗∗∗∗ 1 Puede ser leída como : Una Persona empleado trabaja para una Empresa empleador; O, Una Persona trabaja para una Empresa Multiplicidad Ferreiras Asociaciones de clases en Java 37 ���� El significado preciso de las anotaciones de multiplicidad tiene que ver con el número de conexiones que pueden existir en un momento dado, en tiempo de ejecución. ���� Por ejemplo, considerando la asociación Empleado que hemos estado usando, podemos decir que: Multiplicidad Ferreiras Asociaciones de clases en Java 38 Alicia : 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. CNN : Empresa SIN : Empresa Empleo Empleo Balbuena : Persona Ferreiras Asociaciones de clases en Java 39 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. Multiplicidad Ferreiras Asociaciones de clases en Java 40 ���� Si hay mas de una asociación 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. Por ejemplo: Multiplicidad Ferreiras Asociaciones de clases en Java 41 Persona Empresa empleadorempleado ∗∗∗∗ 1 ∗ ∗ cliente proveedor 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 ���� Por ejemplo: Considerando el caso de que una persona pueda ser empleado y a la vez cliente de una empresa. Ferreiras Asociaciones de clases en Java 42 ���� 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: Multiplicidad Ferreiras Asociaciones de clases en Java 43 Persona 1..∗ hijo padre 2 Pr oc re ar � D escenderD e � Un hijo debe descender de dos padre Un padre debe procrear uno o mas hijo Ferreiras Asociaciones de clases en Java 44 Empleado 1 supervisor obrero 2..10 Un supervisor debe supervisar 2 a 10 obreros OJO: De obrero a supervisor no hay interés ���� Otro ejemplo: Ferreiras Asociaciones de clases en Java 45 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 Dirección 1..*0..* 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 46 ���� En otras palabras, 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. Ferreiras Asociaciones de clases en Java 47 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 ���� Otro ejemplo de navegabilidad Ferreiras Asociaciones de clases en Java 48 ���� Otro ejemplo de navegabilidad Pedido cantidad aplicaITBIS calcularSubtoal calcularPesoTotal Mercancía peso precio getPrecio getPeso 1..*0..* ���� 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 49 ���� La navegabilidad se utiliza para registrar el hecho de que ciertos conexiones de clases en el sistema sólo se podrían recorrer, o los mensajesenviados, 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. Ferreiras Asociaciones de clases en Java 50 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 51 Asociación unidireccional, asociación bidireccional ���� Asociación bidireccional Es aquella asociación cuya navegabilidad es en ambos sentidos. Esto significa que ambas clases 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 52 ���� Por ejemplo: Persona Perro 0..*1..1 Persona Perro 0..*1..1 Representa los mismo que: ���� Un objeto Persona puede consultar cuantos objetos Perro tiene. ���� Un objeto Perro puede consultar cuál es su único objeto Persona. propietario propietario mascota propietario mascota ���� 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 53 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 54 /* 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 55 import java.util.Vector; class Escuela { private String nombre; private Vector<Profesor> profesores; public Escuela( Vector<Profesor> 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 56 class Profesor { private String nombre; public Profesor( String no ){ nombre = no; } public String getNombre() { return nombre; } } Ferreiras Asociaciones de clases en Java 57 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<Profesor> vp = new Vector<Profesor>(); 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 58 * 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 59 /* 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 60 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 61 ���� Un ejemplo de implementación de interés es el de la siguiente asociación reflexiva: Curso P re rr eq ui si to ∗ ∗ Un Curso es prerrequisito de muchos Curso Muchos Curso son prerrequisito de un Curso Ferreiras Asociaciones de clases en Java 62 � Implementada como asociación unidireccional, representará esta situación: curso9:Cursocurso6:Curso curso5:Curso curso7:Curso curso3:Curso curso4:Curso curso2:Curso El objeto Curso9:Curso conoce que los objetos curso2:Curso, curso3:Curso y curso4:Curso son sus prerrequisitos 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 Ferreiras Asociaciones de clases en Java 63 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<Curso > prerrequisitos; //.... } Para almacenar los objeto Curso que son su prerrequisito. Ferreiras Asociaciones de clases en Java 64 Si la implementación bidireccional: class Curso { private String codigoCurso; private String nombreCurso; private double costoPorCredito; private Vector<Curso> prerrequisitos; private Vector<Curso> prerrequisitoDe; //.... } Para almacenar los objetos Curso que son su prerrequisito. Para almacenar los objeto Curso que lo consideran su prerrequisito. Ferreiras Asociaciones de clases en Java 65 ���� 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 66 � 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. � A partir de la siguiente información acerca del juego de críquet: Ferreiras Asociaciones de clases en Java 67 Jugador Equipo 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. 1 0..1 111 capitán miembro-de � 1 10 liderea capitán jugadores ���� Solución del problema anterior ���� Su tarea1: Implementar esta asociación Ferreiras Asociaciones de clases en Java 68 EJEMPLOS INF512_C++_Tema_???_Ejem.zip Ferreiras Asociaciones de clases en Java 69 EJERCICIOS INF512_C++_Tema_???_Ejem.doc Ferreiras Asociacionesde clases en Java 70 ���� Pendiente para una próxima versión: Clase de asociación (Association Class). Ferreiras Asociaciones de clases en Java 71