Disclaimer
Este texto foi inicialmente concebido pela IA Generativa em função da transcrição do episódio do nosso canal, Dev Eficiente. O episódio completo pode ser visto no canal.
Introdução
Hoje vamos sobre um tipo específico de acoplamento no código, o que eu chamo de acoplamento mental. Esse tipo de acoplamento não é tão explícito quanto outros, mas pode ser até mais prejudicial.
O Que é Acoplamento Mental?
O acoplamento mental ocorre quando a implementação de um método assume implicitamente que o ponto de chamada sabe como utilizar o retorno desse método.
class DadosBusca {
public Optional<String> getMetaInformacoes() {
if (this.metaInformacoes.size() > 0 ) {
return Optional.of(String.join(" ", this.metaInformacoes));
}
return Optional.empty();
}
}
class Busca {
public SearchPage<Documento> busca(DadosBusca dadosBusca) {
...
dadosBusca
.getMetaInformacoes()
.ifPresent(
metaInfo ->
qb.must(QueryBuilders.multiMatchQuery(metaInfo, "meta-informacoes.*").fuzziness(AUTO)));
}
}
No exemplo acima, o código do método busca usa diretamente o retorno do método getMetaInformacoes. A pergunta que fica é: Como este ponto sabe que o retorno é uma String separada por espaço ? É um detalhe de implementação.
Existe uma boa chance de alguém ter olhado o código lá dentro e implementado a chamada assumindo que o retorno vai ser sempre deste jeito. É isso que eu chamo de Acoplamento Mental.
Isso cria uma dependência não documentada e difícil de identificar, pois está baseada no entendimento tácito da pessoa desenvolvedora.
Problemas com Acoplamento Mental
Esse tipo de acoplamento é problemático porque:
Dificuldade de Manutenção: Se outra pessoa dev precisar modificar o método ou o ponto de chamada, ele pode não entender essa dependência implícita, causando bugs.
Falta de Clareza: O código não deixa claro quais são as premissas necessárias para que ele funcione corretamente.
Fragilidade: Pequenas mudanças podem quebrar o código de maneiras inesperadas.
Como Evitar o Acoplamento Mental
Para evitar o acoplamento mental, é importante tornar explícitas as dependências e premissas do código. Uma maneira de fazer isso é através de uma boa documentação e de APIs claras que não deixem margem para dúvidas sobre como os métodos devem ser utilizados.
Por exemplo, em vez de retornar uma string delimitada por espaços, você poderia retornar uma lista de strings e deixar claro no nome do método e na documentação como essa lista deve ser utilizada.
class DadosBusca {
//versao 1: Deixa mais nítido a operação que está sendo facilitada
public Optional<String> joinMetaInformacoes(String delimitador) {
if (this.metaInformacoes.size() > 0 ) {
return Optional.of(String.join(delimitador, this.metaInformacoes));
}
return Optional.empty();
}
//versao 2: Simplesmente retorna a lista e deixa o trabalho de formatar para o ponto chamador
public List<String> getMetaInformacoes() {
return this.metaInformacoes;
}
}
class Busca {
public SearchPage<Documento> busca(DadosBusca dadosBusca) {
...
dadosBusca
.joinMetaInformacoes(" ")
.ifPresent(
metaInformacoes ->
qb.must(QueryBuilders.multiMatchQuery(metaInformacoes, "meta-informacoes.*")));
}
}
Conclusão
O acoplamento mental é um problema sutil, mas que pode ter grandes impactos na manutenibilidade e clareza do código. Ao tornar explícitas as dependências e premissas, você facilita a vida de outras pessoas devs e melhora a qualidade do seu código.
Vamos falar mais ?
Se você gostou, deixa um comentário aqui. Tem um comentário construtivo? Deixa aqui também, com educação. Vamos trocar mais ideias :).
Conheça mais sobre a Jornada Dev + Eficiente
A Jornada Dev + Eficiente é um treinamento cujo objetivo é fazer com que você cresça na carreira como uma pessoa especialista em Design e Arquitetura de Software.
Para saber mais, acesse em https://deveficiente.com
Top comments (0)