Você programa orientado a interfaces? Saiba porque deveria, e seu sistemas dependem disso!
É isso ai que você leu, nossos sistemas dependem das interfaces! Bom se você não programa orientado a interfaces, parabéns! Eu também não. Mas estou trabalhando arduamente para isso não seja mais verdade.
Estou em uma fase da minha carreira onde preciso aprender a usar interfaces, pois estou realizando uma migração muito complexa de uma aplicação MVC SpringBoot, para uma Arquitetura Limpa, focado em desacoplamento de código, e pasmem! É o principal conceito usado: programe orientado a interfaces.
Sinceramente, eu nunca entendi isso, e nunca entendi para o que serviam as interfaces, sempre achei estranho ter um arquivo, que só tem a assinatura dos métodos, cade a implementação? O código dentro das chaves??? Simplesmente não existe! e não se preocupe, não irei usar termos complexos para explicar sobre porque as classes são importantes, mas sim, compartilharei da linha de racícionio que usei, para um exemplo prático que me deparei hoje.
O problema
No sistema que estou trabalhando, preciso buscar de uma API todos os estados e cidades a partir de um país (estou usando a zipcodebase.com para essa busca), e pensei "preciso escrever a classe de serviço que irá buscar esse dado", e fiquei pensando na melhor forma para realizar isso, sem criar uma dependência direta do meu código para esse serviço externo que sofre vários riscos: pode ser descontinuado, deixar de existir e entre várias outras coisas.
Um pouco de contexto
Estava vindo de uma frustrada saga sobre: como aplicar arquitetura limpa, e simplesmente não estava entrando na minha cabeça.
A solução
Logo após pensar um pouco (no chuveiro, durante a caminhada voltando da acadêmia), tive o insight "deveria usar uma interface", e por que uma interface? Com a interface, eu defino exatamente o que espero receber e usando injeção de depêndencia, minha linguagem de programação fica responsável por trazer a implementação atual para aquilo! Assim, quando eu precisar trocar esse serviço de busca de estados e cidades para um outro, só preciso trocar a implementação e não mudar todo o meu sistema, e o nome técnico para isso é: diminuição do acoplamento.
Outros cenários
Esse caso é simples, mas pense num disparo de email, onde eu preciso em várias partes do sistema enviar emails para as diversas situações, imagine ter que refatorar todas as implementações feitas, porque o serviço de email mudou!!! Caótico.
um Pouco de código
Chega de papo, e agora, um pouco de código(java) para que você leitor possa entender o que estou tentando falar:
Teremos 3 classes: A interface de busca, a classe que implementa a busca, e a classe que consome a busca.
Interface de busca
public interface SearchState {
List<String> findStateByCountryCode(String countryCode);
}
Agora iremos criar a implementação para essa classe: Ela irá retornar uma lista aleatória de códigos no foramto ISO-3366 Alpha-code 2
@Component
public class SearchStateImpl implements SearchState {
@Override
public List<String> findStateByCountryCode(String countryCode) {
return List.of("br","be");
}
}
E agora, a utilização dessa interface
@Service
@RequiredArgsConstructor
public class SearchStateService {
private final SearchState searchState;
public List<String> searchStates(String countryCode){
return searchState.findStateByCountryCode(countryCode);
}
}
Como pode ver, onde irei usar só preciso chamar sempre a interface, e qualquer linguagem com suporte a injeção de dependências (a maioria), irá realizar a mudança para você.
Concluindo
Sim, eu acredito que para códigos mais flexiveis, em um cenário onde temos diversas bibliotecas e dependências para resolver problemas; sejam eles simples ou complexos, é muito interessante e uma boa prática usarmos interfaces.
Com certeza, se eu soubesse isso antes, teria escrito códigos melhores rsrsrsrsrsrs