Você está na página 1de 14

UNMSM Anlisis y Diseo de Algoritmos

Relaciones entre clases: dependencia y asociacin


Anteriormente ya habamos visto cmo encontrar clases a partir de un
enunciado, y cmo encontrar sus atributos y mtodos. Tambin habamos
visto como representarlos por medio de UML y habamos resuelto un
ejercicio para reforzar lo aprendido. Probablemente al resolver el ejercicio
anterior habr notado que en el diagrama falta algo, ese algo son las
RELACIONES entre las clases.

Relaciones entre objetos


Hasta el momento sabemos que vivimos en un mundo rodeado de objetos, y
para objetos comunes creamos clases que los representen, de las cuales
podemos instanciar a nuevos objetos. Sin embargo, estos objetos no son
entidades aisladas, sino ms bien son entidades que estn relacionadas con
otros objetos. Esta relacin es lo que permite a los objetos colaborar entre s,
y gracias a ellas podemos crear programas informticos muy complejos de
forma muy sencilla.

Existen diversos tipos de relaciones entre clases, las cuales son las siguientes:

Dependencia
Asociacin
Agregacin
Composicin
Herencia

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Realizacin

Por ahora slo nos concentraremos en las dos primeras: DEPEDENCIA y


ASOCIACIN. Estas dos relaciones son las ms bsicas que existen entre las
clases.

Relacin de DEPENDENCIA
Definicin
La relacin de dependencia nos indica que un objeto de la clase hace uso de
otro objeto de otra clase, por eso tambin se le conoce como relacin de
uso. Es la relacin ms dbil de todas.

Notacin
Se representa con una lnea punteada que tiene en uno de sus extremos la
punta de una flecha:

ClaseA

ClaseB

Formas de lectura
La clase A depende de la clase B
La clase A instancia internamente un objeto de la clase B
La clase A usa a la clase B

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Forma de implementacin
Por medio de un parmetro en un mtodo o por medio de una instanciacin
dentro de un mtodo.

Ejemplo
Tenemos el siguiente contexto: Un alumno llamado Lolo va a dar su examen
de Clculo, y para ello va a utilizar su calculadora. Como el alumno est
haciendo uso de una calculadora, podemos representar esta relacin por
medio de una dependencia:

Y su representacin en cdigo Java es la siguiente:

Calculadora.java
public class Calculadora {
private String marca;
public Calculadora(String marca) {
this.marca = marca;
}
public double operacionSuma(double a, double b){
return a+b;
}
public String getMarca() {
return marca;
}

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

public void setMarca(String marca) {


this.marca = marca;
}
}

Alumno.java
public class Alumno {
private String nombre;
public Alumno(String nombre) {
this.nombre = nombre;
}
public double sumar(double a, double b){
/*Instanciamos una calculadora*/
Calculadora calculadora = new Calculadora("Cassio");
/*Realizamos la suma*/
double suma = calculadora.operacionSuma(a, b);
/*Devolvemos el resultado*/
return suma;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}

Vemos claramente como la clase Alumno para poder realizar su suma usa
a la clase Calculadora para realizar dicha operacin.

Consideraciones sobre la DEPENDENCIA

El objeto independiente (ClaseB) no sabe en qu clase est siendo


llamada, slo el objeto dependiente (ClaseA) conoce la relacin.

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

El ciclo de vida del objeto independiente (ClaseB) dentro del objeto


dependiente (ClaseA) es local, ya que el objeto independiente
(ClaseB) slo es accesible desde el mtodo en donde fue instanciado o
recibido como parmetro.

Relacin de ASOCIACIN
Definicin
Representa la colaboracin que pueden tener los objetos entre s, en donde
ambos pueden colaborarse mutuamente o slo uno de ellos al otro. Esta
colaboracin no es temporal como en el caso de la DEPENDENCIA, sin que
tiene una naturaleza ms permanente. Es ms fuerte que la dependencia,
pero menos fuerte que la composicin.

Notacin
Se representa con una lnea slida, que puede o no tener una punta de flecha
en uno de sus extremos. Tambin, opcionalmente puede tener una pequea
descripcin sobre la lnea, en ese caso la punta de la flecha indica cmo leer
la relacin.

ClaseA

Asociada con

ClaseB

Formas de lectura
La clase A est asociada con la clase B
Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

La clase A trabaja con la clase B

Formas de implementacin
Por medio de un atributo de un objeto de la clase B en la clase A.

Ejemplo
Tenemos el siguiente contexto: Una escritor ha decido escribir un libro. Como
el escritor est escribiendo un libro podemos relacionarlo a l y al libro con
una ASOCIACIN.

Y su representacin en cdigo Java:

Libro.java
public class Libro {
private String titulo;
private String contenido;
public Libro(String titulo, String contenido) {
this.titulo = titulo;
this.contenido = contenido;
}
public String getContenido() {
return contenido;
}

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

public void setContenido(String contenido) {


this.contenido = contenido;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
}

Escritor.java
public class Escritor {
private String nombre;
private Libro libro;
public Escritor(String nombre) {
this.nombre = nombre;
/*Por defecto escribimos este libro*/
this.libro = new Libro("El cuervo", "Seor -dije- o seora,
en verdad vuestro perdn imploro");
}
public Escritor(String nombre, Libro libro){
this.nombre = nombre;
/*Recibimos este libro como parmetro*/
this.libro = libro;
}
public void escribirEnLibro(String contenidoNuevo){
/*Obtenemos el texto escrito hasta ahora en el libro*/
String contenidoActual = this.libro.getContenido();
/*Colocamos el contenido actual concatenado con el nuevo*/
this.libro.setContenido(contenidoActual+contenidoNuevo);
}
public Libro getLibro() {
return libro;
}
public void setLibro(Libro libro) {
this.libro = libro;
}
public String getNombre() {
return nombre;
}

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

public void setNombre(String nombre) {


this.nombre = nombre;
}
}

Notar como es que el atributo libro de la clase Escritor puede ser


colocado de diferentes formas: por medio del mtodo setLibro, por medio
del constructor Escritor(String nombre, Libro libro), o instancindolo con un
valor por defecto dentro del constructor Escritor(String nombre). Es muy
importante notar esto ltimo, ya que en la composicin y agregacin no
podemos hacer esto tan libremente.

Multiplicidad y direccionalidad
En el ejemplo anterior hemos visto lo siguiente: Un escritor escribe un
libro, pero sabemos que en la vida real esto puede no ser as, ya que un
escritor puede escribir ms de un libro, es ms, un libro puede ser escrito por
ms de un escritor. Para soportar estos contextos existe la multiplicidad y la
bidireccionalidad. La multiplicidad nos indica cuntos objetos de una clase
participan en la asociacin y la direccionalidad nos indica quin est asociado
con quin. Veamos algunos ejemplos (para estos ejemplos nos enfocamos en
la representacin UML, ya que la implementacin del cdigo Java es trivial).

Multiplicidad de 1 a muchos
Situmonos en este contexto: Durante la clase de laboratorio de Anlisis y
Diseo de Algoritmos, un profesor le dicta clases a uno o muchos alumnos.
Representemos esto por medio de una asociacin:

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Notamos

como

en

la

clase

Profesor

aparece

un

atributo

grupoDeAlumnos del tipo Alumno*+ (arreglo de alumno). Tambin


aparecen las etiquetas de multiplicidad a cada lado de la asociacin. La flecha
nos indica la forma de lectura: Un profesor dicta clases a uno o muchos
alumnos.

Ahora, cmo interpretamos la flecha? Pues en este caso significa que la


clase Profesor conoce a la clase Alumno, pero la clase Alumno no tiene
ninguna referencia de la clase Profesor. Si quisiramos cambiar este
comportamiento y permitir que la clase Alumno tenga tambin una
referencia hacia la clase Profesor, debemos eliminar la flecha y agregarle
un atributo Profesor a la clase Alumno, tal como se ve ahora:

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Pero ahora que no est la flecha que no indique la direccin de la lectura,


cmo leemos la relacin? Pues es muy simple, slo vemos qu clase tiene la
multiplicidad 1, 0 0..1 y leemos hacia la que tiene la multiplicidad n,
0..n 1..n.

Multiplicidad de muchos a muchos


Ahora pongmonos en un contexto ms amplio que la clase de Anlisis y
Diseos de Algoritmos, situmonos en el contexto de toda la facultad. En la
FISI un profesor le dicta a clases a uno o muchos alumnos, y un alumno recibe
clases de uno o muchos profesores. Representaremos esto por medio de una
asociacin:

Notar como ahora ya no hay ninguna flecha que indique una direccin de
lectura, ni una etiqueta que describa a la asociacin, ya que con la relacin de
muchos a muchos se pierde el sentido de lectura, slo es vlido agregar
una etiqueta si la asociacin puede leerse de ambos lados.

Caso especial: CLASE ASOCIADA CONSIGO MISMA

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Tambin es posible que una clase est asociada consigo misma, pongamos un
ejemplo para revisar este caso: Una persona puede tener cero o muchos
amigos, representemos esto por medio de UML:

Como podemos ver, se ha agregado a la clase Persona un atributo del tipo


Persona*+ ya que se trata de una multiplicidad de uno a muchos.

Caso especial: CLASE DE ASOCICACIN


En muchas ocasiones haremos uso de la relacin de muchos a muchos, y en
ocasiones necesitaremos que esta asociacin tenga atributos. Para eso
tenemos la asociacin denominada clase de asociacin. Veamos un
ejemplo.

Situmonos en este contexto: Una persona puede alquilar un auto, y un auto


puede ser alquilado por muchas personas. Adems, cuando se alquila un auto
Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

se anotan los datos de la persona que alquil el auto, los datos del auto
alquilado, la fecha de alquiler, la fecha de retorno del auto y el costo total.
Por medio de UML lo representamos de la siguiente manera:

Notemos como ahora la clase Persona y la clase Auto ya no tienen como


atributos arreglos de la clase Auto y Persona respectivamente, en lugar
de eso se ha creado una nueva clase llamada FichaDeAlquiler que contiene
un atributo del tipo Persona, un atributo del tipo Auto y el resto de
atributos que definen la asociacin. No hay que confundir este conector con
el de la nota adjunta.

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

En Rational Rose la clase de asociacin se adjunta por medio de la opcin


Association Class.

Caso especial: MS DE UNA ASOCIACIN ENTRE CLASES


En ocasiones tambin es posible que entre dos clases exista ms de una
asociacin que las relacione. Veamos un ejemplo para entenderlo mejor: Un
hombre es amigo de cero o muchas mujeres, pero slo puede ser esposa de
una o ninguna de ellas. De la misma manera, una mujer es amiga de cero o
muchos hombres, pero slo est casada con uno o ninguno de ellos.
Reflejemos lo anterior en por medio de UML.

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Vemos como la asociacin Est casado con es bidireccional y se refleja


como un atributo esposa y uno esposo en las clases Hombre y Mujer
respectivamente. De forma similar, la asociacin Es amigo de es
bidireccional y se refleja con un atributo amigas y uno amigos en las
clases Hombre y Mujer respectivamente.

Con esto finalizamos el tema de dependencias y asociaciones, la siguiente


clase continuaremos con la composicin, la agregacin, la herencia y la
realizacin.

Prof. Alonso Ral Melgarejo Galvn

Você também pode gostar