"Uma interface é um contrato. E contrato que não se cumpre, está quebrado."
Introdução
Muito se fala que devemos "programar para a interface, e não para a implementação". O problema não está apenas na frase, mas na forma como ela é ensinada, repetida, distorcida e aplicada. É uma frase mal formulada, gramaticalmente ambígua e conceitualmente frágil.
O problema da interface genérica
Quando você declara uma variável como IExportador, mas só chama ExportarParaPDF, você está dizendo:
"Preciso de todo esse contrato, mas na verdade, só uso um pedaço."
Se você chama apenas 1 dos 5 métodos da interface, então você não está cumprindo o contrato, está apenas usando um ponto de acesso formal para esconder uma dependência real e direta.
Uma interface é útil quando todos os seus métodos fazem sentido em todos os lugares onde ela é consumida. Caso contrário, é um artefato burocrático.
A falsa obrigação de implementar
A maioria acredita que o "contrato" da interface existe para obrigar o implementador a fazer tudo. Mas a obrigação real deveria ser o inverso:
O consumidor da interface deveria usar tudo que ela oferece.
Se não usar, o contrato está quebrado. O acoplamento é real. A abstração é falsa.
A metáfora gramatical
Quando dizemos "programe para a interface", quem programa? E quem implementa?
A frase tem um sujeito oculto e um objeto ambíguo. Parece que existem dois mundos separados:
- Um mundo onde tudo é ideal, onde a interface vive.
- E outro mundo subterrâneo onde os plebeus escrevem implementações reais.
Isso leva ao culto da interface como entidade autossuficiente, o que é um erro.
O paradoxo da classe pequena
Se você tem uma classe com só dois métodos, por que criar uma interface? Para permitir trocá-la? Por quê? Se só há um consumidor e uma implementação, você está adicionando camadas e abstrações que nunca trarão retorno.
O argumento é: "e se um dia precisar trocar?" Mas a resposta correta é: "e se nunca precisar?" Porque a conta de manter a interface já chegou.
Interface boa tem uso pleno
- Se você consome 100% do que a interface expõe em todos os contextos.
- Se você tem múltiplas implementações reais e distintas.
- Se você compartilha a interface entre várias partes do sistema.
Aí sim, a interface faz sentido. Fora isso, é enfeite.
Conclusão
Uma interface não é apenas uma promessa de comportamento. É uma declaração de dependência mútua, onde quem consome espera tudo, e quem implementa entrega tudo.
Se você usa só uma parte do contrato, você está acoplado a um todo desnecessário. Está enganando o compilador. Está escrevendo código que parece flexível, mas é só barulhento.
Se você não usa tudo, o contrato está quebrado. E ninguém deveria assinar um contrato para usar só um parágrafo.