viernes, mayo 21, 2010

UML, Asociacion y Agregacion

El post de la Agregación y Composición despertó otra pregunta más (Como siempre suele suceder, ya dije que el debate siempre dá para algo más). La duda viene por el lado de la diferencia entre asociación y Agregación en código. Se sostiene que es algo conceptual, que no se representa en código. Mi respuesta es que esto es 50% correcto. Ya que, como mencione antes (la etiqueta Diseño tiene mas sobre esto), la Asociación surgió primero, y la Agregación vendría a ser un tipo particular de Asociación. Ergo ...Agregacion "IS-A" Asociación ¡punto para ud! . Primero veamos el diagrama UML

Ahora veamos el codigo de la clase Persona (Nota: imagínense los generics por que blogspot los toma como tags, así que no aparecen)

import java.util.List;

public class Persona {

private String nombre;
private String apellido;

private Foto foto;
private List lugaresFrecuentes;
private List comunicaciones;

public String getNombre() {return nombre;}
public void setNombre(String nombre) {this.nombre = nombre;}
public String getApellido() {return apellido;}
public void setApellido(String apellido) {this.apellido = apellido;}

//Asociacion Foto
public Foto getFoto() {return foto;}
public void setFoto(Foto foto) {this.foto = foto;}

//public List getLugaresFrecuentes() {return lugaresFrecuentes;}
//public void setLugaresFrecuentes(List lugaresFrecuentes) {this.lugaresFrecuentes = lugaresFrecuentes;}

//Agregacion
public void agregarLugar(Lugar lugar){
lugaresFrecuentes.add(lugar);
}
public boolean quitarLugar(Lugar lugar){
return lugaresFrecuentes.remove(lugar);
}
//Asociación
public void setComunicaciones(List comunicaciones) {
this.comunicaciones = comunicaciones;
}
public List getComunicaciones() {
return comunicaciones;
}

}

Las diferencias principales son que:
  1. ¡La Agregación son siempre colecciones, o arrays! O algo que sirva de contenedor para "agregar" más de un objeto, aunque agreguemos uno solo. (si no sería settear y no agregar, add)
  2. La Agregación cuenta con dos métodos: uno para "agregar" un solo objeto a la lista, y el otro para quitarlo de la misma.
  3. La agregación puede, como no, tener los metodos setter y getter, mientras que la Asociación siempre los tiene, que ponen y obtienen una variable de referencia del mismo tipo de la variable de instancia o de clase, en este caso List.

Bueno, espero haber limpiado alguna duda, y abrir otras ;) Saludos.

7 comentarios:

Quiti dijo...

Una clase puede agregarse a si misma, es decir si estoy haciendo uso un diagrama de clases para representar un metamodelo e indicar que una clase plantilla se agrega a si misma

aro dijo...

En realidad, y a mi entender, vos podes hacer que cualquier clase se relaciones en forma "asociativa" consigo misma. Y como una agregación no es mas que una asociación con esteroides ergo, sip! se puede

Rowinson Gallego dijo...

Yo creo que se podría interpretar lo que sucede con los métodos Agregar/Quitar (Add/Remove) en LugaresFrecuentes como consecuencia de una asociación con multiplicidad de 1 a muchos (1, *). Así, si se habla de un único elemento en la relación se usan los getters/setters, y si se habla de varios elementos, de add/remove. Todo depende de la multiplicidad. En conclusión la diferencia entre el uso de una agregación o una asociación es más conceptual que de código.

aro dijo...

I totally agree with you!! si, también se la puede interpretar como tu lo dices. Es una cuestión de interpretación. Al fin y al cabo, tanto la agregación como la composición derivan de la asociación. Los setter y los getters estan siempre presentes, mas alla de la multiplicidad, por que forman parte de las "propiedades" de un objeto (no confundir con los atributos de una clase). Coincido, contigo, en que lo podemos expresarlo con asociaciones, pero la "conceptualidad",en mi puto de vista, debe ser expresada en código. Saludos

Anónimo dijo...

Interesante! Este lunes tengo parcial y tu publicación me ha ayudado bastante a aclarar algunas diferencias.
He leído en otro lugar que la diferencia principal entre ellas depende de "qué tan fuerte" es la relación entre las clases. Una Asociación se presenta cuando la relación entre ellas es muy básica. Por ejemplo cuando en un método de la clase 'A' utiliza una instancia de la clase 'B'. Esta es una relación muy básica (creo que la más básica).
Tanto en la Asociación como en la composición tienen una relación más fuerte, como se ve en tus ejemplos.

aro dijo...

Hola "Anonimo" (je) hay pocas cosas mmuuy claras en UML, pero una de esas pocas cosas es que: una asociacion, es siempre una relación IS-A, por lo que no se podria utilizar este tipo de relación, para graficar la llamada desde un METODO de una instancia. En este caso se utiliza una relacion de "Uso" llamada "Dependencia". (La de las lineas punteadas) Saludos

Unknown dijo...

Hola, después de 7 años desde esta publicación, sigue siendo la mejor respuesta que he encontrado. Gracias!! muy buen contenido