¿Diferencia entre asociación y dependencia?

91

En un diagrama de clases UML, ¿cuál es la diferencia entre una relación de asociación y una relación de dependencia?

Por lo que sé, una asociación es una relación más fuerte que una dependencia, pero no estoy seguro de cómo es más fuerte.

Cualquier ejemplo sería más que bienvenido :)

Charlie
fuente

Respuestas:

50

¿Cuál es la diferencia entre dependencia y asociación? :

En general, usa una asociación para representar algo así como un campo en una clase. El enlace siempre está ahí, en el sentido de que siempre puede solicitar un pedido para su cliente. En realidad, no es necesario que sea un campo, si está modelando desde una perspectiva más de interfaz, solo puede indicar la presencia de un método que devolverá al cliente del pedido.

Para citar la 3ª edición de UML Distilled (que acaba de publicarse) "existe una dependencia entre dos elementos si los cambios en la definición de un elemento (el proveedor) pueden provocar cambios en el otro (el cliente)". Esta es una relación muy vaga y general, razón por la cual UML tiene una serie de estereotipos para diferentes formas de dependencia. En términos de código, cosas como nombrar un tipo de parámetro y crear un objeto en una variable temporal implican una dependencia.

...

Trigo Mitch
fuente
6
¿Por qué responder, cuando Martin lo hace mucho mejor para ti? +1
Randolpho
5
No está claro para mí todavía, pero una cosa que sí entendí es que las dependencias son algo 'más débiles' que las asociaciones. Parece que las asociaciones son un subconjunto de dependencias, aunque en mi opinión al menos, la dependencia es una palabra más fuerte que la asociación. Eso bien puede haber sido la fuente de la confusión.
Felipe
Ese artículo lo dice bien. De hecho, se alinea con mis pensamientos. Entonces, extrayendo algunos puntos aquí: (1) No desea mostrar todas las dependencias en un diagrama UML, hay demasiadas. Debe ser muy selectivo y mostrar solo aquellos que son importantes para lo que sea que esté comunicando. (2) Si existe una asociación entre dos clases, también existe una dependencia. La asociación lo implica, al igual que una generalización. Es tan obvio inferir que la dependencia es una relación un tanto superconjunto de otras relaciones UML
Mahesha999
1
Su explicación está demasiado lejos de los ejemplos del mundo real, por lo que no dio una comprensión clara ni siquiera a los ingenieros de software.
softninja
@ softninja: quieres decir que no entendiste. Todos los demás parecen encontrarlo aceptable. Ah, y gracias por el voto negativo.
Mitch Wheat
74

Una asociación casi siempre implica que un objeto tiene el otro objeto como campo / propiedad / atributo (la terminología difiere).

Una dependencia normalmente (pero no siempre) implica que un objeto acepta otro objeto como parámetro de método, crea instancias o usa otro objeto. Una dependencia está muy implícita en una asociación .

Randolpho
fuente
Esto es lo más cercano a la forma en que generalmente decido el problema. Si la otra clase contribuye de manera sustancial al estado o comportamiento de mi clase, entonces es una asociación. Por lo tanto, las clases de estrategia serán asociaciones incluso si no tienen un estado interno propio. Si la otra clase simplemente proporciona un servicio a mi clase, entonces es una dependencia.
Terrible Tadpole
49

En términos OOP:

Asociación -> A tiene un objeto C (como variable miembro)

Dependencia -> A hace referencia a B (como parámetro de método o tipo de retorno)

public class A {
    private C c;
    public void myMethod(B b) {
        b.callMethod();
    }
}

También hay una respuesta más detallada .

Ahmad Abdelghany
fuente
1
@Naruto_Uzumaki La agregación es una relación de partes enteras. Una lista de reproducción y una canción, por ejemplo. Consulte mi otra respuesta para obtener una diferenciación más amplia entre Asociación, Dependencia y Agregación stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany
Del libro UML Distilled de Martin Fowler : "Con las clases, las dependencias existen por varias razones: una clase envía un mensaje a otra; una clase tiene a otra como parte de sus datos; una clase menciona a otra como parámetro de una operación"
Ahmad Abdelghany
24

La dependencia es como cuando define un método que toma un String (en Java, C #, ya que el string es un objeto en ellos) como parámetro, entonces su clase depende de la clase String.

La asociación es como cuando declaras una cadena como atributo en tu clase. entonces su código está asociado con la clase de cadena.

String name = null //: is a association.
Shrikant Mali
fuente
"La asociación es como cuando declaras una cadena como un atributo en tu clase. Entonces tu código está asociado con la clase de cadena". Si ese es el caso, ¿cuál es la diferencia entre asociación y composición?
Dean P
16

Dependencia : un cambio en una clase afecta el cambio en su clase dependiente. Ejemplo: el círculo depende de Shape (una interfaz). Si cambia de forma, también afectará al círculo. Entonces, Circle tiene una dependencia de Shape.

Asociación : significa que existe una cierta relación entre 2 objetos

(uno-uno, uno-muchos, muchos-muchos)

La asociación es de 2 tipos-

  1. Composición
  2. Agregación

    1) Composición - Asociación o relación más fuerte entre 2 objetos. Estás creando un objeto de una clase B dentro de otra clase A

 public class A {
       B b;
       public void setB(){
         this.b= new B();
        }
     }

Si eliminamos la clase A, B no existirá (el objeto B se crea solo dentro de A).

Otro ejemplo: Body & Liver. El hígado no puede existir fuera del cuerpo.

2) Agregación : tipo de asociación más débil entre 2 objetos.

public class A {       
             B b;
             public void setB(B b_ref){
                 this.b= b_ref;   
                /* object B is passed as an argument of a method */
              }
   }

Incluso si elimina la clase A, B existirá afuera (B se crea afuera y se pasa a la Clase A)

Otro ejemplo de esto: Man & Car. El hombre tiene un coche, pero el hombre y el coche existen de forma independiente.

Deen John
fuente
La dependencia es el ámbito local, donde Asociación es el ámbito de la clase.
dimpiax
10

Aquí: "Asociación vs. Dependencia vs. Agregación vs. Composición" , tiene un gran vademécum con diagramas de clases uml y fragmentos de código. El autor nos da una lista de relaciones: Asociación, Dependencia, Agregación, Composición en un solo lugar.

Raf
fuente
1
Me gusta esta definición. La asociación es: yo (la clase que hace referencia a otra clase) solo tengo una referencia a un objeto, no la uso y los miembros de esa clase no me interesan. La dependencia es: uso algunos miembros, por lo que si la clase a la que se hace referencia cambia, podría tener un impacto en mí. ¡Si lo hice bien, entonces fue fácil de entender!
Robsch
1
Primera pregunta que me vino a la mente cuando leí su comentario: en el caso de la asociación, ¿por qué uno debe tener una referencia a un objeto y no usarlo? ¿Quiere decir que la referencia es solo un campo, solo para ser devuelto si un cliente quiere saber sobre la referencia?
H.Rabiee
3

Una dependencia es muy general y reducir la complejidad se trata de reducir las dependencias tanto como sea posible.

Una asociación es una dependencia fuerte (estática). La agregación y la composición son aún más fuertes.

programador
fuente
-1

La asociación es cuando un objeto solo tiene un enlace a otro y no usa métodos de objetos relacionales. Para rubí por ejemplo

class User
  has_one :profile
end

user = User.first
profile = user.profile
profile.sign_out

Significa que puede obtener un objeto de perfil del usuario, pero el usuario no usa los métodos del perfil dentro de sí mismo (no depende de la interfaz de un perfil).

Dependencia significa que el usuario tiene un enlace a otro objeto y llama a los métodos de ese objeto dentro de sí mismo

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Aquí, si el método de información del perfil se cambiará o cambiará el nombre, nuestra clase de usuario dependiente también debe cambiarse.

Stopanko
fuente
¿Puede indicar de dónde obtuvo esta información? No creo que haya una regla en las especificaciones de UML que diga que un lado de una asociación no usa los métodos del otro lado. En general, una asociación es una relación más fuerte que una dependencia.
Geert Bellekens
@GeertBellekens Según tengo entendido, la dependencia debe mostrar que los cambios en una clase de proveedor requerirán cambios en una clase de cliente. En la programación, esto es solo cuando está utilizando una interfaz de proveedor (o Muéstrame otra razón). Desde su punto de vista, no hay diferencia en estas flechas. No apuntan a la implementación del código y solo son conceptuales.
Stopanko
Me temo que es su comprensión personal, pero no cómo se describe en las especificaciones de UML. De UML 2.5 § 7.8.4.1: Una dependencia es una relación que significa que un solo Elemento del modelo o un conjunto de Elementos del modelo requiere otros Elementos del modelo para su especificación o implementación. Esto significa que la semántica completa de los elementos de cliente depende semántica o estructuralmente de la definición de los elementos del proveedor.
Geert Bellekens