[Conceito] - Acoplamento
Published: 2022-03-31 13:52:38

> Conteúdo original [nessa thread to twitter](https://twitter.com/zanfranceschi/status/1504516518264164360).

---

Queria trocar uma ideia com vcs sobre acoplamento. E não é aquele lance de "baixo acoplamento/alta coesão" não, tá?

Qual é a primeira coisa que vc pensa quando fala em acoplamento? Que é bom? Que é besteira? Complexo? Sabe explicar sua resposta?

cc @sseraphini
 
🧵👇

![Acoplamento](https://pbs.twimg.com/media/FOEJCiJXIAIlsBT?format=jpg&name=medium)

---

"Desacoplar" é diminuir o acoplamento via indireção. Desacoplar totalmente significa mudar o objetivo do funcionamento sistêmico significativamente.

Exemplos:

você -> garçon <-> cozinheiro (o garçon é a indireção para vc ter sua comida)

você -> balcão <- atendente

etc.

![Desacoplamento](https://pbs.twimg.com/media/FOEJ_glWYAAD6yt?format=png&name=large)

---

Galera de desenvolvimento conhece o lance de desacoplar com interfaces, né? Bem comum.

"Dependa duma interface e não de sua implementação concreta". Acho bem justo na maioria das vezes.

![Desacoplamento](https://pbs.twimg.com/media/FOELkYEXwAEQzGu?format=png&name=4096x4096)

---

O conceito de indireção também é usado pra além de código. Aplicações e sistemas também podem se beneficiar disso.

Um exemplo clássico são os antigos barramentos de serviços na época em que SOA era moda.

![Desacoplamento](https://pbs.twimg.com/media/FOER9zsX0AEMJ7L?format=png&name=4096x4096)

---

[agora é a parte legal!]

Existem algumas categorias de acoplamento e queria falar de duas, principalmente acoplamento entre aplicações e sistemas:

- Acoplamento Espacial 🗺️
  (eu falo localidade, mas acho que é errado)

- Acoplamento Temporal 🕙

[guenta aí]

---

Algo Acoplado Espacialmente significa conhecer o endereço, que espaço está ocupando, a localização da nossa dependência. Uma URL, uma connection string de banco, um caminho de um diretório, etc.

---

"Ah, mas num barramento vc precisa saber o endereço do barramento." Sim! Mas o nosso alvo mesmo – nossa dependência funcional – está "atrás" do barramento.

Existem as peças que consideramos estáveis, com poucas mudanças numa arquitetura. Um barramento é uma delas.

---

Num cenário mais trivial, a chance de uma API mudar de endereço é maior do que um barramento mudar de endereço. Por isso consideramos o barramento a parte estável da solução.

De boa?

---

Agora sobre o acoplamento temporal. Estar acoplado temporalmente, significa que a nossa dependência precisa estar disponível na hora (ao mesmo tempo) em que precisarmos dela. Isso tem uma relação quase que direta com ser síncrono (oposto de assíncrono).

---

Um barramento de serviços resolve o acoplamento espacial, mas não o temporal. Uma API que esteja atrás dele, precisa estar disponível no momento em que você a chamar.

![Desacoplamento](https://pbs.twimg.com/media/FOERcPLXoAQ5RJX?format=png&name=4096x4096)

---

Um jeito bastante usado hoje pra resolver o acoplamento temporal são sistemas de mensagens (kafka, rabbitmq, activemq, ibm mq, aws sqs/sns, etc.). Integrações via arquivos/diretórios também entram nessa categoria.

Essas soluções também resolvem o acoplamento espacial.

![Desacoplamento](https://pbs.twimg.com/media/FOETVnjWQAAlHn8?format=png&name=4096x4096)

---

"Devo tentar desacoplar tudo?!" Não, de forma alguma. Desacoplamento introduz complexidade, maior número de peças na solução, latência, etc. Não existe uma resposta certa pra quando desacoplar.

Desacoplar temporalmente também pode mudar a experiência de quem usa seu sistema.

---

Mas digo uma coisa: sistemas assíncronos são os que escalam de verdade, viu?

Se chegou aqui, toma aqui ó: 🤍