Java - Dudas al implementar las relaciones del diagrama de clases de UML

   
Vista:

Dudas al implementar las relaciones del diagrama de clases de UML

Publicado por Iván (3 intervenciones) el 02/04/2014 15:42:39
Hola.
Les escribo para poder solucionar las dudas que tengo respecto de como implementar en Java las relaciones del diagrama de clases de UML. Hace no mucho que he empezado a ver UML y todavía me falta mucho por aprender, tanto de UML como de programación más avanzada.

Mi dilema es el siguiente.
Conceptualmente hablando tengo entendido lo siguiente:
- Una asociación es cuando una clase usa los objetos de otra clase, pero sin poseerlos ni controlar su ciclo de vida.
- Una agregación es igual que la asociación pero poseyendo dichos objetos. Es decir, la clase no controla el ciclo de vida de los objetos de la otra clase pero se guarda su referencia.
- Una composición es igual que la agregación, solo que la clase si controla el ciclo de vida. Es decir, la clase se encarga de instanciar los objetos de la otra clase y obviamente guarda su referencia, todo de tal forma que cuando el objeto de la clase principal se destruye, los objetos de la otra clase también lo hacen.

Los conceptos no son difíciles de entender, si es que no me he equivocado al nombrarlos. No he nombrado la generalización porque de momento no me produce ninguna duda,.

Bueno, el problema viene al intentar implementar estas relaciones en Java. He estado viendo muchas páginas en las que hablan de ello, pero solo han incrementado mi confusión debido a que en todas lo hacen de forma diferente. Con lo cual, no se que forma es realmente la correcta en términos generales.


Empezando con la asociación. ¿¿Puede que simplemente sea cuando una clase utiliza las referencias de los objetos de otra clase como argumentos en los métodos??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ClasePrincipal {
 
    public void hacerAlgo(ClaseSecundaria objeto){
        //Hacer algo con el objeto de la clase secundaria...
    }
}
 
public class ClaseSecundaria {
 
    public void hacerAlgo(ClasePrincipal objeto){
        //Hacer algo con el objeto de la clase principal...
    }
 
}


No sé si esto es correcto y además tampoco se como se implementaría una asociación directa, me refiero a la asociación con punta de flecha.

Respecto a la agregación. ¿¿Sería cuestión de tener un atributo del tipo de la otra clase, pero sin instanciarlo nunca, asignándole el valor mediante el constructor o un setter??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ClasePrincipal {
 
    private ClaseSecundaria objeto;
 
    ClasePrincipal(ClaseSecundaria objeto){
        this.objeto = objeto;
    }
 
    public void setObjeto(ClaseSecundaria objeto){
        this.objeto = objeto;
    }
 
    public ClaseSecundaria getObjeto(){
        return objeto;
    }
 
}
 
public class ClaseSecundaria {
 
    ClaseSecundaria (){
        //.....
    }
}

¿¿Y en la composición tendría el atributo y además me encargaría de instanciarlo directamente o en el constructor por defecto??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ClasePrincipal {
 
    private ClaseSecundaria objeto; //También se podría instanciar directamente al declararlo
 
    ClasePrincipal(){
        objeto = new ClaseSecundaria();
    }
 
}
 
public class ClaseSecundaria {
 
    ClaseSecundaria (){
        //.....
    }
}



Estas son mis dudas. Puede que lo que acabo de poner este todo bien, solo una parte o nada. La verdad, no tengo ni idea.

Espero con ansias vuestras respuestas.
Saludos y gracias de antemano.

PD: Perdonad si el mensaje ha sido muy largo, no se me ocurría mejor forma de reflejarlo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Dudas al implementar las relaciones del diagrama de clases de UML

Publicado por Tom (911 intervenciones) el 03/04/2014 09:13:52
Una Asociación es casi cualquier cosa. Es un concepto amplio que indica alguna relación entre clases.
1
2
3
class A {
      void conoce(B b) { hola(b); }
}

Una Agregación es una Asociación compartida. A contiene una instancia de B y X e Y contienen también instancias de B.
1
2
3
4
5
class A {
     B myB;
      void agrega(B b) { myB = b; }
      B getB() { return myB; }
}


Una Composición es una Asociación no compartida. A posee una instancia de B. B no puede existir fuera de A.

1
2
3
4
class A {
     B myB;
      A() { myB = new B(); }
}

Por supuesto, las posibles relaciones entre clases en Java son muchas más, y más flexibles.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas al implementar las relaciones del diagrama de clases de UML

Publicado por Iván (3 intervenciones) el 03/04/2014 16:10:08
Entonces, por lo que he entendido, hay múltiples formas de representar una asociación. En cuanto a la agregación, múltiples clases comparten la referencia del objeto, con lo cual ninguna de ellas lo crea. Y la composición crea el objeto y es su único dueño, sin que ninguna otra clase posea una referencia a dicho objeto.
Estoy en lo cierto?

Ahh y otra duda que se me olvidó de preguntar es como implementar una dependencia.

Saludos y muchas gracias por tu respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas al implementar las relaciones del diagrama de clases de UML

Publicado por Tom (911 intervenciones) el 04/04/2014 10:08:46
Pues es que Dependencia y Asociación en Java es casi lo mismo (dependiendo del artículo que estés leyendo).
Básicamente una Dependencia es algo aún más genérico que una asociación. En Java, class A "depende" de class B simplemente si tienes que hacer un "import B" en el código de A (lo que significa que A usa de alguna manera B, y que tendrás que recompilar A si cambia B).
En esa interpretación, una Asociación sería una Dependencia algo más estrecha que lo que te describí, A contendría una instancia de B, y una Agregación sería casi lo mismo que una Asociación.

Mira, por ejemplo, aquí:

https://vaughnvernon.co/?page_id=31
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar