Módulo 13 - Abstração e modularidade: código que dura
Interface e implementação: usar sem saber o como
8 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026
O que você vai aprender
- Distinguir a interface (o contrato público) da implementação (o como interno).
- Entender por que esconder a implementação protege quem usa o módulo.
- Trocar a implementação de um módulo sem alterar sua interface.
- Ligar a ideia de interface ao tipo abstrato de dados visto no início do curso.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Interface e implementação: usar sem saber o como.
Os objetivos desta aula. Distinguir a interface (o contrato público) da implementação (o como interno). Entender por que esconder a implementação protege quem usa o módulo. Trocar a implementação de um módulo sem alterar sua interface. Ligar a ideia de interface ao tipo abstrato de dados visto no início do curso.
Veja o essencial, parte por parte.
O painel e o motor. A interface é o que o módulo oferece: as funções que se pode chamar e o que elas fazem.
Trocar o motor sem trocar o volante. O teste de fogo de uma boa separação é este: consigo trocar a implementação sem que ninguém de fora perceba?
Quando a implementação vaza. Código de fora mexe direto na estrutura interna do módulo, em vez de chamar as funções da interface.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
O painel e o motor
Volte ao começo do curso, ao tipo abstrato de dados. Você viu que uma pilha é um contrato: empilhar, desempilhar, ver o topo. Quem usa a pilha não precisa saber se, por dentro, ela é uma lista ou um vetor. Esse é o coração da abstração, e vale para qualquer módulo. A interface é a face pública: as funções que você pode chamar e a promessa do que cada uma faz. A implementação é o maquinário por trás, escondido. A analogia do carro é exata: o volante e os pedais são a interface, iguais em quase todo carro; o motor é a implementação, que varia de modelo para modelo sem que você precise reaprender a dirigir.
Esconder a implementação não é frescura de organização. É o que dá liberdade para o autor do módulo. Se ninguém de fora depende dos detalhes internos, o autor pode trocá-los à vontade: deixar o cálculo mais rápido, corrigir um erro, mudar a estrutura de dados. Nada disso quebra quem usa, porque a interface, o contrato visível, continuou a mesma. Quando a implementação vaza (quando quem usa começa a depender de um detalhe interno), essa liberdade some, e qualquer mudança lá dentro passa a arriscar o programa inteiro.
Trocar o motor sem trocar o volante
O teste de fogo de uma boa separação é este: consigo trocar a implementação sem que ninguém de fora perceba? Imagine um módulo que guarda favoritos. A interface oferece adicionar, remover e verificar se algo é favorito. Na primeira versão, por dentro ele usa uma lista simples, e verificar percorre a lista inteira. Um dia, com muitos favoritos, isso fica lento. Você troca a lista por uma tabela hash, que verifica quase na hora. As funções adicionar, remover e verificar continuam com o mesmo nome e o mesmo comportamento visível. Todo o resto do programa nem fica sabendo da troca. Isso só foi possível porque ninguém dependia de a estrutura ser uma lista.
// Interface do módulo de favoritos (o que o resto do programa usa):
// adicionar(id) -> guarda um favorito
// remover(id) -> tira um favorito
// ehFavorito(id) -> devolve verdadeiro ou falso
// Implementação 1: por dentro, uma lista (verificar é lento com muitos itens)
funcao ehFavorito(id)
para cada item em lista faça
se item = id então retorne verdadeiro
fim
retorne falso
fim
// Implementação 2: por dentro, uma tabela hash (verificar é quase instantâneo)
funcao ehFavorito(id)
retorne tabela.contem(id)
fim
// A interface (os nomes e o que fazem) NÃO mudou: quem usa não precisa saber.Duas implementações diferentes de ehFavorito, com a mesma interface. Trocar por dentro não afeta quem chama a função.
🎮 Jogo da aula
Interface ou implementação?
Decida se cada afirmação sobre separar interface de implementação é verdadeira ou falsa.
Quando a implementação vaza
O perigo silencioso é a implementação vazar. Isso acontece quando quem usa o módulo começa a depender de um detalhe que deveria estar escondido. Por exemplo, um módulo devolve os favoritos numa lista, e outra parte do programa passa a contar com a ordem exata dessa lista, ou a mexer diretamente na estrutura interna em vez de chamar as funções da interface. No dia em que o autor troca a lista por uma tabela hash, essa outra parte quebra, mesmo sem ninguém ter tocado nela de propósito. A disciplina é usar sempre a interface e nunca fuçar as tripas. Se a interface não oferece algo de que você precisa, o certo é ampliar a interface com cuidado, não furar a parede.
Teste rápido
Por que esconder a implementação atrás de uma interface deixa o código mais fácil de manter?
Perguntas frequentes
- Qual a diferença simples entre interface e implementação?
- A interface é o que o módulo oferece para fora: os nomes das funções e o que cada uma faz. A implementação é como ele faz isso por dentro. Pense no carro: volante e pedais são a interface; o motor é a implementação. Você usa o primeiro sem precisar entender o segundo.
- Isso é o mesmo que o tipo abstrato de dados do início do curso?
- É a mesma ideia num nível mais geral. O tipo abstrato de dados aplica interface e implementação a uma estrutura (a pilha, a fila): define o contrato sem dizer como é feito por dentro. Aqui você estende esse princípio para qualquer módulo, não só estruturas de dados.
- Por que é ruim depender dos detalhes internos de um módulo?
- Porque tira a liberdade de melhorar o módulo. Se o resto do programa conta com um detalhe interno, qualquer mudança lá dentro quebra tudo, mesmo uma correção ou uma melhoria de velocidade. Dependendo só da interface, o interior pode mudar à vontade sem risco para quem usa.
- O que é uma implementação vazando?
- É quando quem usa o módulo começa a depender de algo que deveria ficar escondido, como a estrutura interna ou a ordem exata dos dados. A parede que separava o de fora do de dentro fica furada. Aí uma mudança interna, que deveria ser inofensiva, passa a quebrar o programa.
- Como faço uma boa interface?
- Mantenha-a pequena, clara e estável. Ofereça só o que quem usa realmente precisa, com nomes que digam o que a função faz. Quanto menos a interface expõe, mais liberdade você tem por dentro. E evite mudar a interface depois de pronta, porque mudá-la afeta todos que dependem dela.
- Preciso esconder tudo o tempo todo?
- O objetivo é esconder os detalhes que podem mudar e expor só o contrato estável. Nem tudo precisa de parede, mas quando um módulo tem uma parte interna que pode evoluir, vale guardá-la atrás da interface. O bom senso é esconder o que é detalhe e mostrar o que é promessa.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.