Programação orientada a objetos (POO) é um paradigma que organiza o código em torno de objetos, entidades que combinam dados (atributos) e comportamentos (métodos). Segundo a Wikipedia, trata-se de um modelo baseado na abstração digital do mundo real. Dominar seus conceitos fundamentais é o primeiro passo para escrever software mais modular, reutilizável e de fácil manutenção. Abaixo, os 7 pilares que sustentam a POO, do mais básico ao mais estratégico.
1. Classes
Uma classe é o molde que define a estrutura e o comportamento de um conjunto de objetos. Ela especifica quais atributos (dados) e métodos (funções) os objetos daquele tipo terão. Por exemplo, uma classe Carro pode ter atributos como cor e velocidade, e métodos como acelerar() e frear(). Em linguagens como Java e Python, a classe é declarada com a palavra-chave class. Sem classes, não há como criar objetos de forma consistente.
2. Objetos
Objetos são instâncias concretas de uma classe. Enquanto a classe é o projeto, o objeto é a realização prática na memória. Usando o exemplo anterior, meuCarro seria um objeto da classe Carro, com valores específicos para cada atributo (cor = "azul", velocidade = 0). Cada objeto ocupa um espaço próprio na memória e pode ter estado diferente dos demais. A interação entre objetos é o que move o sistema.
3. Encapsulamento
Encapsulamento é o mecanismo que esconde os detalhes internos de um objeto e expõe apenas uma interface controlada. Atributos são geralmente declarados como privados (private) e acessados por métodos públicos (getters e setters). Isso protege os dados contra alterações indevidas e reduz o acoplamento entre partes do código. Um exemplo: ao invés de alterar diretamente o atributo saldo de uma conta bancária, usa-se o método depositar(), que valida o valor antes de aplicar.
4. Herança
Herança permite que uma classe (filha) reutilize atributos e métodos de outra classe (pai). Por exemplo, uma classe Moto pode herdar da classe Veiculo os atributos velocidade e combustivel, e adicionar o método empinar(). Isso evita repetição de código e estabelece uma hierarquia natural. Linguagens como Java e C# suportam herança simples; C++ permite múltipla. O cuidado está em não criar cadeias muito profundas, que dificultam a manutenção.
5. Polimorfismo
Polimorfismo é a capacidade de um objeto assumir várias formas, ou seja, de métodos com o mesmo nome se comportarem de maneiras diferentes conforme a classe. O exemplo clássico é o método emitirSom(): em uma classe Cachorro, ele late; em Gato, mia. Isso permite escrever código genérico que funciona com qualquer subtipo, como chamar emitirSom() em um array de Animal sem saber qual subclasse está sendo executada. O polimorfismo é implementado via herança ou interfaces.
6. Abstração
Abstração consiste em modelar apenas os aspectos essenciais de um objeto, ignorando detalhes irrelevantes para o contexto. Uma classe abstrata ou interface define o que o objeto faz, mas não como faz. Por exemplo, uma interface Imprimivel pode declarar o método imprimir(), sem implementá-lo. Cada classe concreta (como Relatorio ou Contrato) implementa o método à sua maneira. A abstração reduz a complexidade e facilita a troca de implementações sem afetar o resto do sistema.
7. Acoplamento
Acoplamento mede o grau de dependência entre classes ou módulos. Idealmente, o acoplamento deve ser baixo: cada classe deve saber o mínimo possível sobre as outras. Alto acoplamento torna o código frágil, uma mudança em uma classe pode quebrar várias outras. Para reduzir o acoplamento, usa-se injeção de dependência, interfaces e padrões como o Observer. Um exemplo prático: em vez de uma classe Pedido instanciar diretamente um EmailService, ela recebe o serviço por parâmetro, permitindo trocar a implementação sem alterar o Pedido.
FAQ
Qual a diferença entre classe e objeto?
Classe é o molde que define atributos e métodos; objeto é a instância concreta desse molde na memória. Uma classe pode gerar infinitos objetos, cada um com seu próprio estado.
O que é encapsulamento em POO?
Encapsulamento esconde os detalhes internos de um objeto e expõe apenas uma interface controlada, geralmente usando modificadores de acesso como private e métodos públicos. Isso protege os dados e reduz o acoplamento.
Herança múltipla é permitida em todas as linguagens?
Não. Linguagens como Java e C# só permitem herança simples (uma classe filha herda de uma única classe pai). C++ e Python, por outro lado, suportam herança múltipla, mas exigem cuidado com o problema do diamante.
Polimorfismo e sobrecarga são a mesma coisa?
Não. Polimorfismo (ou sobrescrita) permite que uma subclasse redefina um método da superclasse. Sobrecarga ocorre quando métodos com o mesmo nome têm parâmetros diferentes, dentro da mesma classe.
Como reduzir o acoplamento entre classes?
Use interfaces e injeção de dependência: em vez de uma classe instanciar outra diretamente, receba a dependência por parâmetro. Isso permite trocar implementações sem modificar a classe dependente.
Abstração é o mesmo que encapsulamento?
Não. Abstração foca em modelar apenas o essencial, ignorando detalhes; encapsulamento foca em esconder a implementação. Ambos trabalham juntos: a abstração define a interface, e o encapsulamento a protege.


