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

OI Iago, Eu tenho estudado e aplicado Clean Arch nos últimos meses, se quiser trocar umas figurinhas pode me chamar. https://www.linkedin.com/in/franklin-goncalves28/

Um curso prático e bem direto ao ponto que pode te ajudar é o curso e livro do Otavio Lemos https://www.linkedin.com/in/otaviolemos/ https://www.youtube.com/@otaviolemos/videos https://thewisedev.com.br/

Link para comprar o livro https://www.otaviolemos.com.br/

Olá Franklin, muito obrigado pelo comentário. Uma dúvida, o curso do Otavio Lemos em termos de aplicaçao prática: foca em frontend ou backend? Poderia dar mais detalhes.
Backend https://github.com/otaviolemos/thewisepad-core É um app de notas