Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Dudas al implementar las relaciones del diagrama de clases de UML

Estas en el tema de Dudas al implementar las relaciones del diagrama de clases de UML en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 02/04/2014, 11:59
 
Fecha de Ingreso: abril-2008
Mensajes: 10
Antigüedad: 16 años, 6 meses
Puntos: 0
Dudas al implementar las relaciones del diagrama de clases de UML

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??

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

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??

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



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

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


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.
  #2 (permalink)  
Antiguo 02/04/2014, 21:24
Avatar de Payaso73  
Fecha de Ingreso: abril-2009
Ubicación: Argentina
Mensajes: 309
Antigüedad: 15 años, 7 meses
Puntos: 20
Respuesta: Dudas al implementar las relaciones del diagrama de clases de UML

Hola ivan0590, una asociación es cuando una clase tiene una referencia a otra clase como atributo, por ejemplo

Código Java:
Ver original
  1. public class ClasePrincipal {
  2.  
  3.     private ClaseSecundaria objetoClaseSecundaria;
  4.  
  5. }
  6.  
  7. public class ClaseSecundaria {
  8.  
  9.     private ClasePrincipal objetoClasePrincipal;
  10.    
  11. }

En el ejemplo de arriba, ClasePrincipal está asociada a ClaseSecundaria con una relación de 1 a 1. Ambas pueden usar los métodos de la otra por medio del objeto declarado.


Cita:
además tampoco se como se implementaría una asociación directa, me refiero a la asociación con punta de flecha.
Una asociación "con punta de flecha" quiere decir que es unidireccional, o sea...

[ClasePrincipal]---->[ClaseSecundaria]

ClasePrincipal tiene un atributo ClaseSecundaria objetoClaseSecundaria como en el ejemplo de arriba, pero ClaseSecundaria no tiene el de ClasePrincipal, ya que, como te marca la flecha, no puede ir para esa dirección.

Si por ejemplo tenes una relación 1 a n (1 a muchos / 1 a *), en vez de declarar un objeto, declaras un vector/arreglo/lista.

[ClasePrincipal](1)--------(0..*)[ClaseSecundaria]

En este caso, ClasePrincipal tendría de atributo un arregla de tipo ClaseSecundaria y ClaseSecundaria tendría un objeto de tipo ClasePrincipal.

En cuanto a Agregación y Composición, no te puedo ayudar porque nunca me lo puse a ver en detalle ya que me recomendaron que trate de no usarlo.

Espero te ayude mi respuesta, te dejo un pdf para que lo veas, tiene ejemplos de UML a Java bien detallados, me sirvieron cuando tuve alguna duda. También te recomiendo el libro "UML for Java Programmers"

UML a Java

Saludos!
  #3 (permalink)  
Antiguo 03/04/2014, 12:42
 
Fecha de Ingreso: abril-2008
Mensajes: 10
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Dudas al implementar las relaciones del diagrama de clases de UML

Gracias por tu respuesta Payaso73.
Acabo de leerme todo el PDF que me has pasado, y entre eso y tu explicación deduzco lo siguiente:
  1. Una asociación define de forma general, sin entrar en más detalle, una relación entre dos clases. Es decir, una clase tendrá un atributo del tipo de otra clase que puede ser un solo objeto o una colección de ellos. Pero la asociación no se para a decir como esos objetos han de adquirir valor, ni cuando se crean ni cuando se destruyen. Por ello están la agregación y la composición, que son formas mucho más especificas de asociación.
  2. La agregación extiende el significado previo de asociación, diciendo que el/los objeto/s se han de crear fuera de la clase. Es decir, que la clase no será la encargada de crearlos sino que se les asignará el valor desde fuera y la clase solamente guardará su referencia en un atributo.
  3. Y por último, la composición va un paso más allá diciendo que el/los objeto/s se crean dentro de la clase y se destruyen cuando la clase se destruye. Es decir, el atributo de la clase se instancia dentro de ella, sin poder asignarse el valor desde fuera, haciendo que el/los objeto/s solo puedan ser utilizados dentro de la clase.

Espero no equivocarme...

Por cierto, se me olvidó preguntar como se implementaría una dependencia. Tengo entendido que es la relación que menos acoplamiento entre clases genera.
Por casualidad, ¿no se implementará como el ejemplo que he puesto al intentar explicar la asociación?
Me refiero a que simplemente sea cuando se usan los objetos para pasarlos como argumento a los métodos y nada más, sin que haya atributos.

Saludos.
  #4 (permalink)  
Antiguo 03/04/2014, 15:27
Avatar de Payaso73  
Fecha de Ingreso: abril-2009
Ubicación: Argentina
Mensajes: 309
Antigüedad: 15 años, 7 meses
Puntos: 20
Respuesta: Dudas al implementar las relaciones del diagrama de clases de UML

Cita:
Iniciado por ivan0590 Ver Mensaje
Por cierto, se me olvidó preguntar como se implementaría una dependencia. Tengo entendido que es la relación que menos acoplamiento entre clases genera.
Por casualidad, ¿no se implementará como el ejemplo que he puesto al intentar explicar la asociación?
Me refiero a que simplemente sea cuando se usan los objetos para pasarlos como argumento a los métodos y nada más, sin que haya atributos.

Saludos.
Si, es como pusiste en tu primer ejemplo cuando hablabas de Asociación. Solo que una sola clase tiene un método con un objeto de la otra clase como parámetro, no las dos.
Es decir:
[A]- - - - >[B]
A tiene un método con un parámetro objetoB, pero B "no ve a A"
Una clase utiliza a otra. Y si esta ultima se altera, la anterior se puede ver afectada.

Fijate esta respuesta de chuidiang: Diferencia dependencia y asociacion, UML, tal vez te sirva.

Saludos.
  #5 (permalink)  
Antiguo 03/04/2014, 17:05
 
Fecha de Ingreso: abril-2008
Mensajes: 10
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Dudas al implementar las relaciones del diagrama de clases de UML

En ese post que has pasado se han resuelto todas mis dudas.
En el segundo mensaje, chuidiang explica claramente el concepto de asociación y cuando se ha de usar. Y resalto el cuando porque a mi personalmente era lo que me confundía.

La verdadera diferencia entre asociación y dependencia, agregación, composición y generalización, es que la asociación solo dice que dos clases se relacionan, dándole poca importancia a la forma en que lo hacen.
Entonces, las asociaciones se usan cuando estás empezando un diseño y sabes que dos clases se relacionan, pero no sabes si una clase va a recibir objetos de la otra como argumentos en los métodos, o va a tener un atributo del tipo de la otra, o va a ser padre de la otra. Simplemente no lo sabes o de momento no te interesa y por lo tanto utilizas una asociación, que es un concepto muy general.
Una vez profundizas, cambias las asociaciones por dependencias, agregaciones, composiciones y generalizaciones.

Esos 4 tipos de relaciones son fáciles de entender, tanto conceptualmente como al implementarlas. Lo que no me terminaba de cuadrar era la asociación, que sentido tenía habiendo esos otros 4 tipos de relaciones. Ahora está todo más que claro.


Muchísimas gracias Payaso73, sin tu ayuda no lo habría llegado a entender.
Y bueno, también hay que agradecerle a chuidiang por explicar el concepto de asociación de forma tan sencilla y rápida de entender.

Saludos!

Última edición por ivan0590; 03/04/2014 a las 17:21
  #6 (permalink)  
Antiguo 03/04/2014, 17:31
Avatar de Payaso73  
Fecha de Ingreso: abril-2009
Ubicación: Argentina
Mensajes: 309
Antigüedad: 15 años, 7 meses
Puntos: 20
Respuesta: Dudas al implementar las relaciones del diagrama de clases de UML

Por nada!

Saludos.

Etiquetas: clase, clases, diagrama, dudas, implementar, programa, relaciones, uml, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:21.