Diferença entre associação e dependência?

90

Em um diagrama de classes UML, qual é a diferença entre um relacionamento de associação e um relacionamento de dependência?

Pelo que eu sei, uma associação é um relacionamento mais forte do que uma dependência, mas não tenho certeza de como é mais forte.

Qualquer exemplo seria mais do que bem-vindo :)

Charlie
fonte

Respostas:

50

Qual é a diferença entre dependência e associação? :

Em geral, você usa uma associação para representar algo como um campo em uma classe. O link está sempre aí, na medida em que pode sempre pedir uma encomenda para o seu cliente. Não precisa ser realmente um campo; se você estiver modelando de uma perspectiva mais de interface, pode apenas indicar a presença de um método que retornará o cliente do pedido.

Para citar a 3ª edição do UML Distilled (agora acabada de sair) "existe uma dependência entre dois elementos se alterações na definição de um elemento (o fornecedor) podem causar alterações no outro (o cliente)". Esse é um relacionamento muito vago e geral, razão pela qual a UML tem uma série de estereótipos para diferentes formas de dependência. Em termos de código, coisas como nomear um tipo de parâmetro e criar um objeto em uma variável temporária implicam em uma dependência.

...

Trigo mitch
fonte
6
Por que responder, quando Martin faz isso muito melhor para você ?! +1
Randolpho
5
Ainda não está claro para mim, mas uma coisa que entendi é que as dependências são um pouco "mais fracas" do que as associações. Parece que associações são um subconjunto de dependências, embora pelo menos em minha opinião, dependência seja uma palavra mais forte do que associação. Essa pode muito bem ter sido a fonte da confusão.
Felipe
Esse artigo diz isso bem. Na verdade, ele se alinha com meus pensamentos. Então, puxando alguns pontos disso aqui: (1) Você não quer mostrar todas as dependências em um diagrama UML - eles são muitos. Você precisa ser muito seletivo e mostrar apenas aqueles que são importantes para o que quer que esteja comunicando. (2) Se houver uma associação entre duas classes, também haverá uma dependência. A associação implica isso, assim como uma generalização. Tão óbvio para inferir dependência é um relacionamento de superconjunto de outros relacionamentos UML
Mahesha999,
1
Sua explicação está muito longe dos exemplos do mundo real, por isso não deu uma compreensão clara nem mesmo para os engenheiros de software.
softninja
@softninja: você quer dizer que não entendeu. Todo mundo parece achar isso aceitável. Ah, e obrigado pelo downvote.
Mitch Wheat
71

Uma associação quase sempre implica que um objeto tem o outro objeto como um campo / propriedade / atributo (a terminologia é diferente).

Uma dependência normalmente (mas nem sempre) implica que um objeto aceita outro objeto como parâmetro de método, instancia ou usa outro objeto. Uma dependência está muito implícita em uma associação .

Randolpho
fonte
Isso está mais próximo da maneira como geralmente decido a questão. Se a outra classe contribui de forma substantiva para o estado ou comportamento da minha classe, então é uma associação. Assim, as classes de estratégia serão associações mesmo que não tenham um estado interno próprio. Se a outra classe simplesmente fornece um serviço para minha classe, ela é uma dependência.
Terrível Tadpole
48

Em termos OOP:

Associação -> A tem um objeto C (como uma variável de membro)

Dependência -> A faz referência a B (como um parâmetro de método ou tipo de retorno)

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

Também há uma resposta mais detalhada .

Ahmad Abdelghany
fonte
1
@Naruto_Uzumaki A agregação é uma relação todo-parte. Uma lista de reprodução e música, por exemplo. Verifique minha outra resposta para uma diferenciação mais ampla entre Associação, Dependência e Agregação stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany
Do livro UML Distilled de Martin Fowler : "Com classes, existem dependências por vários motivos: uma classe envia uma mensagem para outra; uma classe tem outra como parte de seus dados; uma classe menciona outra como um parâmetro para uma operação"
Ahmad Abdelghany
24

Dependência é como quando você define um método que leva uma String (em Java, C #, já que a string é um objeto neles) como um parâmetro, então sua classe é dependente da classe String.

A associação é como quando você declara uma string como um atributo em sua classe. então seu código é associado à classe string.

String name = null //: is a association.
Shrikant Mali
fonte
"Associação é como quando você declara uma string como um atributo em sua classe. Então, seu código é associado à classe de string." Se for esse o caso, qual é a diferença entre associação e composição?
Dean P
16

Dependência - Uma mudança em uma classe afeta a mudança em sua classe dependente. Exemplo - o círculo depende da forma (uma interface). Se você alterar a Forma, isso afetará o Círculo também. Portanto, o Círculo depende da Forma.

Associação - significa que há uma certa relação entre 2 objetos

(um-um, um-muitos, muitos-muitos)

A associação é de 2 tipos

  1. Composição
  2. Agregação

    1) Composição - associação mais forte ou relacionamento entre 2 objetos. Você está criando um objeto de uma classe B dentro de outra classe A

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

Se excluirmos a classe A, B não existirá (o objeto B é criado apenas dentro de A).

Outro exemplo -Body & Liver .Liver não pode existir fora do corpo.

2) Agregação - tipo mais fraco de associação 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 */
              }
   }

Mesmo se você excluir a classe A, B existirá fora (B é criado fora e passado para a classe A)

Outro exemplo disso - Homem e Carro. O homem tem um carro, mas o homem e o carro existem independentemente.

Deen John
fonte
Dependency é o escopo local, onde Association é o escopo da classe.
dimpiax
10

Aqui: "Associação vs. Dependência vs. Agregação vs. Composição" , você tem um grande vade mecum com diagramas de classes e trechos de código uml. O autor nos dá uma lista de relacionamentos: Associação, Dependência, Agregação, Composição em um só lugar.

Raf
fonte
1
Eu gosto dessa definição. Associação é: Eu (a classe que faz referência a outra classe) apenas mantenho uma referência a um objeto, não o uso e os membros dessa classe não são interessantes para mim. A dependência é: eu uso alguns membros, então se a classe referenciada mudar, isso pode ter um impacto sobre mim. Se eu entendesse direito, então seria fácil de entender!
roubo de
1
Primeira pergunta que me veio à mente quando li seu comentário: no caso de associação - por que alguém manteria uma referência a um objeto e não a utilizaria? Quer dizer que a referência é apenas um campo, apenas para ser retornado se um cliente quiser saber sobre a referência?
H.Rabiee
3

Uma dependência é muito geral e diminuir a complexidade significa diminuir as dependências o máximo possível.

Uma associação é uma dependência forte (estática). Agregação e composição são ainda mais fortes.

Programmernovice
fonte
-1

Associação é quando um objeto tem apenas um link para outro e não usa métodos de objetos relacionais. Para rubi por exemplo

class User
  has_one :profile
end

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

Isso significa que você pode obter um objeto de perfil do usuário, mas o usuário não usa os métodos do perfil dentro de si (não depende da interface de um Perfil).

Dependência significa que o usuário tem um link para outro objeto e chama os métodos desse objeto dentro de si

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Aqui, se o método de informação do Perfil for alterado ou renomeado, nossa classe de Usuário Dependente também precisa ser alterada.

Stopanko
fonte
Você pode indicar de onde você obteve essas informações? Não acho que haja uma regra nas especificações da UML que diga que um lado de uma associação não usa os métodos do outro lado. Em geral, uma associação é um relacionamento mais forte do que uma dependência.
Geert Bellekens
@GeertBellekens Pelo que entendi, a Dependência precisa mostrar que as alterações em uma classe de fornecedor exigirão alterações em uma classe de cliente. Na programação isso ocorre apenas quando você está usando uma interface de fornecedor (ou Mostre-me outro motivo). Do seu ponto de vista, não há diferença nessas setas. Eles não estão apontando para a implementação do código, apenas conceituais.
stopanko
Receio que esse seja o seu entendimento pessoal, mas não como é descrito nas especificações UML. Da UML 2.5 § 7.8.4.1: Uma Dependência é um Relacionamento que significa que um único Elemento do modelo ou um conjunto de Elementos do modelo requer outros Elementos do modelo para sua especificação ou implementação. Isso significa que a semântica completa de clientElement (s) é semanticamente ou estruturalmente dependente da definição do (s) elemento (s) fornecedor (es).
Geert Bellekens