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

Diferencia dependencia y asociacion, UML

Estas en el tema de Diferencia dependencia y asociacion, UML en el foro de Java en Foros del Web. Saludos, me gustaria saber cual es la diferencia que establece java para la dependencia y la asociacion. Osea, como puedo reconocer en codigo cuando se ...
  #1 (permalink)  
Antiguo 07/11/2011, 18:10
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Diferencia dependencia y asociacion, UML

Saludos, me gustaria saber cual es la diferencia que establece java para la dependencia y la asociacion.

Osea, como puedo reconocer en codigo cuando se trata de una dependencia y cuando es asociacion.
  #2 (permalink)  
Antiguo 07/11/2011, 23:17
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Diferencia dependencia y asociacion, UML

Hola:

Una asociación es un concepto general de UML para indicar que dos clases están asociadas, sea como sea. La dependencia es un caso específico de asociación, igual que agregación, composición y herencia.

Normamente en una etapa temprana del diseño cuando no se quiere todavía profundizar en detalles se usan asociaciones en general. Cuando se quiere entrar en el detalle, ya se va identificando cada asociación de qué tipo es.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 08/11/2011, 08:18
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Diferencia dependencia y asociacion, UML

Saludos Chuidiang!

Pensaba que este tema quedaria sin respuesta, y me responde Chuidiang!
Gracias por responder y por todos tus aportes en tu pagina. Han sido de gran ayuda para mi mientras comenzaba a aprender Java, sobretodo la forma sencilla de explicar a pesar de saber tanto. (No muchos tienen esa capacidad o simplemente quieren aparentar que saben tanto que tu ni los puedes entender).

Por lo que entendi, en una diagrama detallado y completo de UML, habran dependencia, agregaciones o composiciones.

Tengo una duda relacionada con lo anterior, el siguiente codigo es parte del constructor de la clase ControlForm. Aqui se instancia la clase PersistenceManager, y esa es usada para obtener los objetos de la clase Categorias. Todo eso se hace en el constructor de la clase ControlForm.

Código java:
Ver original
  1. public ControlForm(Component parent) {
  2.  
  3. manager = new PersistenceManager();
  4. List<Categoria> categorias = manager.getCategorias();
  5. Categoria tmp = new Categoria();
  6.  
  7. }

Entiendo que la relacion que tiene ControlForm con PersistenceManager es una dependencia, y que Categorias tiene una relacion de agregacion, pero no se si es con el PersistenceManager, que se usa para obtener las categorias, o si ControlForm directamente.

Este es el metodo del PersistenceManager que obtiene las categorias.

Código java:
Ver original
  1. public List<Categoria> getCategorias() {
  2.  
  3.         CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
  4.         cq.select(cq.from(Categoria.class));
  5.         Query q = em.createQuery(cq);
  6.  
  7.         return q.getResultList();
  8. }
  #4 (permalink)  
Antiguo 08/11/2011, 08:34
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Diferencia dependencia y asociacion, UML

Hola:

No hay una relación clara y directa entre el tipo de asociación y cómo se codifica, cada lenguaje tiene sus trucos y UML pretende ser universal. El criterio que yo aplico, que creo que es más o menos estándar aunque como te digo no hay nada estandar, es lo siguiente:

Herencia: Está claro, class A extends B.

Composición: Una clase es atributo de la otra, se le hace new en el constructor y necesita estar ahí siempre. Por ejemplo, A está compuesta de B y C.

Código java:
Ver original
  1. public class A {
  2.    B b = new B();
  3.    C c;
  4.    public A () {
  5.       c = new C();
  6.    }
  7. }

es el caso de una ventana con un botón. El botón se crea junto a la ventana y está toda su vida ahí.

Agregación: Una clase es atributo de la otra, pero puede ser null o no instanciarse siquiera

Código java:
Ver original
  1. public class A {
  2.    B b = null;
  3.    C c;
  4.    public A () {
  5.       c = null;
  6.    }
  7.    public void otroMetodo(B unaB) {
  8.       b = unaB;
  9.       c = new C();
  10.    }
  11. }

La diferencia entre agregación y composición está mucho más clara en C++, donde se podría hacer así

Composición: B b; // Se declara la clase
Agregación: B *b; // Un puntero.

Dependencia: Una clase utiliza a otra, pero no como atributo. O bien se la pasan como parámetro de un método (y no loa guarda en ningún atibuto de la clase) , o bien la instancia como variable local de un método.

Código java:
Ver original
  1. public class A {
  2.    public void otroMetodo(B unaB) {
  3.       int a = unaB.unMetodo();
  4.       C c = new C();
  5.       a = c.otroMetodo();
  6.    }
  7. }

En tu caso, yo diría con ControlForm está "compuesto" por PersistenceManager (lo instancia en el constructor y se lo guarda como atributo de la clase) y depende de Category (lo usa, pero lo guarda en variables locales del constructor).

A su vez, ControlForm depende de Category (hasta donde se ve en el código), ya que lo usa pero no se lo guarda en ningún atributo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 08/11/2011, 09:21
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Diferencia dependencia y asociacion, UML

Muchisimas Gracias. Esto me aclaró las dudas que tenia.
  #6 (permalink)  
Antiguo 08/11/2011, 23:06
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Diferencia dependencia y asociacion, UML

Tengo otra pregunta, y creo k si estoy equivocado trabajaria como 800 veces menos.

Digamos que ControlForm tiene una composicion con PersistenceManager y dependencia de Categoria. Cuando yo vaya a conectar la clase Categoria, debo crear otra fecha que se conecte con ControlForm, y cuando vaya a conectar las clases relacionadas con PersistenceManager, debo conectarlo con una composicion con ControlForm?
  #7 (permalink)  
Antiguo 08/11/2011, 23:19
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Diferencia dependencia y asociacion, UML

Tengo un programa bastante grande para hacerle el diagrama UML, cualquier que pudiera aclararme esa tal vez tonta pero importante duda, se lo agradeceria.
  #8 (permalink)  
Antiguo 09/11/2011, 06:55
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Diferencia dependencia y asociacion, UML

Hola:

No debes perder el objetivo de UML. La idea no es plasmar en un diagrama UML exactamente todo lo que tienes en código, para eso está el código. En UML debes hacer varios diagramas (incluso del mismo tipo) de forma que en cada uno de ellos expliques a alguien algún aspecto concreto de tu código y sólo pongas lo necesario para explicar eso que quieres explicar. Debes siempre pensar qué quieres explicar y a qué tipo de persona (un desarrollador, un jefe de proyecto, un cliente, tu profesor) y en función de eso hacer el o los diagramas necesarios para explicar eso concreto a esa persona.

En tu caso, si reflejas todo

ControlForm composicion con PersistenceManager
ControlForm dependencia de Category
PersistenceManager dependencia de Category

pero como te digo, no suele tener mucho sentido reflejar TODAS las dependencias de TODAS las clases (salvo que seas el diseñador, alguien te lo vaya a codificar después y no quieras dejarle absolutamente nada a su imaginación). ¿Qué estás intentando explicar en el UML que tienes?

Si intentas reflejar un esquema de dependencias entre clases, no es necesario poner la dependencia de ControlForm con Category, ya que al depender (composición) ControlForm de PersistenceManager, depende indirectamente de todo lo que depende PersistenceManager, así que se puede sobreentender.

Si quieres hacer hincapié en que ControlForm trata con entidades tipo Category (porque las muestra en pantalla por ejemplo), entonces sí debes poner esa dependencia.

Se bueno
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 09/11/2011, 07:21
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Diferencia dependencia y asociacion, UML

Gracias de nuevo Chuidiang. Lo que intento hacer es un esquema de dependencias entre clases para el profesor. Ya veo que no necesito plasmar todas las dependencias indeirectas.
  #10 (permalink)  
Antiguo 09/11/2011, 12:07
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Diferencia dependencia y asociacion, UML

Ten cuidado

Ahí debes saber de qué pie cojea tu profe. Igual es un "detallista" y quiere que le pongas todas. Como te digo, no hay una forma 100% correcta de hacerlo, depende mucho de lo que se quiera expresar y del que lo vaya a leer.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #11 (permalink)  
Antiguo 11/07/2017, 22:39
 
Fecha de Ingreso: abril-2008
Mensajes: 1
Antigüedad: 16 años
Puntos: 0
Información Respuesta: Diferencia dependencia y asociacion, UML

Para explicar las diferencias voy a suponer que tengo dos clases A y B que poseen una relación de Dependencoa y también otra relación de Asociación.

Yo las diferencio basándome en los siguientes criterios

Definición

a) Dependencia (linea punteada con punta de flecha: Es una relación semántica entre dos clases, en la cual una utiliza el funcionamiento de la otra para realizar su tarea (ver patrón de diseño DELEGATE).

b) Asociación Bidireccional (linea continua sin punta de flecha): Es una relación estructural más fuerte que la dependencia. Relaciona a los objetos de forma bidireccional, creando una dependencia mutua entre ellos.

c) Asociación Unidireccional (linea continua con punta de flecha): igual que el anterior pero se establece una dependencia en un solo sentido


Acoplamiento

a) Dependencia: La clase A depende de la clase B, por lo que un cambio en la clase B podría afectar el funcionamiento de la clase A, no así a la inversa. A pesar de esto, se dice que es una dependencia débil, ya que el tiempo en el que los objetos de ambas clases están relacionados, sólo dura mientras se ejecuta el método en que el objeto A usa a B para realizar la tarea especifica.

b) Asociación Bidireccional: Ambas clases dependen de la otra, y por todo el tiempo de vida de sus objetos, por lo que esta relación tiene un acoplamiento mayor que la relación de dependencia.

c) Asociación Unidireccional: Los objetos de la clase A, que depende de los objetos de la clase B, está acoplados durante toda su vida, por lo que el acoplamiento es mayor al de la relación de dependencia y menor que la asociación bidireccional porque en este caso sólo una clase es dependiente.

Visibilidad

a)Dependencia: La clase A conoce a la clase B y puede llamar a sus métodos, la clase B en cambio no sabe de la existencia de la clase A

b) Asociación Bidireccional: ambas clases conocen a la otra y pueden llamar a sus métodos

c)Asociación Unidireccional: En este sentido igual a la dependencia.

Implementación (Tu respuesta)

a) dependencia: Se puede implementar de dos formas: La Clase A hace uso de la Clase B instanciándola directamente dentro de un método, o bien, recibiéndola como parámetro de entrada en uno de sus métodos. Ejemplo:

Instanciación dentro de un método

public void cualquierMetodo(){
ClaseA a = new ClaseA();
a.unMetodo();
}

Recibiendola como parámetro

public void cualquierMetodo(ClaseA a){
a.unMetodo();
}

b) Asociación Bidireccional: Tanto la clase A como la clase B incluyen entre sus atributos un objeto de la otra clase (Aquí es donde está la diferencia en el código), a diferencia de la dependencia en donde la clase B no forma parte de los atributos de la clase A. Ejemplo:

public class ClaseA {
private ClaseB b;
.....
}

public class ClaseB{
private ClaseA a;
.....
}

c) Asociación Unidireccional: Sólo la clase A incluye dentro de sus atributos a la clase B


IMPORTANTE: Nótese que en ningún caso he incluido colecciones de objetos, ya que en tal caso cuando la asociación posee multiplicidad 0..1...n a muchos pasamos a un caso especial de asociación que puede ser agregación, en el caso que el objeto contenido deba ser compartido por otros objetos (multiplicidad muchos a muchos) o que éste no sea necesario para la instanciación del objeto de la clase contenedora (multiplicidad 0 a muchos); o Composición cuando el objeto contenido sólo pueda pertenecer a un contenedor (1 a muchos) y sea requerido para crear al contenedor (1 a muchos)

Como puedes ver sí existen diferencias visibles en el código.

Casi se me olvida. También existen diferencias en como diseñar la base de datos dependiendo si es dependencia, asociación unidireccional, asociación bidireccional, agregación y composición. Te lo dejo como dato ya que ese es tema para otro post.

Última edición por Acertijo-007; 11/07/2017 a las 22:45 Razón: Añadir información

Etiquetas: dependencia, diferencia, uml
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 02:34.