Arquitetura de software · parte 3 de 6
Programação orientada a interfaces
Como depender de interfaces em vez de implementações concretas, o que isso ganha em testes e troca de componentes, e quando não vale a pena.
Publicada em · 2 min de leitura
A Programação Orientada a Interfaces é um princípio que complementa e fortalece a Inversão de Dependência. Em vez de escrever código que dependa diretamente de implementações concretas, esse estilo de programação incentiva o desenvolvedor a programar para interfaces — ou seja, criar sistemas que dependem de comportamentos esperados (métodos definidos em interfaces), e não de estruturas específicas.
Esse tipo de abordagem tem um impacto direto na modularidade do código. Quando você define que uma função ou serviço depende de uma interface, você está deixando claro que qualquer implementação que satisfaça aquele contrato pode ser usada ali. Isso é incrivelmente poderoso para testes, por exemplo. Se um serviço depende da interface UserRepository, é possível criar uma implementação falsa (mock ou stub) dessa interface e simular diversos cenários sem precisar acessar o banco de dados real.
Além disso, a Programação Orientada a Interfaces promove um acoplamento fraco entre os componentes do sistema. Isso significa que as partes do código podem evoluir de forma mais independente. Você pode refatorar, trocar ou remover uma implementação concreta sem impactar o restante da aplicação — contanto que a nova implementação continue respeitando a interface definida.
No contexto de Go, isso se encaixa perfeitamente com a natureza da linguagem, já que Go adota interfaces implícitas. Isso significa que qualquer struct que possua os métodos esperados por uma interface automaticamente a implementa — sem precisar declarar explicitamente. Essa característica reduz a fricção e incentiva um design mais limpo e coeso.