O que é a dissociação e a quais áreas de desenvolvimento ele pode se aplicar? [fechadas]


21

Recentemente, notei a dissociação como tópico em uma pergunta e quero saber o que é e onde pode ser aplicado.

Por "onde pode ser aplicado", quero dizer:

É relevante apenas onde linguagens compiladas como C e Java estão envolvidas?

Devo conhecer / estudar como desenvolvedor da web?


Ajudaria se você fizesse uma pequena pesquisa e fizesse uma pergunta com base em partes não claras da definição.
JeffO

2
@JeffO - Eu acho que o mundo se beneficia tanto de questões conceituais completas quanto de nuances específicas. "Por que o céu é azul?" permite respostas para cobrir o próprio conceito sem entrar em detalhes extremos sobre os detalhes. Por isso fui em frente e fiz minha pergunta sem pesquisa.

Qual é o problema específico que você está tendo? Como está agora, sua pergunta é muito ampla. Nesta forma atual, a resposta é essencialmente o texto inteiro de Projeto Estruturado: Fundamentos de uma Disciplina de Projeto de Programas e Sistemas de Computador por Edward Yourdon e Larry Constantine .
Jörg W Mittag

Eu acho que as respostas aqui fazem um trabalho perfeito para descrever o conceito. É como perguntar "Qual é a definição dessa palavra em relação à programação" - Como é então muito ampla? @ GlenH7

1
@ jt0dd eu teria que concordar. Só porque você pode explicar algo com um livro, não significa que não há valor em uma resposta mais sucinta. Com a literatura de programação, as pessoas frequentemente o enchem de detalhes antes de fornecer uma visão geral decente de nível superior. "O que é OOP?" seria muito amplo. Mas este é um tópico IMO razoavelmente específico.
Erik Reppen

Respostas:


57

'Coupling' é um termo que descreve o relacionamento entre duas entidades em um sistema de software (geralmente classes).

Quando uma classe usa outra classe ou se comunica com ela, diz-se que "depende" dessa outra classe e, portanto, essas classes são "acopladas". Pelo menos um deles 'sabe' sobre o outro.

A idéia é que devemos tentar manter o acoplamento entre as classes em nossos sistemas o mais "frouxo" possível: portanto, "frouxo" ou, às vezes, "desacoplamento" (embora em inglês "desacoplamento" significasse "nenhum acoplamento", as pessoas use-o frequentemente para implicar um 'acoplamento flexível' entre entidades).

Então: o que é acoplamento flexível versus acoplamento forte na prática, e por que devemos tornar as entidades acopladas livremente?


O acoplamento descreve o grau de dependência entre uma entidade e outra. Frequentemente classes ou objetos.

Quando a classe A depende muito da classe B, as chances de a classe A ser afetada quando a classe B é alterada são altas. Este é um acoplamento forte.

No entanto, se a ClassA depende ligeiramente da ClassB, as chances de a ClassA ser afetada de alguma forma por uma alteração no código da ClassB são baixas. Isso é um acoplamento frouxo ou um relacionamento "desacoplado".

O acoplamento frouxo é bom porque não queremos que os componentes do nosso sistema dependam fortemente um do outro. Queremos manter nosso sistema modular, onde podemos alterar com segurança uma parte sem afetar a outra.

Quando duas partes são fracamente acopladas, elas são mais independentes uma da outra e têm menos probabilidade de quebrar quando a outra muda.

Por exemplo, ao construir um carro, você não deseja que uma mudança interna no motor quebre algo no volante.

Embora isso nunca aconteça por acidente na construção de um carro, coisas semelhantes acontecem com os programadores o tempo todo. O acoplamento frouxo visa reduzir o risco de tais coisas acontecerem.

Acoplamento forte geralmente ocorre quando a entidade A sabe muito sobre entidade B. Se a entidade A faz muitas suposições sobre como entidade B opera ou como ele é construído, do que há um alto risco de que uma mudança na entidade B afetará entidade A. Este é porque uma de suas suposições sobre a entidade B agora está incorreta.

Por exemplo, imagine que, como motorista, você faça algumas suposições sobre como o motor do seu carro funciona.

No dia em que você compra um carro novo com um motor que funciona de maneira diferente (ou por algum motivo, seu motor foi substituído), suas suposições anteriores estavam incorretas. Se você fosse um código em um computador, agora seria um código incorreto que não funciona corretamente.

No entanto, se todas as suposições que você, como motorista, fez sobre os carros são: A- eles têm volantes e B- eles têm pedais de freio e acelerador, as mudanças no carro não afetam você, desde que suas poucas suposições fique correto. Este é um acoplamento frouxo.


Uma técnica importante para obter acoplamentos soltos é o encapsulamento. A idéia é que uma classe oculte seus detalhes internos de outras classes e ofereça uma interface estritamente definida para que outras classes se comuniquem com ela.

Assim, por exemplo, se você estivesse definindo uma classe de carro, sua interface (métodos públicos) seria provavelmente drive(), stop(), steerLeft(), steerRight(), getSpeed(). Esses são os métodos que outros objetos podem invocar nos objetos Car.

Todos os outros detalhes da classe Car: como o motor funciona, tipo de combustível usado etc. estão ocultos de outras classes - para impedir que eles saibam muito sobre o Car.

No momento em que a classe A sabe muito sobre a classe B: temos um relacionamento fortemente associado, em que a classe A é muito dependente da classe B e uma mudança na classe B provavelmente afeta a classe A. Tornando o sistema difícil de expandir e manter.

Um relacionamento entre duas entidades, onde eles sabem pouco um do outro (apenas o necessário) - é um relacionamento fracamente acoplado ou dissociado.


3

A dissociação geralmente significa verificar se duas coisas precisam ou não trabalhar juntas ou se podem ser independentes. A independência é ótima porque facilita a mudança ou o uso dessas coisas em outro lugar. A dissociação pode ser aplicada em muitas áreas, não apenas no desenvolvimento, e isso é especialmente verdadeiro para a dissociação temporal, que pode até ser aplicada em sua vida diária (até certo ponto). Além disso, há muitos tipos de acoplamentos no desenvolvimento de software a serem considerados, e nem todos serão abordados na resposta. Você terá que fazer sua pesquisa.

Duas coisas, A e B , são acopladas se houver uma dependência entre elas. Se A depende de B, você pode usar B sem levar em consideração A. Se você deseja usar A, também precisará transportar B, pois A depende disso.

No desenvolvimento de software, geralmente, você não pode remover completamente o acoplamento entre os componentes. Desacoplar nesse contexto normalmente significa afrouxar o acoplamento existente. Ou seja, garantir que cada componente saiba o mínimo possível sobre os outros componentes ao seu redor.

Este é provavelmente o tipo mais comum de acoplamento encontrado na natureza:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

Aqui, o DisplayFriends opera desnecessariamente manualmente com a conexão por trás do cliente do Facebook para obter o que ele precisa. DisplayFriendsA classe de é acoplada a ambos FacebookCliente Connection. Se o FacebookClient mudar repentinamente o tipo de conexão que ele usa, o aplicativo não poderá mais receber os amigos do Facebook. Podemos remover o acoplamento entre a classe DisplayFriends e o Connection solicitando ao FacebookClient que forneça o que precisamos para nós.

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

Agora realmente não nos importamos como o FacebookClient consegue nossos amigos. Nós realmente nos preocupamos com o fato de que eles os recebem. Qualquer mudança introduzida em seu comportamento interno não prejudicará nossa própria classe.

Esse tipo de dissociação pode ser facilmente alcançado seguindo a Lei de Demeter para funções, que diz (citando a Wikipedia):

A Lei de Demeter para funções exige que um método m de um objeto O possa invocar apenas os métodos dos seguintes tipos de objetos:

  • O próprio
  • parâmetros de m
  • Quaisquer objetos criados / instanciados dentro de m
  • Objetos de componentes diretos de O
  • Uma variável global, acessível por O, no escopo de m

Desde que mencionei o acoplamento temporal no início da resposta, vou descrevê-lo em breve.

O acoplamento temporal é normalmente considerado ao projetar aplicativos que executam algoritmos em paralelo. Considere duas unidades executáveis ​​(sejam elas instruções reais, métodos ou o que você deseja que uma unidade seja), A e B. Dizemos que A é acoplado temporalmente a B se B deve ser executado antes de A ser executado. Se A não estiver temporalmente acoplado a B, A e B podem ser executados ao mesmo tempo. Crie seu próprio exemplo para este: pense nas coisas comuns que você faz em sua vida diária. Existem duas coisas que você faz uma após a outra, mas você pode fazer ao mesmo tempo?

Por fim, para responder seu último bit:

Devo conhecer / estudar como desenvolvedor da web?

Sim. Por exemplo, um dos padrões de design mais populares para desenvolvimento da Web (MVC) é sobre dissociação.


1

As outras respostas descrevem bem o que é a dissociação. Eu queria discutir sua pergunta final.

Devo conhecer / estudar como desenvolvedor da web?

A resposta é um sim enfático. Não importa que tipo de desenvolvedor você seja. Você pode ser um desenvolvedor da Web ou desenvolvedor de sistemas embarcados.

Digamos que você tenha uma classe que gera URLs personalizados que são colocados em sua página da web. Você pode ficar tentado a pedir que a classe grave os URLs diretamente na página, colocando-os no href de uma tag. Isso pode parecer mais simples a princípio. Mas o que acontece quando você precisa fazer uma alteração para colocar os links em um email e enviá-los para um usuário? Seu código atual não funcionaria porque seu gerador de URL está fortemente acoplado à estrutura da web que você está usando.

A melhor opção seria ter uma classe de gerador de URL que retorne o URL como uma string. Isso pode ser usado pelo seu código da web e também pelo seu código de e-mail. Pode parecer mais trabalho adiantado separar o código, mas o esforço se paga com o tempo.

Ter um código modularizado e dissociado tornará seu código mais compreensível, mais testável e mais sustentável, independentemente do domínio de programação em que você esteja trabalhando.


Depois desta e das outras duas respostas, eu realmente entendo isso e vejo como posso usá-lo.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.