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.

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.

Uma caixa fechada rotulada Módulo. Na parede de fora, três botões visíveis formam a interface, com rótulos empilhar, desempilhar e ver o topo. Dentro da caixa, escondido atrás da parede, engrenagens e uma lista representam a implementação. Uma pessoa do lado de fora aperta os botões sem enxergar as engrenagens; uma seta mostra que a implementação pode ser trocada sem mudar os botões.
Os botões de fora são a interface; as engrenagens de dentro são a implementação, que pode mudar sem afetar quem aperta os botões.

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.