Abstração em OOP: Ocultando a Complexidade
Você dirige um carro usando algumas ações simples. Você pisa no acelerador. Você vira o volante. Você pisa no freio.
Você não precisa saber como o combustível entra no motor. Você não precisa entender como os pistões se movem ou como as marchas mudam. O carro esconde esses detalhes de você. Você usa uma interface simples para controlar uma máquina complexa.
O software funciona da mesma maneira.
Pense em enviar um e-mail. Você chama um único comando: emailService.send().
Nos bastidores, muitas coisas acontecem:
- O sistema valida o endereço.
- Ele cria uma conexão SMTP.
- Ele se autentica com um provedor.
- Ele constrói a mensagem.
- Ele gerencia tentativas de reenvio caso a primeira falhe.
Você não precisa ver essas etapas. Você só se importa que o e-mail seja enviado.
Se você não usasse abstração, seu código seria assim:
connect()authenticate()buildMessage()sendMessage()disconnect()
Fazer isso todas as vezes cria problemas. Cada parte do seu código sabe demais. Se você mudar seu provedor de e-mail, terá que atualizar cada linha de código que envia e-mails. Seu sistema torna-se difícil de alterar.
A abstração resolve isso. Ela mostra o que um objeto faz, mas esconde como ele funciona.
Você expõe uma interface simples. Quem chama o método permanece focado na tarefa. A implementação permanece oculta. Isso mantém seu código desacoplado e fácil de manter.
As pessoas costumam confundir Abstração com Encapsulamento.
O Encapsulamento pergunta: Quem pode alterar estes dados? Ele protege o estado interno. A Abstração pergunta: Quais detalhes o usuário precisa ver? Ela oculta a complexidade.
Eles trabalham juntos para construir sistemas melhores.
A seguir, veremos Herança. Responderemos a uma pergunta: Se os objetos compartilham comportamento, você precisa escrever o mesmo código duas vezes?