Design de software

Abstração e encapsulamento em OOP: entenda de vez

Ao estudar programação orientada a objetos (OOP), há um obstáculo inevitável.

3 min de leitura
Imagem de capa de Abstração e encapsulamento em OOP: entenda de vez

Abstração e encapsulamento: ainda confunde? Vou esclarecer

Ao estudar programação orientada a objetos (OOP), há um obstáculo inevitável.

São a abstração e o encapsulamento.

Os dois conceitos parecem quase sinônimos. Quando alguém pergunta numa entrevista “qual é a diferença entre abstração e encapsulamento?”, é fácil responder de forma vaga.

Vou direto ao ponto.

Abstração define “o que mostrar” sob a perspectiva do design; encapsulamento define “como ocultar” sob a perspectiva da implementação.

Entendendo esta frase, você já percorreu metade do caminho. Agora vamos consolidar o restante com exemplos.

O que é abstração?

Abstração é ocultar a complexidade interna e expor apenas a essência necessária.

Pense em um carro. Ao dirigir, não precisamos saber como o motor provoca a combustão do combustível.

Volante, pedais e câmbio. Conhecendo essa interface, já podemos dirigir.

Em outras palavras, abstração é decidir o que expor ao motorista.

No código, isso pode ser representado assim.

protocol Coffee {
    func brew()
}

struct Americano: Coffee {
    func brew() {
        print("Prepara um americano")
    }
}

let menu: Coffee = Americano()
menu.brew()
// Saída: prepara um americano

Quem usa conhece apenas a essência: brew(). Como moer os grãos e ajustar a temperatura da água não importa.

Isso é abstração.


O que é encapsulamento?

Encapsulamento reúne os dados e as funções que os manipulam, impedindo o acesso direto externo.

O ponto central é ocultar e proteger.

Pense em uma conta bancária. Seria um desastre se qualquer pessoa pudesse alterar o saldo diretamente.

Por isso, ocultamos o saldo e permitimos alterações apenas por caminhos definidos, como depósito e saque.

class Account {
    private var balance = 0

    func deposit(_ amount: Int) {
        guard amount > 0 else { return }
        balance += amount
    }

    func getBalance() -> Int {
        return balance
    }
}

let acc = Account()
acc.deposit(1000)
print(acc.getBalance())
// Saída: 1000

Bloqueamos balance com private. Externamente, só é possível alterar o valor pela porta definida, deposit.

Ocultar o interior e controlar o acesso dessa forma é encapsulamento.


Então, qual é a diferença decisiva?

Em resumo:

Categoria Abstração Encapsulamento
Objetivo Ocultar a complexidade e expor apenas a essência Ocultar e proteger os dados
Perspectiva Perspectiva de design (o quê) Perspectiva de implementação (como)
Pergunta “O que mostrar?” “Como ocultar?”
Meio Interface, classe abstrata Modificadores de acesso (como private)

Vou destacar o ponto que mais confunde.

A confusão surge porque ambos envolvem ocultar algo.

Mas o que é ocultado é diferente.

A abstração oculta processos complexos (lógica) para simplificar o uso. Já o encapsulamento oculta dados (estado) para protegê-los com segurança.

Protocolos de café e classe de conta: a relação ilustrada deixa tudo claro
Protocolos de café e classe de conta: a relação ilustrada deixa tudo claro

Quando devemos nos preocupar com cada um?

Na prática, usamos os dois juntos; o que muda é o foco.

  • Ao projetar a interface de uma nova funcionalidade → concentre-se na abstração
  • Ao garantir a integridade do estado interno de uma classe → concentre-se no encapsulamento
  • Ao definir a API a ser exposta aos colegas → abstração
  • Ao gerenciar valores com segurança e sem bugs → encapsulamento
Esta frase ao programar já pode mudar sua perspectiva
Esta frase ao programar já pode mudar sua perspectiva

É assim que perguntam em entrevistas

P. Explique a diferença entre abstração e encapsulamento.

O ponto central é a diferença de perspectiva. Abstração é um conceito de design que oculta detalhes desnecessários e revela apenas a essência; encapsulamento é um conceito de implementação que oculta dados e restringe o acesso. Também vale acrescentar que a abstração é realizada por interfaces, enquanto o encapsulamento usa modificadores de acesso.

P. Por que o encapsulamento é necessário?

Se o exterior alterar diretamente o estado de um objeto, a integridade dos dados pode ser comprometida. Permitir mudanças apenas por métodos definidos concentra a lógica de validação em um só lugar e facilita a manutenção e a depuração.


Os conceitos não são opostos, mas parceiros. Se os exemplos de hoje fizeram sentido, ao escrever o próximo código pergunte-se: “O que estou mostrando e o que estou ocultando?” Assim, OOP ficará muito mais clara.

Leituras recomendadas